Go 服务如何优雅地重启或停止

发布时间: 更新时间: 总字数:357 阅读时间:1m 作者: IP上海 分享 网址

Go 服务如何优雅地重启或停止

如何优雅退出

kubernetes 中,平滑退出应用的顺序如下:

  • 监听并捕获 SIGTERM 信号
    • k8s pod 应用的主进程 PID 为 1,至少要能接收的信号量
  • 停止接受新的连接
    • k8s 中存在两种 healthcheck 探针,参考
      • LivenessProbe 判断容器是否存活,若不健康,则 kubelet 将杀死容器,并根据容器的启动策略做相应的处理
      • ReadinessProbe 用于判断容器是否启动完成(ready 状态),若 ready 则接受请求,若失败则不
  • 完成已经存在的活跃请求
  • 关闭keepalive
  • 退出服务

原生实现方式

http 实现

如果你使用的是 Go 1.8 可以使用 http.Server 内置的 Shutdown() 方法优雅地关机

signal + context 实现

通过 signal + context 实现,参考

  • 使用 signal.Notify 监听 SIGINTSIGTERM 信号,这两个信号通常用于请求程序终止
  • srv.Shutdown(ctx); 主动关闭服务

第三方实现方式

  • endless
  • manners:可以优雅关机的 Go Http 服务器
  • graceful:Graceful 是一个 Go 扩展包,可以优雅地关闭 http.Handler 服务器
  • grace:Go 服务器平滑重启和零停机时间部署
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数