Docker部署Consul服务注册成功但GRPC/HTTP健康检查全失败求助
问题产生原理
本次gRPC健康检查失败的直接原因是配置格式不符合Consul规范
Consul内置的gRPC健康检查基于标准gRPC健康检查协议实现,配置AgentServiceCheck的GRPC字段时,仅需填写主机:端口格式的内容,Consul会自动拼接标准健康检查路径/grpc.health.v1.Health/Check发起请求。你之前填写127.0.0.1:8880/health时,Consul会把/health作为地址后缀拼接在请求路径中,无法匹配你代码中注册的grpc_health_v1健康服务端点,因此检查失败。去掉路径后缀后配置符合规范,健康检查自然恢复正常。你此前换IP、HTTP服务检查也失败的核心原因是Docker网络隔离
你用默认桥接模式启动Consul容器时,容器内的127.0.0.1指向容器自身的回环地址,而非宿主机的回环地址,容器默认也无法直接通过宿主机的局域网IP访问宿主机上的服务,因此不管是访问127.0.0.1还是192.168.0.152都会失败。
同类健康检查失败通用排查方案
- 先核对健康检查配置规范
- gRPC检查:
GRPC字段仅填主机:端口,不要额外加路径,如需检查指定服务可通过Service字段配置,TLS开关通过GRPCUseTLS控制 - HTTP检查:
HTTP字段必须填写完整URL,包含http/https前缀和请求路径 - TCP检查:
TCP字段仅填主机:端口即可
- gRPC检查:
- 排查网络连通性
进入Consul的运行环境(Docker部署的话执行docker exec -it <consul容器ID> sh进入容器),手动调用健康检查地址验证连通性:- 验证gRPC:
grpcurl -plaintext <配置的gRPC地址> grpc.health.v1.Health/Check - 验证HTTP:
curl <配置的HTTP健康检查地址> - 验证TCP:
telnet <配置的主机> <端口>
若访问失败优先排查:是否用了127.0.0.1导致跨环境访问不通、防火墙/安全组是否开放对应端口、容器网络配置是否符合要求(跨节点访问建议用host网络或者自定义网桥)
- 验证gRPC:
- 排查服务端健康接口可用性
在宿主机本地手动调用健康检查接口,确认接口返回符合要求:gRPC健康检查返回SERVING状态、HTTP健康检查返回2xx状态码。 - 查看Consul检查错误详情
进入Consul Web UI的服务详情页,点击对应健康检查条目即可看到具体错误信息,是连接超时、404还是gRPC方法不存在,根据错误提示定位问题效率更高。
内容的提问来源于stack exchange,提问作者W.W.G
相关产品推荐
相关产品推荐

