
jacker_hbl
V1
2023/03/22阅读:36主题:默认主题
golang 服务优雅启停
服务优雅启停

服务优雅启停是指服务在关闭之前,做一些善后的工作,比如等待任务结束,释放连接资源等。
实现
下面是一个http服务的示例:
type Handler struct {
}
func (h *Handler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
time.Sleep(60 * time.Second)
fmt.Fprintf(writer, "hello world")
fmt.Println(time.Now().Unix())
}
func main() {
server := http.Server{Addr: ":8080", Handler: &Handler{}}
go func() {
server.ListenAndServe()
}()
// 等待10s后关闭server
time.Sleep(10 * time.Second)
server.Shutdown(context.Background())
}
10s后会调用Shutdown
关闭服务,这个时候发起http请求会返回:

在服务关闭之前发起的请求,在Shutdown
执行之后会等待请求处理完成:

在服务处理请求完成之前,强行关闭服务,客户端会报错,这样就会影响服务运行。

在上面代码的基础上加上优雅启停的逻辑,代码如下:
type Handler struct {
}
func (h *Handler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
time.Sleep(60 * time.Second)
fmt.Fprintf(writer, "hello world")
fmt.Println(time.Now().Unix())
}
func main() {
server := http.Server{Addr: ":8080", Handler: &Handler{}}
go func() {
server.ListenAndServe()
}()
waitExit(func() {
fmt.Println("graceful stop")
server.Shutdown(context.Background())
})
}
func waitExit(fn func()) {
sigl := make(chan os.Signal, 1)
signal.Notify(sigl, os.Interrupt)
select {
case <-sigl:
fn()
}
}
效果:强行关闭服务,会无法再提供http服务,同时等待已经发起的connect
执行完毕后退出程序。

总结
服务优雅启停目的是对服务正在进行的请求或者执行重要任务等待正常结束,同时停止接收新的请求。
作者介绍

jacker_hbl
V1
我是学生,V我50