Consul 的健康检查机制有哪些类型?怎么配置?
Consul 通过健康检查机制实时感知服务状态,在服务不可用时自动将其从可用列表中剔除。面试中常考检查类型和配置方式。
六种健康检查类型
Script 检查:执行脚本,退出码 0 为健康,1 为警告,其他为失败。适合自定义逻辑(如检测磁盘使用率)。
HTTP 检查:向端点发 GET 请求,2xx 为健康,429 为警告,其余为失败。最常用,REST API 服务几乎都用它。
TCP 检查:尝试建立 TCP 连接,成功即健康。适合数据库、Redis 等无 HTTP 接口的服务。
gRPC 检查:调用 gRPC 健康检查协议(grpc.health.v1.Health),适合 gRPC 微服务场景。
TTL 检查:被动检查,服务必须定期调 API 上报状态,超时未上报则标记为 critical。适合批处理任务或长连接服务。
Docker 检查:在容器内执行命令,借助 Docker exec API 运行。适合容器化部署的服务。
关键配置参数
json{ "check": { "http": "http://localhost:8080/health", "interval": "10s", "timeout": "5s", "successes_before_passing": 2, "failures_before_critical": 3, "deregister_critical_service_after": "5m" } }
核心字段:interval(检查间隔)、timeout(超时时间)、successes_before_passing(连续成功几次才恢复)、failures_before_critical(连续失败几次才标记 critical)、deregister_critical_service_after(critical 持续多久后自动注销)。
四种健康状态
- passing:正常
- warning:告警,仍可路由
- critical:不可用,流量不再路由
- maintenance:维护模式,人为下线
生产注意事项
检查间隔不宜过短,10-30s 较合理,过短会拖慢 agent。务必配置 failures_before_critical,避免网络抖动导致服务频繁上下线(flapping)。Script 检查需注意安全,生产环境用 enable-local-script-checks 限制脚本来源。
追问:一个服务能绑多个检查吗?
能。一个服务可注册多个 check,任何一个 critical 都会让该服务被标记为不可用。常见做法是同时配 HTTP 检查(业务存活)和 TCP 检查(端口可达),从不同维度验证健康状态。