在微服务容器化部署的场景下,健康检查是容器编排平台判断服务实例是否正常运行的核心依据。Golang作为常用的微服务开发语言,实现符合容器规范的健康检查接口并不复杂,核心是通过HTTP服务暴露标准化的检查端点,同时支持自定义业务维度的检查逻辑。

容器健康检查的基本类型
容器健康检查通常分为两类,两者的作用和使用场景有明显区别:
- 存活检查(Liveness Probe):判断服务进程是否还存活,如果检查失败,容器编排平台会重启容器实例。一般只需要检查服务进程本身是否正常运行,不需要依赖外部资源。
- 就绪检查(Readiness Probe):判断服务是否已经准备好接收流量,如果检查失败,平台会将实例从服务负载均衡中摘除。通常需要检查数据库连接、依赖的第三方服务等是否可用。
基础健康检查接口实现
首先我们需要实现一个最简单的HTTP健康检查接口,满足容器平台的基本探测需求。以下是一个暴露/health/liveness和/health/readiness两个端点的基础示例:
package main
import (
"encoding/json"
"net/http"
)
// 健康检查响应结构体
type HealthResponse struct {
Status string `json:"status"`
Time string `json:"time"`
}
// 存活检查处理函数
func livenessHandler(w http.ResponseWriter, r *http.Request) {
resp := HealthResponse{
Status: "ok",
Time: "2024-01-01T12:00:00Z",
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(resp)
}
// 就绪检查处理函数,默认返回就绪
func readinessHandler(w http.ResponseWriter, r *http.Request) {
resp := HealthResponse{
Status: "ok",
Time: "2024-01-01T12:00:00Z",
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(resp)
}
func main() {
http.HandleFunc("/health/liveness", livenessHandler)
http.HandleFunc("/health/readiness", readinessHandler)
// 启动HTTP服务,监听8080端口
http.ListenAndServe(":8080", nil)
}
自定义业务检查逻辑
基础的就绪检查没有依赖外部资源,实际业务中我们通常需要检查数据库连接、缓存服务、第三方接口等是否可用。以下是集成MySQL数据库连接检查的示例:
package main
import (
"database/sql"
"encoding/json"
"net/http"
"time"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
// 初始化数据库连接
func initDB() error {
var err error
// 连接本地MySQL服务,用户名为root,密码为123456,数据库名为test
db, err = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")
if err != nil {
return err
}
// 设置连接池参数
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(time.Hour)
return nil
}
// 检查数据库连接是否正常
func checkDB() bool {
if db == nil {
return false
}
// 执行简单的查询判断连接是否可用
err := db.Ping()
return err == nil
}
// 带业务检查的就绪检查处理函数
func readinessHandlerWithCheck(w http.ResponseWriter, r *http.Request) {
resp := make(map[string]interface{})
// 检查数据库连接
dbOk := checkDB()
resp["db_status"] = dbOk
resp["time"] = time.Now().Format(time.RFC3339)
if dbOk {
resp["status"] = "ok"
w.WriteHeader(http.StatusOK)
} else {
resp["status"] = "fail"
// 数据库连接失败返回503状态码,告诉容器平台服务未就绪
w.WriteHeader(http.StatusServiceUnavailable)
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(resp)
}
func main() {
// 初始化数据库连接
err := initDB()
if err != nil {
panic("init db failed: " + err.Error())
}
http.HandleFunc("/health/liveness", livenessHandler)
http.HandleFunc("/health/readiness", readinessHandlerWithCheck)
http.ListenAndServe(":8080", nil)
}
适配容器平台的检查配置
实现好健康检查接口后,还需要在Docker和Kubernetes中配置对应的检查规则,才能让平台正确使用我们的检查接口。
Docker容器健康检查配置
在Dockerfile中添加HEALTHCHECK指令,配置存活检查规则:
FROM golang:1.21-alpine AS builder WORKDIR /app COPY . . RUN go build -o health-demo main.go FROM alpine:latest WORKDIR /app COPY --from=builder /app/health-demo . # 配置健康检查,每30秒请求一次/health/liveness接口,超时时间5秒,重试3次失败后标记容器不健康 HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD wget -q --spider http://127.0.0.1:8080/health/liveness || exit 1 EXPOSE 8080 CMD ["./health-demo"]
Kubernetes健康检查配置
在Kubernetes的Pod配置中,通过livenessProbe和readinessProbe字段配置检查规则:
apiVersion: v1
kind: Pod
metadata:
name: golang-microservice
spec:
containers:
- name: app
image: golang-health-demo:latest
ports:
- containerPort: 8080
# 存活检查配置
livenessProbe:
httpGet:
path: /health/liveness
port: 8080
initialDelaySeconds: 10 # 容器启动后10秒开始第一次检查
periodSeconds: 30 # 每30秒检查一次
timeoutSeconds: 5 # 检查超时时间5秒
failureThreshold: 3 # 连续3次失败则重启容器
# 就绪检查配置
readinessProbe:
httpGet:
path: /health/readiness
port: 8080
initialDelaySeconds: 5 # 容器启动后5秒开始第一次检查
periodSeconds: 10 # 每10秒检查一次
timeoutSeconds: 3
failureThreshold: 3 # 连续3次失败则摘除实例
注意事项
在实现和使用健康检查功能时,需要注意以下几点:
- 存活检查不要依赖外部资源,避免外部服务波动导致容器被频繁重启。
- 就绪检查的检查间隔可以比存活检查更短,这样能更快感知服务就绪状态的变化。
- 健康检查接口不要做复杂的业务逻辑,避免接口响应过慢影响检查结果。
- 如果服务有多个依赖项,就绪检查可以返回详细的依赖状态,方便排查问题。
Golang微服务容器健康检查HTTP_health_check修改时间:2026-06-25 09:06:22