gRPC服務(wù)健康檢查:gRPC健康檢查協(xié)議詳解
gRPC健康檢查協(xié)議
健康檢查用于檢測服務(wù)端能否正常處理rpc請求,客戶端對服務(wù)端的健康檢查可以點對點進行,也可以通過某些控制系統(tǒng)(如負載平衡)進行。客戶端可以根據(jù)服務(wù)端返回的狀態(tài)執(zhí)行對應(yīng)的策略。
因為GRPC服務(wù)可以用于簡單的客戶端到服務(wù)端場景和其他控制系統(tǒng)(如負載平衡)的健康檢查,所以gRPC健康檢查協(xié)議借助了gRPC服務(wù)來實現(xiàn)。使用GRPC服務(wù)來實現(xiàn)健康檢查有以下好處:
- 執(zhí)行健康檢查的格式與普通rpc相同,
- 具有豐富的語義,例如每個服務(wù)的健康狀態(tài),
- 能夠重用所有現(xiàn)有的計費、配額基礎(chǔ)設(shè)施等,因此服務(wù)器可以完全控制健康檢查服務(wù)的訪問。
gRPC健康檢查服務(wù)定義
因為gRPC健康檢查協(xié)議是通過gRPC服務(wù)實現(xiàn)的,我們首先看下這個服務(wù)的定義:
客戶端可以通過調(diào)用Check方法(需要設(shè)置截止時)查詢服務(wù)器的運行狀況,客戶端可以通過設(shè)置服務(wù)名稱來檢查對應(yīng)服務(wù)的健康狀況。服務(wù)名稱的格式建議為package_names.ServiceName,例如grpc.health.v1.Health。
服務(wù)端要注冊所有服務(wù)并設(shè)置各個服務(wù)的狀態(tài),包括空服務(wù)名稱及其狀態(tài)。對于接收到的每個請求,如果在配置列表中找到了對應(yīng)服務(wù),需要根據(jù)當(dāng)前服務(wù)情況返回SERVING或NOT_SERVING的狀態(tài)。如果在配置列表沒找到對應(yīng)服務(wù),則返回NOT_FOUND狀態(tài)。
服務(wù)端應(yīng)使用空字符串作為整體健康狀態(tài)的鍵,以便對特定服務(wù)不感興趣的客戶端可以通過空請求查詢服務(wù)的狀態(tài)。服務(wù)端可以只對服務(wù)名稱進行精確匹配也可以實現(xiàn)更復(fù)雜的匹配方式。
如果一次rpc調(diào)用在一段時間后都沒有收到響應(yīng),可以認為服務(wù)端掛了,需要執(zhí)行應(yīng)對服務(wù)端掛掉情況的策略。
客戶端可以調(diào)用Watch方法來使用基于stream方式的健康檢查。服務(wù)器會立即發(fā)回一條代表當(dāng)前服務(wù)狀態(tài)的消息。只要服務(wù)的狀態(tài)發(fā)生變化,就會發(fā)送一條新消息。