理解 Envoy 的架構

理解 Envoy 的架構對于深入理解 Istio 至關重要,因為 Envoy 是 Istio 數據平面的核心。Envoy 是一個高性能的 C++ 分布式代理,設計為云原生應用和大規模微服務架構的網絡基礎。

以下是 Envoy 架構的關鍵組成部分和核心理念:

核心設計理念:

  1. 進程外架構 (Out-of-Process):?Envoy 作為獨立的代理進程運行,與應用程序進程解耦。這使得它可以為任何語言編寫的應用程序提供通用的網絡功能。

  2. 高性能 (High Performance):

    • 非阻塞 I/O:?完全基于事件驅動和非阻塞的異步處理模型(通常使用 libevent 或類似的庫),能夠在少量線程下處理大量并發連接。

    • 多線程模型:?通常有一個主線程處理協調和信號,多個 Worker 線程處理連接和請求。每個 Worker 線程獨立處理一部分連接,減少了線程間同步的開銷。

  3. L3/L4 和 L7 感知:?Envoy 既能作為 L3/L4 層的網絡代理(如 TCP 代理),也能作為 L7 層的應用代理(如 HTTP/2, gRPC 代理)。

  4. 可擴展性 (Extensibility):?通過過濾器 (Filters)?機制,可以輕松地插入自定義邏輯來處理網絡流量,例如修改頭部、認證、授權、速率限制等。

  5. 動態配置 (Dynamic Configuration):?Envoy 可以通過一組稱為?xDS (Discovery Service)?的 API 從管理服務器(如 Istio 的 Istiod)動態獲取其全部配置,無需重啟即可更新。

  6. 可觀測性 (Observability):?Envoy 從一開始就設計為具有強大的可觀測性,提供詳細的統計數據 (stats)、日志 (logging) 和分布式追蹤 (distributed tracing) 支持。

  7. 最終一致性 (Eventually Consistent):?在大規模分布式系統中,配置的更新是最終一致的,Envoy 的設計能夠很好地適應這一點。

核心架構組件:

