HTTP 動態轉發代理
透過結合 HTTP 過濾器 和 自訂叢集,Envoy 支援 HTTP 動態轉發代理。
這表示 Envoy 可以扮演 HTTP 代理的角色,而無需事先知道所有已設定的 DNS 位址,同時仍保留 Envoy 的絕大多數優點,包括非同步 DNS 解析。
實作方式如下:
如果目標 DNS 主機尚未在快取中,則使用動態轉發代理 HTTP 過濾器來暫停請求。
當解析完成時,Envoy 將開始非同步解析 DNS 位址,解除封鎖任何等待回應的請求。
由於 DNS 位址已在快取中,因此任何未來的請求都不會被封鎖。解析過程與 邏輯 DNS 服務發現類型類似,任何給定時間都只會記住單個目標位址。
所有已知主機都儲存在動態轉發代理叢集中,以便它們可以顯示在 管理輸出 中。
特殊的負載平衡器將根據轉發期間的 HTTP
host
/authority
標頭選擇要使用的正確主機。一段時間未使用的主機將受到 TTL 的限制,該 TTL 將清除它們。
當上游叢集已使用 TLS 環境設定時,Envoy 將自動對已解析的主機名稱執行 SAN 驗證,並透過 SNI 指定主機名稱。
上述實作細節表示在穩定狀態下,Envoy 可以轉發大量的 HTTP 代理流量,而所有 DNS 解析都在背景中非同步進行。
此外,所有其他 Envoy 過濾器和擴充功能都可以與動態轉發代理支援結合使用,包括身份驗證、RBAC、速率限制等。
提示
如需更多組態資訊,請參閱 HTTP 過濾器組態文件。
記憶體使用細節
以下是 Envoy 動態轉發代理支援的記憶體使用細節:
每個已解析的主機/埠配對都使用伺服器全域且在所有工作人員之間共享的固定記憶體量。
位址變更使用讀/寫鎖定內聯執行,不需要重新配置主機。
透過 TTL 移除的主機會在所有活動連線停止引用它們後被清除,並且會重新獲得所有已使用的記憶體。
max_hosts 欄位可用於限制 DNS 快取在任何給定時間將儲存的主機數量。
叢集的 max_pending_requests 斷路器可用於限制等待 DNS 快取載入主機的擱置請求數量。
長時間存在的上游連線可能會在連線仍然開啟時透過 TTL 使底層邏輯主機過期。
上游請求和連線仍受其他叢集斷路器(例如 max_requests)的約束。
目前的假設是,與連線和請求本身相比,連線之間共享的主機數據使用極少的記憶體,因此不值得獨立控制。