登录
首页 >  Golang >  Go教程

Go HTTP 健康检查与优雅关闭:readiness、liveness 和 Shutdown 实战

来源:Golang学习网专题原创

时间:2026-06-12 10:38:50 618浏览 收藏

所属专题:Go 微服务可观测性与故障排查实战

服务重启或发布时,如果 readiness 没有先摘流,或者 Shutdown 没有等待正在处理的请求,线上就会出现随机 502、连接中断和部分写入失败。

Go HTTP 健康检查与优雅关闭:readiness、liveness 和 Shutdown 实战 思维导图

解决方案思路

liveness 判断进程是否活着,readiness 判断能否接流量。收到退出信号后先把 readiness 置为 false,让负载均衡停止转发,再调用 Server.Shutdown 等待存量请求完成。

Go HTTP 健康检查与优雅关闭:readiness、liveness 和 Shutdown 实战 代码讲解图

核心代码示例

ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()

Go HTTP 健康检查与优雅关闭:readiness、liveness 和 Shutdown 实战 运行逻辑图

运行逻辑

发布信号到达后,服务先停止接新流量,再等待 in-flight 请求完成,最后关闭数据库、队列和后台 worker。这个过程要和网关超时、Kubernetes terminationGracePeriod 对齐。

重点观察指标

  • readiness 状态切换时间
  • Shutdown 超时次数和未完成请求数
  • 发布期间 5xx、连接重置和请求耗时

常见误区

  • liveness 和 readiness 返回同一个结果
  • 收到信号后直接 os.Exit
  • Shutdown 超时小于最长业务请求时间

参考方案

落地检查

  • 字段、指标和 Span 名称要稳定,便于长期聚合。
  • 上线前先在灰度环境验证采集成本和数据量。
  • 告警必须能指向 owner、排查入口和回滚方案。
声明:本文转载于:Golang学习网专题原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>