下面我們來看一下 Envoy 內部的關鍵組件以及請求是如何流經這些組件的:

  1. Downstream (下游):?指發起請求的客戶端,例如你的服務 A,或者瀏覽器。

  2. Upstream (上游):?指接收請求并提供響應的服務,例如你的服務 B。

  3. Listener (監聽器):

    • 作用:?監聽器是 Envoy 接收下游連接的入口。每個監聽器綁定到一個 IP 地址和端口。

    • 配置:?定義了當連接被接受時如何處理。

    • 核心:?每個監聽器都包含一個或多個過濾器鏈 (Filter Chains)

  4. Filter Chain (過濾器鏈):

    • 作用:?當監聽器接受一個新連接時,它會根據匹配條件(如 SNI、ALPN、源/目標 IP 等)選擇一個過濾器鏈來處理該連接。

    • 組成:?過濾器鏈由一個或多個網絡過濾器 (Network Filters)?組成。

  5. Network Filters (L3/L4 網絡過濾器):

    • 作用:?處理原始字節流和連接級別的事件。它們按順序執行。

    • 常見的網絡過濾器:

      • envoy.filters.network.tcp_proxy:?TCP 代理,將 TCP 流量轉發到上游集群。

      • envoy.filters.network.http_connection_manager?(HCM):?這是最重要的網絡過濾器之一。?它將原始字節流解釋為 HTTP/1.x, HTTP/2, HTTP/3 協議,并管理 HTTP 流的生命周期。HCM 內部有其自己的?HTTP 過濾器鏈

      • envoy.filters.network.tls_inspector:?檢查 TLS 握手中的 SNI 或 ALPN,用于過濾器鏈匹配。

      • envoy.filters.network.rbac:?基于角色的訪問控制。

      • envoy.filters.network.mongo_proxy,?envoy.filters.network.redis_proxy?等:?特定協議的解析和代理。

  6. HTTP Connection Manager (HCM):

    • 作用:?如上所述,它是一個特殊的網絡過濾器,專門用于處理 HTTP 流量。

    • 核心:?HCM 內部包含一個或多個?HTTP 過濾器 (HTTP Filters)

  7. HTTP Filters (L7 HTTP 過濾器):

    • 作用:?處理 HTTP 請求和響應的各個方面,例如讀取/修改頭部、請求體、路由決策、認證、授權等。它們也按順序執行。

    • 常見的 HTTP 過濾器:

      • envoy.filters.http.router?(Router Filter):?這是最重要的 HTTP 過濾器,通常是 HTTP 過濾器鏈中的最后一個。?它的核心任務是根據請求的屬性(如 Host, Path, Headers)和路由配置 (Route Configuration)?將請求路由到合適的上游集群 (Upstream Cluster)

      • envoy.filters.http.jwt_authn:?JWT 認證。

      • envoy.filters.http.rbac:?HTTP 級別的 RBAC。

      • envoy.filters.http.lua:?通過 Lua 腳本擴展功能。

      • envoy.filters.http.wasm:?通過 WebAssembly 插件擴展功能 (Istio 常用)。

      • envoy.filters.http.cors:?CORS 處理。

      • envoy.filters.http.fault:?故障注入。

      • envoy.filters.http.gzip:?壓縮/解壓縮。

  8. Router Filter 和 Route Configuration (路由配置):

    • 作用:?Router 過濾器使用路由配置來決定如何處理一個 HTTP 請求。

    • 路由配置包含:

      • Virtual Hosts (虛擬主機):?根據?Host?頭部匹配。

      • Routes (路由規則):?在虛擬主機內,根據路徑、頭部、查詢參數等匹配請求。

      • Action:?匹配成功后執行的動作,最常見的是將請求轉發到一個或多個集群 (Cluster),但也可能是重定向、直接響應等。

      • Retry Policy (重試策略):?定義失敗請求的重試行為。

      • Timeout (超時):?定義請求超時。

  9. Cluster (集群):

    • 作用:?Cluster 是 Envoy 可以連接的一組邏輯上相似的上游主機(后端服務實例)。

    • 配置:

      • Load Balancing Policy (負載均衡策略):?如 Round Robin, Least Request, Ring Hash 等。

      • Health Checking (健康檢查):?Envoy 會主動對集群中的主機進行健康檢查,并將不健康的主機從負載均衡池中剔除。

      • Outlier Detection (異常點檢測):?根據連續的 5xx 錯誤、延遲等指標,暫時將表現不佳的主機從負載均衡池中移除。

      • Circuit Breaking (熔斷):?限制對上游集群的并發連接數、掛起請求數等,防止雪崩效應。

      • TLS Context:?定義連接到上游主機時使用的 TLS 配置(如客戶端證書、CA 證書等)。

  10. Endpoints / Hosts (端點/主機):

    • 作用:?Cluster 中的具體上游服務實例,通常是 IP:Port。

    • 發現方式:?端點信息可以通過靜態配置,或通過?EDS (Endpoint Discovery Service)?動態發現。

  11. xDS API (動態發現服務):
    Envoy 通過 gRPC 或 REST API 從管理服務器獲取其配置。主要的 xDS 服務包括:

    • LDS (Listener Discovery Service):?獲取監聽器配置。

    • RDS (Route Discovery Service):?獲取 HTTP 路由配置 (由 HCM 內的 Router Filter 使用)。

    • CDS (Cluster Discovery Service):?獲取集群配置。

    • EDS (Endpoint Discovery Service):?獲取集群中各個端點(主機)的信息。

    • SDS (Secret Discovery Service):?獲取 TLS 證書、私鑰等敏感信息。

    • ADS (Aggregated Discovery Service):?將多個 xDS 服務聚合在一個 gRPC 流上,簡化管理和保證更新順序。

請求處理流程概覽 (以 HTTP 為例):

  1. 連接建立:?客戶端 (Downstream) 向 Envoy 的某個 Listener 的 IP:Port 發起 TCP 連接。

  2. Listener 接受:?Listener 接受連接。

  3. Filter Chain 匹配:?根據連接屬性選擇一個 Filter Chain。

  4. Network Filter 處理:?連接流經 Network Filter Chain:

    • 例如,TLS Inspector 可能首先運行。

    • 然后,http_connection_manager?(HCM) 接管。

  5. HCM 處理:?HCM 開始解析 HTTP 協議。

  6. HTTP Filter 處理:?請求流經 HCM 內部的 HTTP Filter Chain:

    • 例如,JWT 認證過濾器檢查 Token。

    • RBAC 過濾器檢查權限。

    • 最后到達 Router Filter。

  7. 路由決策:?Router Filter 根據其 Route Configuration (通過 RDS 獲取) 匹配請求,找到目標 Cluster。

  8. 上游連接:

    • Envoy 從 Cluster (通過 CDS 獲取) 中選擇一個健康的 Endpoint (通過 EDS 獲取),并根據負載均衡策略。

    • Envoy 與選定的 Endpoint 建立上游連接 (可能使用 mTLS,證書通過 SDS 獲取)。

  9. 請求轉發:?Envoy 將 HTTP 請求轉發給上游 Endpoint。

  10. 響應處理:?上游 Endpoint 返回響應。

  11. 響應過濾:?響應數據會反向流經 HTTP Filter Chain (某些過濾器也處理響應) 和 Network Filter Chain。

  12. 響應返回:?Envoy 將最終的響應發送給下游客戶端。

