健康检查需区分“进程存活”与“服务可用”,/health仅查自身状态,/health/ready同步检查依赖并限时≤3s,返回标准JSON结构,支持可组合Checker、缓存异步结果及K8s探针集成。
在 Go 微服务架构中,健康检查(Health Check)是保障系统可观测性与弹性的重要机制。它不是简单返回一个 200 OK,而是要真实反映服务的**内部状态**:依赖是否就绪、数据库是否连通、缓存是否可用、队列是否积压等。核心在于——区分“进程存活”和“服务可用”。
遵循 [RFC 8417](https://datatracker.ietf.org/doc/html/rfc8417) 建议,暴露 /health(基础存活)和 /health/ready(就绪,用于负载均衡器探活)两个端点:
/health:只检查自身进程状态(如 goroutine 数量、内存压力),响应快、无副作用/health/ready:同步检查所有关键依赖(DB、Redis、下游服务),超时需明确控制(建议 ≤ 3s)返回结构推荐使用标准字段:status("up"/"down"/"degraded")、checks(各组件详情)、version、timestamp。
避免硬编码逻辑,用函数式设计封装检查项:
type Checker func() (string, error)
func DBChecker(db *sql.DB) Checker {
return func() (string, error) {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
if err := db.PingContext(ctx); err != nil {
return "database", fmt.Errorf("ping failed: %w", err)
}
return "database", nil
}
}
func RedisChecker(client *redis.Client) Checker {
return func() (string, error) {
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
if _, err := client.Ping(ctx).Result(); err != nil {
return "redis", fmt.Errorf("ping failed: %w", err)
}
return "redis", nil
}
}
在 handler 中聚合执行:
func readyHandler(checkers map[string]Checker) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
results := make(map[string]map[string]interface{})
status := "up"
for name, check := range checkers {
start := time.Now()
componentStatus, err := check()
duration := time.Since(start).Milliseconds()
results[name] = map[string]interface{}{
"status": err == nil,
"latency_ms": duration,
"error": err,
}
if err != nil {
status = "down"
}
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]interface{}{
"status": status,
"checks": results,
"timestamp": time.Now().UTC().Format(time.RFC3339),
})
}
}
以 Gin 为例,注册路由并设置超时中间件防止阻塞:
r := gin.Default()
r.Use(func(c *gin.Context) {
c.Next()
if c.Writer.Status() == http.StatusOK &&
strings.HasPrefix(c.Request.URL.Path, "/health/") {
c.Header("Cache-Control", "no-cache, no-store, must-revalidate")
}
})
checkers := map[string]Checker{
"database": DBChecker(db),
"redis": RedisChecker(redisClient),
}
r.GET("/health/ready", readyHandler(checkers))
r.GET("/health", liveHandler()) // liveHandler 只返回 { "status": "up" }
Kubernetes 配置示例(liveness/readiness probe):
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 3
注意:readinessProbe 超时必须短于 periodSeconds,否则会反复失败重启。
对耗时依赖(如第三方 API),避免每次请求都调用。可用 sync.Map 缓存最近一次结果(带 TTL):
type CachedChecker struct {
checker Checker
cache sync.Map // key: string (name), value: cachedResult
}
type cachedResult struct {
status string
err error
at time.Time
}
func (c *CachedChecker) Check(name string) (string, error) {
if val, ok := c.cache.Load(name); ok {
cr := val.(cachedResult)
if time.Since(cr.at) < 10*time.Second {
return cr.status, cr.err
}
}
status, err := c.checker()
c.cache.Store(name, cachedR
esult{status: status, err: err, at: time.Now()})
return status, err
}
适合低频变更、高成本检查项(如证书有效期、配置中心连接)。但数据库/缓存类强依赖仍建议实时检查,避免掩盖瞬时故障。
健康检查不是摆设,而是服务自治的起点。把 “能连上” 和 “能干活” 分开判断,用结构化输出支撑告警与自动扩缩容,微服务才真正具备生产就绪能力。
# redis
# html
# js
# json
# go
# golang
# 编码
# app
# ai
# 路由
# kubernetes
# red
# 架构
# 中间件
# gin
# echo
# 封装
# timestamp
# 接口
# map
# 异步
# 数据库
# http
# https
# 负载均衡
# 均衡器
# 进阶
# 推荐使用
# 为例
# 第三方
# 重启
# 则会
# 连上
# 时需
# 结构化
相关文章:
Python文件管理规范_工程实践说明【指导】
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
官网网站制作腾讯审核要多久,联想路由器newifi官网
广州建站公司哪家好?十大优质服务商推荐
XML的“混合内容”是什么 怎么用DTD或XSD定义
建站之星上传入口如何快速找到?
,南京靠谱的征婚网站?
小程序网站制作需要准备什么资料,如何制作小程序?
如何挑选优质建站一级代理提升网站排名?
如何确保FTP站点访问权限与数据传输安全?
建站主机是否等同于虚拟主机?
建站之星2.7模板快速切换与批量管理功能操作指南
如何快速生成ASP一键建站模板并优化安全性?
如何通过多用户协作模板快速搭建高效企业网站?
如何使用Golang table-driven基准测试_多组数据测量函数效率
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何通过服务器快速搭建网站?完整步骤解析
建站主机是否属于云主机类型?
建站主机SSH密钥生成步骤及常见问题解答?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
如何通过虚拟主机快速完成网站搭建?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
专业网站建设制作报价,网页设计制作要考什么证?
IOS倒计时设置UIButton标题title的抖动问题
TestNG的testng.xml配置文件怎么写
定制建站流程步骤详解:一站式方案设计与开发指南
中山网站制作网页,中山新生登记系统登记流程?
如何在Windows 2008云服务器安全搭建网站?
建站之星如何修改网站生成路径?
SQL查询语句优化的实用方法总结
上海网站制作开发公司,上海买房比较好的网站有哪些?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
如何确认建站备案号应放置的具体位置?
建站org新手必看:2024最新搭建流程与模板选择技巧
Swift中循环语句中的转移语句 break 和 continue
如何制作一个表白网站视频,关于勇敢表白的小标题?
,网站推广常用方法?
css网站制作参考文献有哪些,易聊怎么注册?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
重庆网站制作公司哪家好,重庆中考招生办官方网站?
网页设计网站制作软件,microsoft office哪个可以创建网页?
建设网站制作价格,怎样建立自己的公司网站?
建站之星后台密码如何安全设置与找回?
建站之星如何优化SEO以实现高效排名?
如何零成本快速生成个人自助网站?
常州企业建站如何选择最佳模板?
*请认真填写需求信息,我们会在24小时内与您取得联系。