HTTP過濾器
就像網絡級別的過濾堆棧一樣,Envoy在連接管理器中支持HTTP級別的過濾堆棧。可以編寫過濾器,在不知道底層物理協議(HTTP / 1.1,HTTP / 2等)或多路復用功能的情況下,對HTTP層消息進行操作。有三種類型的HTTP級別過濾器:
解碼器:解碼器過濾器在連接管理器正在解碼請求流的部分(頭部,正文和尾部)時被調用。
編碼器:編碼器過濾器在連接管理器即將編碼部分響應流(標題,正文和預告片)時被調用。
解碼器/編碼器:解碼器/編碼器過濾器在連接管理器正在解碼請求流的部分時以及連接管理器將要對部分響應流進行編碼時被調用。
HTTP級別篩選器的API允許篩選器在不知道底層協議的情況下運行。像網絡級別的過濾器一樣,HTTP過濾器可以停止並繼續迭代到後續的過濾器。這可以實現更複雜的場景,例如運行狀況檢查處理,調用速率限制服務,緩衝,路由,為應用程式流量(例如DynamoDB等)生成統計信息。Envoy已經包含了幾個HTTP級別的過濾器,配置參考。
HTTP路由
Envoy包含一個HTTP路由器過濾器,可以安裝它來執行高級路由任務。這對於處理邊緣流量(傳統的反向代理請求處理)以及構建服務以服務Envoy網格(通常經由主機/權威HTTP頭部上的路由以到達特定的上遊服務集群)是有用的。Envoy也有能力配置為正向代理。在轉發代理配置中,網狀客戶端可以通過將他們的http代理適當地配置為Envoy來參與。在高層次上,路由器接收一個傳入的HTTP請求,將其與上遊集群進行匹配,獲取到上遊集群中主機的連接池,並轉發該請求。路由器過濾器支持以下功能:
將域/權限映射到一組路由規則的虛擬主機。
前綴和精確路徑匹配規則(區分大小寫和不區分大小寫)。正則表達式/ slug匹配當前不被支持,主要是因為它使編程難以/不可能確定路由規則是否相互衝突。由於這個原因,我們不建議在反向代理級別使用正則表達式/段落路由,但是我們可能會根據需求添加支持。
在虛擬主機級別的TLS重定向。
在路由級別的路徑/主機重定向。
顯式主機重寫。
根據所選上遊主機的DNS名稱自動重寫主機。
前綴重寫。
Websocket在路由級別升級。
通過HTTP頭或通過路由配置請求重試。
通過HTTP頭或通過路由配置指定的請求超時。
通過運行時間值將流量從一個上遊群集轉移到另一個上(請參閱流量轉移/分流)。
使用基於權重/百分比的路由(請參閱流量轉移/拆分)跨多個上遊群集進行流量分流。
任意頭匹配路由規則。
虛擬集群規範。虛擬群集在虛擬主機級別指定,由Envoy用於在標準群集級別之上生成附加統計信息。虛擬群集可以使用正則表達式匹配。
基於優先級的路由
基於哈希策略的路由。
非轉發代理支持絕對url。
路由表
HTTP連接管理器的配置擁有所有配置的HTTP過濾器使用的路由表。雖然路由器過濾器是路由表的主要使用者,但是如果他們想根據請求的最終目的地做出決定,其他過濾器也可以訪問。例如,內置的速率限制過濾器參考路由表來確定是否應該基於路由來調用全局速率限制服務。即使決策涉及隨機性(例如,在運行時配置路由規則的情況下),連接管理器也確保所有獲取路由的呼叫對於特定請求是穩定的。
重試語義
Envoy允許在路由配置中以及通過請求頭對特定請求配置重試。以下配置是可能的:
最大重試次數:Envoy將繼續重試任意次數。在每次重試之間使用指數退避算法。此外,所有重試都包含在整個請求超時內。由於大量的重試,這避免了很長的請求時間。
重試條件:Envoy可以根據應用要求在不同類型的條件下重試。例如,網絡故障,所有5xx響應碼,冪等4xx響應碼等
請注意,重試可能被禁用,取決於x-envoy重載的內容。
優先路由
Envoy支持路由級別的優先路由。當前的優先級實現針對每個優先級別使用不同的連接池和斷路設置。這意味著即使對於HTTP / 2請求,兩個物理連接也將被用於上遊主機。未來,Envoy可能會支持真正的HTTP / 2優先級。
目前支持的優先級是默認和高。
gRPC
gRPC是來自Google的RPC框架。它使用協議緩衝區作為基礎的序列化/ IDL格式。在傳輸層,它使用HTTP / 2進行請求/響應復用。Envoy在傳輸層和應用層都有一流的gRPC支持:
gRPC使用HTTP / 2預告片來傳送請求狀態。 Envoy是能夠正確支持HTTP / 2預告片的少數幾個HTTP代理之一,因此是少數可以傳輸gRPC請求和響應的代理之一。
某些語言的gRPC運行時相對不成熟。 Envoy支持gRPC網橋過濾器,允許gRPC請求通過HTTP / 1.1發送給Envoy。然後,Envoy將請求轉換為HTTP / 2傳輸到目標伺服器。該響應被轉換回HTTP / 1.1。
安裝後,網橋過濾器除了統計全局HTTP統計數據之外,還會根據RPC統計信息進行收集。
gRPC-Web由過濾器支持,它允許gRPC-Web客戶端通過HTTP / 1.1向Envoy發送請求並代理到gRPC伺服器。目前正處於積極的發展階段,預計將成為gRPC橋式濾波器的後續產品。
gRPC-JSON代碼轉換器由一個過濾器支持,該過濾器允許RESTful JSON API客戶端通過HTTP向Envoy發送請求並代理到gRPC服務。
WebSocket支持
Envoy支持將HTTP / 1.1連接升級到WebSocket連接。僅當下遊客戶端發送正確的升級頭並且匹配的HTTP路由顯式配置為使用WebSocket(use_websocket)時才允許連接升級。如果一個請求到達啟用了WebSocket的路由而沒有必要的升級頭,它將被視為任何常規的HTTP / 1.1請求。
由於Envoy將WebSocket連接視為純TCP連接,因此它支持WebSocket協議的所有草稿,而與其格式無關。 WebSocket路由不支持某些HTTP請求級別的功能,如重定向,超時,重試,速率限制和陰影。然而,支持前綴重寫,顯式和自動主機重寫,流量轉移和分離。
連接語義
儘管WebSocket升級是通過HTTP / 1.1連接進行的,但是WebSockets代理與普通的TCP代理類似,即Envoy不會解釋websocket框架。下遊客戶端和/或上遊伺服器負責正確終止WebSocket連接(例如,通過發送關閉幀)和底層TCP連接。
當連接管理器通過支持WebSocket的路由接收到WebSocket升級請求時,它通過TCP連接將請求轉發給上遊伺服器。特使不知道上遊伺服器是否拒絕了升級請求。上遊伺服器負責終止TCP連接,這將導致Envoy終止相應的下遊客戶端連接。
集群管理器
Envoy的集群管理器管理所有配置的上遊集群。就像Envoy配置可以包含任意數量的偵聽器一樣,配置也可以包含任意數量的獨立配置的上遊集群。
上遊集群和主機從網絡/ HTTP過濾器堆棧中抽象出來,因為上遊集群和主機可以用於任意數量的不同代理任務。集群管理器向過濾器堆棧公開API,允許過濾器獲得到上遊集群的L3 / L4連接,或者到上遊集群的抽象HTTP連接池的句柄(無論上遊主機是支持HTTP / 1.1還是HTTP / 2被隱藏)。篩選器階段確定是否需要L3 / L4連接或新的HTTP流,並且集群管理器處理所有知道哪些主機可用且健康的負載平衡,上遊連接數據的線程本地存儲的複雜性(因為大多數Envoy代碼被寫為單線程),上遊連接類型(TCP / IP,UDS),適用的上遊協議(HTTP / 1.1,HTTP / 2)等
群集管理器已知的群集可以靜態配置,也可以通過群集發現服務(CDS)API動態獲取。動態集群提取允許將更多配置存儲在中央配置伺服器中,因此需要更少的Envoy重新啟動和配置分配。
集群管理器配置。
CDS配置。