grpc health check

Health checks用于探测服务器是否能够处理rpc请求。客户端到服务器的运行状况检查可以通过点对点或某些控制系统进行。服务器可能未准备好接受请求,正在关闭或其他原因,这时他会选择答复“unhealthy”。如果在某个时间段内未收到响应或响应说不健康,则客户端可以采取相应的措施。

GRPC服务可以用作简单的客户端到服务器方案和其他控制系统(例如负载平衡)的运行状况检查机制。grpc作为一个高级服务有这么些优点:第一,由于它本身是GRPC服务,因此进行健康检查的格式与普通rpc相同。第二,它具有丰富的语义,例如每个服务的健康状态。第三,作为GRPC服务,it is able reuse all the existing billing, quota infrastructure, 因此服务器可以完全控制运行状况检查服务的访问。

服务定义

server端定义类似以下proto:

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方法来查询服务器的运行状况,并且应该给这个rpc上设置deadline。客户端可以自己选择设置要查询的健康状态的服务名称。建议的服务名称格式为package_names.ServiceName,例如grpc.health.v1.Health。

服务器应手动注册所有服务并为他们设置单独的状态,包括空服务名称及其状态。对于收到的每个请求,如果可以在注册表中找到服务名称,则必须以OK状态(200)将响应发送回去,并且相应地将status字段设置为SERVING或NOT_SERVING。如果未注册服务名称,则服务器将返回NOT_FOUND GRPC状态。

服务器应使用空字符串作为服务器总体运行状况的键,以便客户端对特定服务不感兴趣时可以使用空请求查询服务器的状态。服务器可以对服务名称进行精确匹配,而无需任何通配符匹配。但是,服务所有者可以自由地实现客户端和服务器都确认的更复杂的匹配语义。

如果rpc在一段时间后未完成,则客户端可以将服务器声明为不正常。客户端应该能够处理服务器没有运行状况服务的情况。

客户端可以调用Watch方法执行流健康检查。服务器将立即发回一条消息,指示当前服务状态。随后,只要服务的服务状态发生变化,它将随后发送新消息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章