问题背景
在 http
应用程序重启时,如果直接 kill -9
使程序退出,然后在启动,会有以下几个问题:
- 旧的请求未处理完,如果服务端进程直接退出,会造成客户端链接中断(收到
RST
); - 新请求打过来,服务还没重启完毕,造成
connection refused
这些问题会造成不好的客户体验,严重的甚至影响客户业务。所以,我们需要优雅的重启我们的应用。
解决问题 -- 优雅
Github: gracehttp
原理
- 信号机制;
- 子进程继承父进程的资源;
支持功能
- 平滑重启(Zero-Downtime restart server);
- 平滑关闭;
- 多
Server
添加(包含HTTP
、HTTPS
); - 自定义日志组件;
使用指南
添加服务器
// http
srv1 := &http.Server{
Addr: ":80",
Handler: sc,
}
gracehttp.AddServer(srv1, false, "", "")
// https
srv2 := &http.Server{
Addr: ":443",
Handler: sc,
}
gracehttp.AddServer(srv2, true, "../config/https.crt", "../config/https.key")
gracehttp.Run() // 此方法会阻塞,直到所有的 HTTP 服务退出
如上所示,只需创建好 Server
对象,调用 gracehttp.AddServer
添加即可。
添加自定义日志组件
gracehttp.SetErrorLogCallback(logger.LogConfigLoadError)
此处提供了三个 Set*
方法,分别对应不同的日志等级:
- SetInfoLogCallback
- SetNoticeLogCallback
- SetErrorLogCallback
有疑问加站长微信联系(非本文作者)