截止時(shí)間(deadline)
在以前接觸的通信框架中,一般是通過超時(shí)時(shí)間(timeout)來指定客戶端應(yīng)用程序等待完成的時(shí)間(超出該時(shí)間后會以異常結(jié)束)。
與之不同的是,在 gRPC 中使用截止時(shí)間(deadline)。截至?xí)r間以請求開始的絕對時(shí)間來表示(盡管API將它們表示為持續(xù)時(shí)間的偏移),發(fā)起請求的應(yīng)用程序設(shè)置截止時(shí)間,整個(gè)請求鏈需要在截止時(shí)間之前進(jìn)行響應(yīng),否則會拋出異常。
截止時(shí)間和超時(shí)時(shí)間都是為了防止請求產(chǎn)生阻塞,造成大量請求掛起耗盡服務(wù)資源的情況。與超時(shí)時(shí)間不同的是,可以用到請求鏈的整個(gè)生命周期,而不必為每個(gè)請求單獨(dú)設(shè)置。
gRPC 中是沒有默認(rèn)的截至?xí)r間的,這意味著如果客戶端程序在開發(fā)時(shí)沒有指定截止時(shí)間,那么它有可能會無限地等待自己請求的響應(yīng)。(在實(shí)際實(shí)現(xiàn)上可能各種語言會設(shè)置一個(gè)默認(rèn)截止時(shí)間,但由于 grpc 允許多個(gè)服務(wù)串行調(diào)用的特性,這一般也是一個(gè)很大的數(shù)值)。因此建議在開發(fā) gprc 程序時(shí)設(shè)置截止時(shí)間。
取消
在一些場景下,我們還可以主動取消 gRPC 請求,同樣可以避免讓客戶端一直等待。一旦取消 grpc 通信,就不能再進(jìn)行消息傳遞,而且一方已經(jīng)取消的消息也會傳遞到另一方。
錯(cuò)誤處理
當(dāng)發(fā)起 gPRC 調(diào)用時(shí),客戶端會接收成功狀態(tài)的響應(yīng)或者帶有對應(yīng)錯(cuò)誤狀態(tài)的錯(cuò)誤。在編寫客戶端應(yīng)用程序時(shí),需要處理所有潛在的錯(cuò)誤和錯(cuò)誤條件。編寫服務(wù)端應(yīng)用程序也需要處理錯(cuò)誤,并生成適當(dāng)?shù)腻e(cuò)誤狀態(tài)碼。
gRPC 中定義了一組專用狀態(tài)碼,具體如下。
| gRPC狀態(tài)碼 | gRPC信息 | 含義 |
|---|---|---|
| 0 | OK | 成功 |
| 1 | CANCELLED | 操作已被取消 |
| 2 | UNKNOWN | 未知錯(cuò)誤 |
| 3 | INVALID_ARGUMENT | 客戶端參數(shù)非法 |
| 4 | DEADLINE_EXCEEDED | 操作超過了截止時(shí)間 |
| 5 | NOT_FOUND | 請求實(shí)體未找到 |
| 6 | ALREADY_EXISTS | 客戶端試圖創(chuàng)建的實(shí)體已存在 |
| 7 | PERMISSION_DENIED | 調(diào)用者沒有權(quán)限執(zhí)行特定操作 |
| 8 | RESOURCE_EXHAUSTED | 資源已耗盡 |
| 9 | FAILED_PRECONDITION | 操作被拒絕,系統(tǒng)沒有處于執(zhí)行操作所需狀態(tài) |
| 10 | ABORTED | 操作被中止 |
| 11 | OUT_OF_RANGE | 操作超出了合法的范圍 |
| 12 | UNIMPLEMENTED | 該操作未實(shí)現(xiàn) |
| 13 | INTERNAL | 內(nèi)部錯(cuò)誤 |
| 14 | UNAVAILABLE | 服務(wù)當(dāng)前不可用 |
| 15 | DATA_LOSS | 數(shù)據(jù)丟失或損壞 |
| 16 | UNAUTHENTICATED | 客戶端沒有進(jìn)行操作的合法認(rèn)證憑證 |
多路復(fù)用(multiplexing)
gRPC 允許在同一個(gè) gRPC 服務(wù)端運(yùn)行多個(gè) gRPC 服務(wù),也允許多個(gè)客戶端存根(stub)使用同一個(gè)客戶端連接,這種功能叫做多路復(fù)用(multiplexing)。
元數(shù)據(jù)(metadata)
在 gRPC 中信息通過遠(yuǎn)程方法的參數(shù)傳遞,但是有時(shí)候一些與業(yè)務(wù)上下文無關(guān)的數(shù)據(jù)我們并不希望放到參數(shù)中,這時(shí)候就要用的 gRPC 中的元數(shù)據(jù),它的作用和 HTTP 中的報(bào)文頭有些類似,可以用鍵-值對的形式存放一些數(shù)據(jù)。
攔截器(interceptor)
gRPC 中可通過攔截 RPC 執(zhí)行,滿足特定的需求,如日志、認(rèn)證等,這會使用一種名為攔截器的擴(kuò)展機(jī)制。
gRPC 中的攔截器按通信模式可以分為一元攔截器和流攔截器,按照使用的地方可以分為客戶端攔截器和服務(wù)端攔截器。
需要注意的是,并非所有語言都支持 gRPC 攔截器,每種語言的攔截器實(shí)現(xiàn)也有差別。
安全性
gRPC 基于 HTTP/2 通信協(xié)議,支持使用TLS進(jìn)行單向或雙向加密。