健康检查接口必须返回200 ok或503 service unavailable状态码,响应体为轻量json(如{"status":"ok","timestamp":1717023456})或纯文本“ok”,禁止模板渲染、重定向及context.abort()。

健康检查接口该返回什么状态码和内容
Beego 的健康检查接口本质就是普通 HTTP 接口,但必须满足运维侧(如 Kubernetes、Nginx upstream、Consul)的通用约定:成功时返回 200 OK,失败时返回非 200(常见是 503 Service Unavailable),且响应体应为轻量纯文本或简单 JSON,避免模板渲染或大体积数据。
别用 context.Abort() 或重定向——这会干扰探测逻辑;也别依赖 Beego 的 render 模板,它默认加 Content-Type: text/html,而探测器通常期望 text/plain 或 application/json。
- 推荐返回
{"status":"ok","timestamp":1717023456}(JSON)或ok(纯文本) - 若依赖数据库/Redis/外部 API,检查失败时务必返回
503,不能只返回200+ 错误 JSON - Kubernetes 的
livenessProbe默认超时 1 秒,接口耗时超过这个值会被判定为失败
在 Beego 控制器里写一个基础健康检查方法
直接在任意控制器(比如 app/controllers/base.go)中添加方法即可,无需额外路由配置,但需显式注册到路由表。注意 Beego 2.x 使用 NSRouter 或 AddRouter,1.x 则用 AddRouter。
示例(Beego 2.x):
func (c *MainController) Health() {
c.Ctx.ResponseWriter.Header().Set("Content-Type", "application/json; charset=utf-8")
c.Data["json"] = map[string]interface{}{
"status": "ok",
"timestamp": time.Now().Unix(),
"version": beego.AppConfig.String("appname"), // 可选:暴露版本
}
c.ServeJSON()
}
关键点:
- 必须调用
c.ServeJSON(),它会自动设置200状态码并序列化;若要返回503,得手动写:c.Ctx.ResponseWriter.WriteHeader(503) - 别用
c.Data["json"] = ...后再c.TplName = "..."—— 这会触发模板渲染,报错或返回 HTML - 如果项目禁用了
CopyRequestBody,ServeJSON()仍能正常工作,无需额外处理
如何做带依赖检查的健康检查(DB/Redis/HTTP 服务)
真实场景中,“健康”不只是进程存活,还要确认关键依赖可用。Beego 本身不提供内置健康检查中间件,得自己封装逻辑,并控制超时与错误传播。
常见做法是在 Health() 方法内串行或并行探测依赖:
- 数据库:调用
orm.Debug().Raw("SELECT 1").Exec(),并设context.WithTimeout(建议 ≤800ms) - Redis:用
redis.Client.Ping(ctx).Err(),同样加超时 - 下游 HTTP 服务:用
http.DefaultClient.Do(req.WithContext(ctx)),别用无超时的http.Get - 任意一项失败,立即
c.Ctx.ResponseWriter.WriteHeader(503)并返回失败详情(如{"status":"fail","component":"redis","error":"timeout"})
注意:不要在健康检查里做重试——探测器本身会重试;也不要记录大量日志,高频请求下易打爆磁盘。
路由注册和生产环境注意事项
健康检查路径建议固定为 /healthz 或 /health,避免带参数或 session 依赖。注册方式取决于 Beego 版本:
- Beego 2.x:
beego.Router("/healthz", &controllers.MainController{}, "get:Health") - Beego 1.x:
beego.Router("/healthz", &controllers.MainController{}, "get:Health")
生产部署时容易忽略三点:
- Nginx 或 ALB 可能缓存
/healthz响应,务必在 upstream 配置中禁用缓存:proxy_cache_bypass $http_upgrade; - 某些容器平台(如 OpenShift)要求健康检查路径必须可被 unauthenticated 访问,确保没套
beego.InsertFilter的鉴权逻辑 - 如果用了 Beego 的
AutoRender = false全局设置,ServeJSON()依然有效,但c.Data["json"]赋值后必须显式调用它,否则响应为空
最麻烦的其实是超时链路:HTTP 客户端超时、数据库驱动上下文超时、Beego 内部读取 body 超时(MaxMemory 不影响健康检查,但 EnableGzip 若开启可能引入额外开销)——这些都得对齐探测器的 timeout 设置。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











