什麼是 Envoy

Envoy 是一個 L7 代理和通訊匯流排,專為大型現代面向服務的架構而設計。該專案的誕生源於以下信念:

網路應該對應用程式透明。當網路和應用程式問題確實發生時,應該很容易確定問題的根源。

實際上,實現先前所述的目標非常困難。Envoy 嘗試透過提供以下高階功能來做到這一點

獨立於進程的架構: Envoy 是一個獨立的進程,旨在與每個應用程式伺服器並行執行。所有 Envoy 形成一個透明的通訊網格,其中每個應用程式都向本機主機傳送和接收訊息,並且不知道網路拓撲。與傳統的服務對服務通訊函式庫方法相比,獨立於進程的架構具有兩個實質優勢

  • Envoy 可與任何應用程式語言搭配使用。單一 Envoy 部署可以在 Java、C++、Go、PHP、Python 等之間形成網格。面向服務的架構使用多種應用程式框架和語言正變得越來越普遍。Envoy 透明地彌合了差距。

  • 任何使用過大型面向服務架構的人都知道,部署函式庫升級可能非常痛苦。Envoy 可以快速且透明地在整個基礎設施中部署和升級。

L3/L4 篩選器架構: 其核心,Envoy 是一個 L3/L4 網路代理。可插拔的 篩選器 鏈機制允許編寫篩選器來執行不同的 TCP/UDP 代理任務並將其插入主伺服器。已經編寫了篩選器來支援各種任務,例如原始 TCP 代理UDP 代理HTTP 代理TLS 用戶端憑證驗證RedisMongoDBPostgres 等。

HTTP L7 篩選器架構: HTTP 是現代應用程式架構中如此關鍵的元件,因此 Envoy 支援 額外的 HTTP L7 篩選器層。HTTP 篩選器可以插入 HTTP 連線管理子系統,以執行不同的任務,例如 緩衝速率限制路由/轉發、嗅探 Amazon 的 DynamoDB 等。

一流的 HTTP/2 支援: 在 HTTP 模式下運作時,Envoy 支援 HTTP/1.1 和 HTTP/2。Envoy 可以作為雙向的透明 HTTP/1.1 至 HTTP/2 代理運作。這表示可以橋接任何 HTTP/1.1 和 HTTP/2 用戶端及目標伺服器的組合。建議的服務對服務配置在所有 Envoy 之間使用 HTTP/2,以建立可以多路傳輸請求和回應的持續連線網格。

HTTP/3 支援(目前為 Alpha 版): 從 1.19.0 開始,Envoy 現在支援 HTTP/3 上游和下游,並且可以在任一方向上的 HTTP/1.1、HTTP/2 和 HTTP/3 的任何組合之間進行轉換。

HTTP L7 路由: 在 HTTP 模式下運作時,Envoy 支援 路由 子系統,該子系統能夠根據路徑、授權、內容類型、執行時間 值等來路由和重新導向請求。此功能在使用 Envoy 作為前端/邊緣代理時最有用,但在建置服務對服務網格時也會加以利用。

gRPC 支援: gRPC 是 Google 的 RPC 框架,它使用 HTTP/2 或更高版本作為底層多路傳輸。Envoy 支援 作為 gRPC 請求和回應的路由和負載平衡基礎所需的全部 HTTP/2 功能。這兩個系統非常互補。

服務探索和動態設定: Envoy 可以選擇性地取用用於集中管理的階層式 動態設定 API。這些層為 Envoy 提供有關以下動態更新:後端叢集中的主機、後端叢集本身、HTTP 路由、接聽插槽和加密材料。對於較簡單的部署,後端主機探索可以 透過 DNS 解析完成(甚至可以 完全跳過),並且其他層由靜態設定檔取代。

健康狀態檢查: 建置 Envoy 網格的 建議 方式是將服務探索視為最終一致的過程。Envoy 包含一個 健康狀態檢查 子系統,它可以選擇性地執行上游服務叢集的主動健康狀態檢查。然後,Envoy 使用服務探索和健康狀態檢查資訊的聯集來判斷健全的負載平衡目標。Envoy 也透過 離群值偵測 子系統支援被動健康狀態檢查。

進階負載平衡: 在分散式系統中,不同元件之間的 負載平衡 是一個複雜的問題。由於 Envoy 是獨立的代理而非函式庫,因此它能夠在單一位置實作進階負載平衡技術,並讓任何應用程式都可以存取這些技術。目前,Envoy 包含對 自動重試斷路器、透過外部速率限制服務的 全域速率限制請求陰影離群值偵測 的支援。未來計畫支援請求競爭。

前端/邊緣代理支援: 在邊緣使用相同的軟體有很大的好處(可觀測性、管理、相同的服務探索和負載平衡演算法等)。Envoy 具有使其非常適合作為大多數現代 Web 應用程式使用案例的邊緣代理的功能集。這包括 TLS 終止、HTTP/1.1、HTTP/2 和 HTTP/3 支援,以及 HTTP L7 路由

一流的可觀測性: 如上所述,Envoy 的主要目標是使網路透明化。但是,問題會發生在網路層級和應用程式層級。Envoy 包含所有子系統的健全 統計 支援。statsd(和相容的供應商)是目前支援的統計資訊接收器,但插入不同的資訊接收器不會很困難。統計資訊也可以透過 管理 連接埠檢視。Envoy 也透過第三方供應商支援分散式 追蹤