健康检查
解释了 gRPC 服务器如何暴露健康检查服务,以及如何配置客户端自动检查其连接的服务器的健康状况。
健康检查
解释了 gRPC 服务器如何暴露健康检查服务,以及如何配置客户端自动检查其连接的服务器的健康状况。
概述
gRPC 指定了一个标准的 服务 API (health/v1),用于对 gRPC 服务器执行健康检查调用。已提供此服务的实现,但您负责更新您的服务的健康状态。
在客户端,您可以让客户端自动与其后端服务的健康服务进行通信。这使得客户端能够避免被认为不健康的服务。
服务器端健康服务
gRPC 服务器上的健康检查服务支持两种操作模式
- 对
Check
rpc 端点进行一元调用- 适用于集中式监控或负载均衡解决方案,但无法扩展以支持大量 gRPC 客户端持续执行健康检查
- 通过使用
Watch
rpc 端点进行流式健康更新- 由 gRPC 客户端中的客户端健康检查功能使用
在服务器上启用健康检查服务涉及以下步骤
- 使用提供的健康检查库创建一个健康检查服务
- 将健康检查服务添加到您的服务器。
- 当您的某个服务健康状况发生变化时,通知健康检查库。
- 如果您的服务当前无法接受请求,则状态为
NOT_SERVING
- 如果您的服务可以正常工作,则状态为
SERVING
- 如果您不关心单个服务的健康状况,可以使用空字符串 ("") 来表示整个服务器的健康状况。
- 如果您的服务当前无法接受请求,则状态为
- 确保您在服务器关停时通知健康检查库,以便它可以通知所有连接的客户端。
具体细节因语言而异,请参阅下面的语言支持部分。
启用客户端健康检查
gRPC 客户端可以通过修改通道的 服务配置 来配置对连接的服务器执行健康检查。例如,要监控 foo
服务的健康状况,您可以使用(JSON 格式)
{
"healthCheckConfig": {
"serviceName": "foo"
}
}
请注意,如果您的服务器报告空字符串 ("") 服务的健康状况(表示整个服务器的健康状况),您也可以在此处使用空字符串。
启用健康检查会改变调用服务器的一些行为
- 客户端在建立连接时将额外调用健康检查服务上的
Watch
RPC- 如果调用失败,将进行重试(采用指数退避),除非调用以状态 UNIMPLEMENTED 失败,在这种情况下将禁用健康检查。
- 直到健康检查服务为被调用的服务发送健康状态,请求才会被发送
- 如果健康的服务变得不健康,客户端将不再发送针对该服务的请求
- 如果该服务稍后恢复健康,调用将恢复
- 某些负载均衡策略可以选择禁用健康检查,如果该功能与策略不符(例如
pick_first
就这样做了)
更具体地说,子通道(表示与服务器的物理连接)的状态将根据其连接的服务健康状况经历这些状态。
stateDiagram-v2
[*] --> IDLE
IDLE --> CONNECTING : Connection requested
CONNECTING --> READY : Health check#colon;\nSERVING
CONNECTING --> TRANSIENT_FAILURE : Health check#colon;\nNOT_SERVING\nor call fails
READY --> TRANSIENT_FAILURE : Health check#colon;\nNOT_SERVING
READY --> IDLE : Connection breaks\nor times out
TRANSIENT_FAILURE --> READY : Health check#colon;\nSERVING
note right of TRANSIENT_FAILURE : Allows the load balancer to choose\nanother, working subchannel
同样,如何启用客户端健康检查的具体细节因语言而异,请参阅语言支持部分中的示例。
语言支持
语言 | 示例 |
---|---|
Java | Java 示例 |
Go | Go 示例 |
Python | Python 示例 |
C++ | C++ 示例 |
最后修改于 2024 年 5 月 20 日: 添加 C++ 健康检查示例链接 (#1289) (571730d)