線程模型:

  • Main Thread:?負責初始化、xDS 通信、信號處理、Admin 端點等。

  • Worker Threads:?數量可配置。每個 Worker 線程運行一個事件循環 (event loop),處理分配給它的監聽器上的連接、I/O 事件、執行過濾器鏈等。Worker 線程之間幾乎沒有共享狀態,數據通過線程本地存儲 (TLS - Thread Local Storage,非 Transport Layer Security) 或消息傳遞來處理。這種設計大大減少了鎖競爭,提高了并發性能。

總結:

Envoy 的架構設計使其成為一個功能強大、高性能且高度可配置的代理。其分層的過濾器模型提供了極大的靈活性,而 xDS API 則使其能夠適應動態的微服務環境。理解這些核心組件和它們之間的交互方式,是理解 Istio 如何實現流量管理、安全性和可觀測性的基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79216.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79216.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79216.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android開發-常用布局

在Android應用開發中,布局決定了用戶界面的結構和元素之間的相對位置。選擇合適的布局不僅能夠提升用戶體驗,還能提高代碼的可維護性和靈活性。本文將介紹幾種最常用的Android布局方式,包括LinearLayout、RelativeLayout、ConstraintLayout以…

如何在MySQL中實現類似Redis的PING命令的功能來檢測連接狀態?

