3 minutes reading time
本篇文章我来介绍 gRPC 中的健康检查相关的知识。
服务的健康检测一般是指的是检测服务是否正常运行:
gRPC 定义了一个健康检查协议,它允许使用了 gRPC 服务暴露服务器的状态,这样服务的消费者就能获得服务的健康状态。服务器的健康状态是由服务器是否响应非健康状态来确定的。 当服务器还没准备好处理 rpc 请求或者根本没有响应健康探针的请求时,就会发生这种情况。
gRPC 健康检查协议基于 gRPC 定义了 API。下面就是服务定义:
syntax = "proto3";
package grpc.health.v1;
message HealthCheckRequest {
string service = 1;
}
message HealthCheckResponse {
enum ServingStatus {
UNKNOWN = 0;
SERVING = 1;
NOT_SERVING = 2;
}
ServingStatus status = 1;
}
service Health {
rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
}
客户端应该调用 Check 服务来判断服务是否正常运行,并且设置 deadline。客户端可以设置需要查询的服务名称,来返回对应的服务是否正常。
服务器应手动注册所有的服务并单个设置状态,包括空服务名称及其状态。对于收到的每一个请求,从注册表中查询服务的状态并返回。如果未找到,返回 NOT_FOUND 状态。 服务器也可以根据实际的业务逻辑提供更为复杂的状态返回。
客户端还可以调用 Watch 方法执行流的健康检测,服务器会不断的返回服务的健康状态。
在代码中只要通过这几行代码:
healthcheck := health.NewServer()
healthpb.RegisterHealthServer(s, healthcheck)
然后可以手动调用 SetServingStatus 来设置具体的 service 的状态。