2、Envoy代理深度解析:Envoy架构、xDS协议、L4/L7代理能力、热重启机制

Envoy 是服务网格数据平面的核心组件,由 Lyft 于 2016 年开源,后捐献给 CNCF。它并非传统意义上的反向代理(如 Nginx),而是一个面向云原生架构的、可编程的、高性能 L4/L7 代理。理解 Envoy 的内部架构、控制面通信协议(xDS)、多协议代理能力以及热重启机制,是掌握服务网格选型的基础。

2.1 Envoy 整体架构

Envoy 采用单进程多线程架构,主线程负责配置管理和统计收集,工作线程负责处理网络 I/O。其核心组件包括:

  • Listener(监听器):定义 Envoy 如何接收来自下游(客户端)的连接。支持 TCP、UDP、Unix Domain Socket 等。
  • Filter(过滤器):Envoy 的扩展机制,分为 Listener Filter、Network Filter(L4)和 HTTP Filter(L7)。过滤器链是 Envoy 处理流量的核心管道。
  • Cluster(集群):定义 Envoy 如何将流量转发到上游(后端服务)。包含端点(Endpoint)、负载均衡策略、健康检查等配置。
  • Admin Interface(管理接口):提供 HTTP API 用于查看配置、统计信息、日志级别以及触发热重启。
  • Stats(统计):内置高基数统计系统,支持计数器、仪表盘、直方图,可对接 Prometheus、StatsD 等。
架构要点: Envoy 的过滤器链机制使其具备极强的可扩展性。一个请求从进入 Listener 到离开 Cluster,会依次经过多个 Filter 的处理,这为流量治理(如限流、重试、故障注入)提供了灵活的插拔点。
Envoy 内部架构图 主线程 (Main Thread) 配置加载 / xDS 订阅 / Admin API / 统计聚合 / 集群管理 热重启协调 / 日志管理 / 文件系统监听 工作线程池 (Worker Threads - 通常等于 CPU 核心数) Worker 1 Listener 1 (TCP :80) Filter Chain Cluster 1 (Upstream) 连接池 / 负载均衡 Worker 2 Listener 2 (TLS :443) Filter Chain Cluster 2 (Upstream) 连接池 / 负载均衡 Worker N Listener N Filter Chain Cluster N 连接池 / 负载均衡

2.2 xDS 协议:控制面与数据面的通信桥梁

xDS 是 Envoy 与控制面(如 Istio Pilot)之间的一组发现服务(Discovery Service)协议的总称。Envoy 通过 xDS API 动态获取配置,无需重启进程。这是 Envoy 实现“运行时动态配置”的核心能力。

xDS 类型 全称 核心作用 更新频率
LDS Listener Discovery Service 动态下发 Listener 配置(监听端口、过滤器链、TLS 证书等) 中(服务暴露变化时)
RDS Route Discovery Service 动态下发 HTTP 路由规则(域名匹配、流量拆分、Header 修改等) 高(路由规则变更时)
CDS Cluster Discovery Service 动态下发 Cluster 配置(连接超时、负载均衡策略、熔断阈值等) 中(服务拓扑变化时)
EDS Endpoint Discovery Service 动态下发后端实例列表(IP:Port、健康状态、权重等) 高(实例扩缩容、故障时)
SDS Secret Discovery Service 动态下发 TLS 证书、私钥等敏感信息 低(证书轮换时)
关键设计: xDS 采用 gRPC 流式推送 机制。控制面通过 gRPC Stream 持续向 Envoy 推送增量更新(Delta xDS),避免了全量拉取带来的性能开销和配置风暴。Envoy 在收到更新后,会以原子方式应用新配置,确保流量不中断。

2.3 L4 / L7 代理能力对比

Envoy 同时支持传输层(L4)和应用层(L7)代理,但两者的处理模型和适用场景差异显著。

能力维度 L4 (TCP/UDP) 代理 L7 (HTTP/HTTP2/gRPC) 代理
协议感知 无感知,仅转发字节流 完整解析 HTTP 协议(Header、Body、Trailer)
路由能力 基于 IP:Port 或 SNI 基于 Header、Path、Method、Cookie、Query 参数
流量治理 连接数限制、TCP 代理协议 重试、超时、限流、熔断、故障注入、流量镜像、CORS
可观测性 连接级统计(新建、关闭、延迟) 请求级统计(状态码、延迟分位数、请求体大小)
性能开销 极低(零拷贝转发) 中等(需要解析和缓存 HTTP 帧)
典型场景 数据库代理、Redis 代理、TLS 透传 微服务网关、Sidecar 流量治理、API 网关
选型注意: 在服务网格中,Sidecar 通常同时启用 L4 和 L7 代理。对于非 HTTP 流量(如 gRPC-Web、Dubbo),Envoy 通过 L4 过滤器进行透传;对于 HTTP 流量,则启用 L7 HTTP 连接管理器(HCM)进行精细化治理。不要对所有流量都开启 L7 代理,否则会引入不必要的性能损耗。

2.4 热重启机制

Envoy 的热重启(Hot Restart)机制允许在不中断现有连接的情况下升级 Envoy 二进制文件或应用重大配置变更。其核心原理是新老进程共享同一个监听 Socket。

热重启的工作流程如下:

  1. 启动新进程:新 Envoy 进程启动,通过 --restart-epoch 参数指定新的 epoch 编号。
  2. 共享 Socket:新进程通过 Unix Domain Socket 从老进程继承监听 Socket 文件描述符(FD)。
  3. 流量迁移:新进程开始接受新连接,老进程停止接受新连接,但继续处理已有连接。
  4. 优雅关闭:老进程等待所有已有连接处理完毕(或达到最大 Drain 时间),然后退出。
  5. 完成升级:新进程成为唯一运行中的 Envoy 实例。
Envoy 热重启流程 阶段 1:共享 Socket 老进程 (Epoch 0) 持有 FD 新进程 (Epoch 1) 通过 UDS 继承 FD 阶段 2:流量迁移 新进程接受新连接 老进程停止 Accept 老进程处理存量连接 阶段 3:优雅关闭 老进程 Drain 连接 等待超时或连接结束 老进程退出 新进程成为唯一实例 热重启关键参数 • --restart-epoch:指定当前进程的 epoch 编号,用于区分新老进程。 • --drain-time-s:老进程等待存量连接处理完毕的最大时间(默认 5 分钟)。 • --parent-shutdown-time-s:新进程等待老进程退出的最大时间。
生产实践: 在 Kubernetes 环境中,热重启通常用于 Envoy 二进制版本升级。Istio 的 Sidecar 注入器在注入时会设置 --restart-epoch 参数,并通过 preStop 钩子配合热重启的 Drain 机制,确保 Pod 删除时流量无损。注意,热重启不适用于配置变更——配置变更应通过 xDS 动态下发,而非重启进程。