要在MySQL中實現類似Redis的PING命令的功能來檢測連接狀態,可以采用以下方法: 方法一:使用簡單的SQL查詢 最直接的方法是通過執行一個簡單的查詢來檢測連接狀態,例如: SELECT 1;如果查詢成功并返回結果(…

Vue 系列之:defineProps、defineEmits、...

defineProps 用于接收父組件傳遞的屬性值。 父組件&#xff1a; <!-- 父組件 --> <template><Child1 str"字符串" :num"num" />-----------------<Child2 str"字符串" :num"num" /> </template><…

windows服務器部署Gitlab

代碼托管,如果對工具功能要求不高,Gitea也可以滿足需要,只是功能相對比較簡單。 通常GltLab是部署在linux服務器上的,windows版本已經不維護了。不過現在windows10 11已經可以實現部署了,一個是windows本機部署linux虛擬機(windows商店直接安裝或者其他虛擬機平臺都可以)…

剖析 FFmpeg:從基本功能到過濾器,實現音視頻處理的靈活性

目錄 1.解復用2 解碼2.1 音頻解碼2.2 視頻解碼 3 修飾3.1 avio3.2 重采樣 4 過濾器4.1 過濾器基本知識4.2 簡單過濾器4.3 復雜濾鏡圖 1.解復用 解復用就是把容器中的媒體流分離出來&#xff0c;方便我們對媒體流處理。 step1&#xff1a;對媒體文件上下文初始化 AVFormatCont…

kafka學習筆記(四、生產者、消費者(客戶端)深入研究(三)——事務詳解及代碼實例)

1.事務簡介 Kafka事務是Apache Kafka在流處理場景中實現Exactly-Once語義的核心機制。它允許生產者在跨多個分區和主題的操作中&#xff0c;以原子性&#xff08;Atomicity&#xff09;的方式提交或回滾消息&#xff0c;確保數據處理的最終一致性。例如&#xff0c;在流處理中…

Missashe計網復習筆記(隨時更新)

Missashe計算機網絡復習筆記 前言&#xff1a;這篇筆記用于博主對計網這門課所學進行記錄和總結&#xff0c;也包括一些個人的理解。正在更新當中…… 第一章 計算機網絡體系結構 考綱內容 (一) 計算機網絡概述 計算機網絡的概念、組成與功能;計算機網絡的分類; 計算機網絡…

PVP鼠標推薦(deepseek)

下面有不懂的自行百度查找&#x1f44d; ?? 以下是幾款在 雙擊性能&#xff08;DBC&#xff09; 和 拖拽點擊&#xff08;DC&#xff09; 方面表現優秀的游戲鼠標推薦&#xff0c;結合了硬件性能、微動壽命以及玩家口碑&#xff1a; 1. 羅技 G102/G203 Lightsync 特點&#…

ABP vNext + EF Core 實戰性能調優指南

ABP vNext EF Core 實戰性能調優指南 &#x1f680; 目標 本文面向中大型 ABP vNext 項目&#xff0c;圍繞查詢性能、事務隔離、批量操作、緩存與診斷&#xff0c;系統性地給出優化策略和最佳實踐&#xff0c;幫助讀者快速定位性能瓶頸并落地改進。 &#x1f4d1; 目錄 ABP vN…

為啥大模型一般將kv進行緩存,而q不需要

1. 自回歸生成的特點 大模型&#xff08;如 GPT 等&#xff09;在推理時通常采用自回歸生成的方式&#xff1a; 模型逐個生成 token&#xff0c;每次生成一個新 token 時&#xff0c;需要重新計算注意力。在生成第 t 個 token 時&#xff0c;模型需要基于前 t-1 個已生成的 t…

3DGS-slam:splatam公式

配套講解視頻&#xff1a;https://www.bilibili.com/video/BV1ZgfBYdEpg/?spm_id_from333.1387.homepage.video_card.click&vd_sourced4c3e747c32049ddd90dcce17208f4e0 1、多維高斯分布公式: 對于多維&#xff08;多變量&#xff09;高斯分布&#xff0c;概率密度函數的…

從Dockerfile 構建docker鏡像——保姆級教程

從Dockfile開始 dockerfile簡介開始構建1、編輯dockerfile2、構建鏡像3、拉取鏡像4、推送到鏡像倉庫 鏡像的優化1、優化的基本原則2、多階段構建 dockerfile簡介 開始構建 1、編輯dockerfile # 使用官方的 Python 3.8 鏡像作為基礎鏡像 FROM python:3.8-slim# 設置工作目錄 …

開元類雙端互動組件部署實戰全流程教程(第2部分:控制端協議拆解與機器人邏輯調試)

作者&#xff1a;那個寫了個機器人結果自己被踢出房間的開發者 游戲邏輯房間結構參考界面 從這張圖我們能看出&#xff0c;該組件按功能結構細分為多個房間&#xff0c;每個房間底注、準入標準不同&#xff0c;對應的控制模塊也有層級區分。常規來說&#xff0c;一個“互動房間…

[特征工程]機器學習-part2

1 特征工程概念 特征工程:就是對特征進行相關的處理 一般使用pandas來進行數據清洗和數據處理、使用sklearn來進行特征工程 特征工程是將任意數據(如文本或圖像)轉換為可用于機器學習的數字特征,比如:字典特征提取(特征離散化)、文本特征提取、圖像特征提取。 特征工程步驟…

[數據庫之十一] 數據庫索引之聯合索引

執行數據庫查詢時&#xff0c;通常查詢條件是多對個屬性進行判斷和約束&#xff0c;對于這種類型的查詢&#xff0c;如果存在多個索引則使用多個索引&#xff0c;或者使用建立在多屬性搜索碼上的索引&#xff0c;這樣能提高查詢效率。 一、使用多個單碼索引 假設數據表 instruc…

增強學習(Reinforcement Learning)簡介

增強學習&#xff08;Reinforcement Learning&#xff09;簡介 增強學習是機器學習的一種范式&#xff0c;其核心目標是讓智能體&#xff08;Agent&#xff09;通過與環境的交互&#xff0c;基于試錯機制和延遲獎勵反饋&#xff0c;學習如何選擇最優動作以最大化長期累積回報。…

PaddlePaddle 和PyTorch選擇與對比互斥

你遇到的錯誤信息如下&#xff1a; RuntimeError: (PreconditionNotMet) Tensors dimension is out of bound.Tensors dimension must be equal or less than the size of its memory.But received Tensors dimension is 8, memorys size is 0.[Hint: Expected numel() * Size…

vison transformer vit 論文閱讀

An Image is Worth 16x16 Words 20年的論文看成10年的哈斯我了 [2010.11929] 一張圖像勝過 16x16 個單詞&#xff1a;用于大規模圖像識別的轉換器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 為什么transformer好訓練&am…

依賴關系-根據依賴關系求候選碼

關系模式R&#xff08;U, F&#xff09;, U{}&#xff0c;F是R的函數依賴集&#xff0c;可以將屬性分為4類&#xff1a; L: 僅出現在依賴集F左側的屬性 R: 僅出現在依賴集F右側的屬性 LR: 在依賴集F左右側都出現的屬性 NLR: 在依賴集F左右側都未出現的屬性 結論1: 若X是L類…

SAP note 3565626 : Baltimore CyberTrust 根證書即將過期

SAP note 3565626 &#xff1a; Baltimore CyberTrust 根證書即將過期 20250512 2025年5月9日 癥狀 您已收到來? SAP Integration Suite/Cloud Integration 服務的通知郵件&#xff0c; 建議 Baltimore CyberTrust 根證書將于 2025 年 5 ? 12 ? 過期&#xff0c;其中 Balt…