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方法執行流健康檢查。服務器將立即發回一條消息,指示當前服務狀態。隨後,只要服務的服務狀態發生變化,它將隨後發送新消息。