gRPC

gRPC 是 Google 的 RPC 框架。它使用協定緩衝區作為底層序列化/IDL 格式。在傳輸層,它使用 HTTP/2 或更高版本進行請求/響應多路複用。Envoy 在傳輸層和應用層都對 gRPC 提供一流的支援。

  • gRPC 利用 trailers 來傳達請求狀態。Envoy 是少數幾個正確支援 trailers 的 HTTP 代理之一,因此是少數幾個可以傳輸 gRPC 請求和響應的代理之一。

  • 某些語言的 gRPC 執行時間相對不成熟。請參閱 下方,以了解可以幫助將 gRPC 引入更多語言的篩選器概述。

  • gRPC-Web 由 篩選器 支援,該篩選器允許 gRPC-Web 用戶端透過 HTTP/1.1 向 Envoy 發送請求,並被代理到 gRPC 伺服器。它正在積極開發中,預計將成為 gRPC 橋接篩選器 的後繼者。

  • gRPC-JSON 轉碼器由 篩選器 支援,該篩選器允許 RESTful JSON API 用戶端透過 HTTP 向 Envoy 發送請求,並被代理到 gRPC 服務。

gRPC 橋接

Envoy 支援多個 gRPC 橋接器

  • grpc_http1_bridge 篩選器,允許透過 HTTP/1.1 向 Envoy 發送 gRPC 請求。然後,Envoy 將請求轉換為 HTTP/2 或 HTTP/3 以傳輸到目標伺服器。響應會被轉換回 HTTP/1.1。安裝後,除了標準的全局 HTTP 統計數據外,橋接篩選器還會收集每個 RPC 的統計數據。

  • grpc_http1_reverse_bridge 篩選器,允許將 gRPC 請求發送到 Envoy,然後在發送到上游時轉換為 HTTP/1.1。然後,響應在發送到下游時會被轉換回 gRPC。此篩選器還可以選擇管理 gRPC 框架標頭,從而使上游根本不必知道 gRPC。

  • connect_grpc_bridge 篩選器,允許將 Connect 請求發送到 Envoy。然後,Envoy 將請求轉換為 gRPC 以發送到上游。響應會被轉換回 Connect 協定以發回下游。在需要時,HTTP/1.1 請求將升級為 HTTP/2 或 HTTP/3。

gRPC 服務

除了在資料平面上代理 gRPC 之外,Envoy 還將 gRPC 用於其控制平面,在該平面中,它會從 管理伺服器提取設定,並在篩選器中,例如用於 速率限制 或授權檢查。我們將這些稱為 *gRPC 服務*。

在指定 gRPC 服務時,必須指定使用 Envoy gRPC 用戶端Google C++ gRPC 用戶端。我們將在下面討論此選擇的權衡取捨。

Envoy gRPC 用戶端是 gRPC 的最小自訂實作,它利用 Envoy 的 HTTP/2 或 HTTP/3 上游連線管理。服務被指定為常規的 Envoy 叢集,並具有常規的 逾時、重試、端點 探索/負載平衡/故障轉移/負載報告、斷路健全狀況檢查異常偵測。它們與 Envoy 資料平面共享相同的 連線池 機制。同樣,叢集 統計數據 可用於 gRPC 服務。由於用戶端是最小的,因此它不包含進階 gRPC 功能,例如 OAuth2gRPC-LB lookaside。

Google C++ gRPC 用戶端基於 Google 在 https://github.com/grpc/grpc 提供的 gRPC 參考實作。它提供了 Envoy gRPC 用戶端中缺少的高級 gRPC 功能。Google C++ gRPC 用戶端執行其自己的負載平衡、重試、逾時、端點管理等,獨立於 Envoy 的叢集管理。Google C++ gRPC 用戶端還支援 自訂身份驗證外掛程式

建議在大多數情況下使用 Envoy gRPC 用戶端,其中不需要 Google C++ gRPC 用戶端中的進階功能。這提供了設定和監控的簡便性。如果 Envoy gRPC 用戶端中缺少必要的功能,則應改為使用 Google C++ gRPC 用戶端。