本篇文章我来介绍 gRPC 中的健康检查相关的知识。

简介

服务的健康检测一般是指的是检测服务是否正常运行:

  • 是否存在,因为程序逻辑错误或者 OOM 等进程不存在;
  • 存在是否可以正常的响应请求,尽管进程存在但可能因为请求量过大或者程序逻辑错误,导致服务 hang 住,无法正常对外请求。

gRPC 定义了一个健康检查协议,它允许使用了 gRPC 服务暴露服务器的状态,这样服务的消费者就能获得服务的健康状态。服务器的健康状态是由服务器是否响应非健康状态来确定的。 当服务器还没准备好处理 rpc 请求或者根本没有响应健康探针的请求时,就会发生这种情况。

健康服务定义

gRPC 健康检查协议基于 gRPC 定义了 API。下面就是服务定义:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 方法执行流的健康检测,服务器会不断的返回服务的健康状态。

golang

在代码中只要通过这几行代码:

1
2
healthcheck := health.NewServer()
healthpb.RegisterHealthServer(s, healthcheck)

然后可以手动调用 SetServingStatus 来设置具体的 service 的状态。

参考