全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在Golang中实现容器健康检查_使用Readiness和Liveness探针

Liveness探针用/healthz端点检查进程存活,Readiness探针用/readyz端点检查服务就绪;前者轻量无依赖,后者验证外部依赖与初始化状态;均需200表示通过,避免阻塞。

在 Go 应用中实现 Kubernetes 的 ReadinessLiveness 探针,核心是暴露两个独立的 HTTP 端点,分别返回不同语义的健康状态,且逻辑要严格区分:Liveness 判断进程是否“还活着”,Readiness 判断服务是否“可接收流量”。

1. 设计两个独立的健康检查端点

不要复用同一个接口。推荐路径如下:

  • /healthz —— Liveness 探针目标:只检查进程基本可用性(如能否响应 HTTP、goroutine 是否卡死)
  • /readyz —— Readiness 探针目标:检查依赖服务(数据库、缓存、下游 API)、内部初始化状态、连接池是否就绪等

两者都应返回 200 OK 表示通过,非 200(如 503)表示失败。K8s 默认超时 1 秒、失败阈值 3 次,建议在 handler 中避免阻塞或长耗时操作。

2. 实现轻量、无副作用的 Liveness handler

Liveness 必须快、稳、不依赖外部系统。一个典型实现:

http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
    // 只做最基础检查:时间是否正常、内存是否严重告警(可选)
    if time.Since(startTime) < 0 {
        http.Error(w, "clock skew detected", http.StatusInternalServerError)
        return
    }
    w.WriteHeader(http.StatusOK)
    w.Write([]byte("ok"))
})

⚠️ 注意:不要在这里查 DB 或 Redis —— 它挂了应该触发重启(Liveness 失败),而不是让整个探针变慢或误判。

3. 实现依赖感知的 Readiness handler

Readiness 要反映真实服务能力。常见检查项:

  • 数据库连接是否活跃(执行 SELECT 1 或检查连接池状态)
  • Redis 连接是否可 ping,或关键 key 是否可 set/get
  • 配置是否已加载完成(比如从 etcd/viper 加载完毕的标志位)
  • gRPC 依赖服务是否连通(可缓存上次探测结果,避免每次 dial)

示例片段:

var dbReady = atomic.Bool{}
// 启动时异步检查 DB 并设置标志
go func() {
    for i := 0; i < 3; i++ {
        if err := db.Ping(); err == nil {
            dbReady.Store(true)
            return
        }
        time.Sleep(2 * time.Second)
    }
}()

http.HandleFunc("/readyz", func(w http.ResponseWriter, r *http.Request) { if !dbReady.Load() { http.Error(w, "database not ready", http.StatusServiceUnavailable) return } w.WriteHeader(http.StatusOK) w.Write([]byte("ready")) })

4. 在 Kubernetes YAML 中正确配置探针

关键参数要匹配 Go 服务实际行为:

  • livenessProbe:用 httpGet 指向 /healthzinitialDelaySeconds: 10(给应用冷启动留时间)
  • readinessProbe:指向 /readyzinitialDelaySeconds: 5(可比 liveness 更早开始)
  • 两者都建议设 timeoutSeconds: 2periodSeconds: 5,避免默认 1 秒超时导致频繁失败

示例片段:

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 10
  timeoutSeconds: 2
  periodSeconds: 5
readinessProbe:
  httpGet:
    path: /readyz
    port: 8080
  initialDelaySeconds: 5
  timeoutSeconds: 2
  periodSeconds: 5

基本上就这些。重点不是写得多,而是两个探针职责分明:Liveness 守住进程底线,Readiness 把控流量入口。不复杂但容易忽略 —— 很多线上问题其实源于 readiness 检查太松(一直 200 却实际不可用)或太紧(依赖抖动就切走流量)。


# redis  # go  # golang  # ai  # kubernetes  # red  # select  # 接口  # etcd  # 数据库  # http  # 加载  # 连接池  # 在这里  # 可用性  # 得多  # 线上  # 可选  # 挂了  # 重启  # 只做 


相关文章: 深圳网站制作的公司有哪些,dido官方网站?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  网站制作的步骤包括,正确网址格式怎么写?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  c# await 一个已经完成的Task会发生什么  如何在IIS中新建站点并配置端口与IP地址?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  电商网站制作公司有哪些,1688网是什么意思?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  零服务器AI建站解决方案:快速部署与云端平台低成本实践  建站主机默认首页配置指南:核心功能与访问路径优化  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  高防服务器租用指南:配置选择与快速部署攻略  如何在建站主机中优化服务器配置?  如何在建站之星绑定自定义域名?  如何在自有机房高效搭建专业网站?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  临沂网站制作公司有哪些,临沂第四中学官网?  建站之星导航配置指南:自助建站与SEO优化全解析  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何破解联通资金短缺导致的基站建设难题?  如何在万网开始建站?分步指南解析  建站之星代理费用多少?最新价格详情介绍  如何用PHP快速搭建CMS系统?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  建站之星2.7模板快速切换与批量管理功能操作指南  建站之星微信建站一键生成小程序+多端营销系统  XML的“混合内容”是什么 怎么用DTD或XSD定义  公众号网站制作网页,微信公众号怎么制作?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  如何选择香港主机高效搭建外贸独立站?  开源网站制作软件,开源网站什么意思?  创业网站制作流程,创业网站可靠吗?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  如何选择PHP开源工具快速搭建网站?  存储型VPS适合搭建中小型网站吗?  PHP正则匹配日期和时间(时间戳转换)的实例代码  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  建站之星后台管理:高效配置与模板优化提升用户体验  宝塔新建站点为何无法访问?如何排查?  活动邀请函制作网站有哪些,活动邀请函文案?  怎么将XML数据可视化 D3.js加载XML  如何快速使用云服务器搭建个人网站?  建站之星如何一键生成手机站?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  如何实现建站之星域名转发设置? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。