当前位置: 首页 > news >正文

理解 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 如何实现流量管理、安全性和可观测性的基础。

相关文章:

  • C++八股 —— 函数指针与指针函数
  • MySQL连接池不够分配,导致程序获取不到链接
  • Vue3项目中如何实现网页加载进度条。
  • 使用FastAPI微服务在AWS EKS中构建上下文增强型AI问答系统
  • Milvus(18):IVF_PQ、HNSW
  • 大疆无人机搭载树莓派进行目标旋转检测
  • [AI Tools] Dify 工具插件上传指南:如何将插件发布到官方市场
  • 【文件系统—散列结构文件】
  • 基环树(模板) 2876. 有向图访问计数
  • openssl中BIO的使用
  • 在欧拉系统(openEuler)上安装 MySQL 8
  • OpenCV播放摄像头视频
  • 2025年城市规划与互联网技术国际会议(ICUPIT 2025)
  • 生产安全管理系统标杆
  • 【高级IO】多路转接之单线程Reactor
  • Spring Cloud 以Gateway实现限流(自定义返回内容)
  • DVWA靶场保姆级通关教程--06不安全验证机制
  • 安全核查基线-1.LPD服务
  • 构筑芯片行业的“安全硅甲”
  • 教育+AI:个性化学习能否颠覆传统课堂?
  • 呼和浩特推进新一轮国企重组整合:杜绝一项目一公司、一业务一公司
  • 泰特现代美术馆25年:那些瞬间,让艺术面向所有人
  • 新城市志|上海再攻坚,营商环境没有最好只有更好
  • 体坛联播|郑钦文收获红土赛季首胜,国际乒联公布财报
  • 一周文化讲座|城市移民与数字时代的新工作
  • 中俄元首今年首次面对面会谈,达成哪些新的重要共识?