跳到主要内容

优雅退出

如何有序停止 HTTP 服务?​

h := server.New(server.WithExitWaitTime(10 * time.Second))
h.Engine.OnShutdown = append(h.Engine.OnShutdown, func(ctx context.Context) {
// 发出后台任务停止通知;这里不能假设在途 Handler 已经结束。
})
h.Spin()
收到退出信号
→ readiness=false:标记实例不再适合接收新请求
→ 等待摘流传播:等待网关、负载均衡等感知状态并停止分配新流量
→ Shutdown:停止接收新请求,开始优雅关闭
→ 等待在途请求:等待已接收但尚未完成的请求结束,设定等待上限
→ flush exporter:发送缓冲中的 trace、指标等观测数据,避免退出时丢失
→ 关闭 DB:请求排空后关闭数据库连接池,避免中断仍在使用 DB 的请求
  • Spin: 监听退出信号并触发优雅退出;WithExitWaitTime 设置等待上限,应用需要自行实现 readiness 摘流及传播等待;
  • OnShutdown: 回调并发触发,而且早于框架等待业务退出;这里适合发停止通知,DB 应在请求排空后由进程入口关闭;
  • 长连接: SSE、WebSocket 和大文件传输需要单独的关闭协议;
  • 关闭预算: 必须小于容器平台终止窗口,并为资源清理留出余量;
  • 幂等: 关闭函数允许重复调用,不因部分初始化而 panic;