3. Envoy 代理基础:Envoy 架构、Listener、Cluster、Endpoint、Filter 链

Envoy 是服务网格数据平面的核心组件,其架构设计直接决定了代理链路的建立效率与首次请求延迟。本章深入剖析 Envoy 的四大核心抽象——Listener、Cluster、Endpoint 与 Filter 链,并揭示它们在代理链路建立过程中的协作机制。

3.1 Envoy 整体架构概览

Envoy 采用现代 C++ 异步事件驱动模型,基于 libevent 和多线程 Worker 架构实现高吞吐与低延迟。其核心设计原则是:将网络流量处理拆解为可组合的抽象层,每一层负责特定的协议转换、路由或过滤逻辑。

架构要点:Envoy 进程内包含一个主线程(Main Thread)和多个 Worker 线程。主线程负责配置管理与热重启,Worker 线程各自持有独立的 Event Loop,处理连接建立、TLS 握手、Filter 链执行等任务。这种设计避免了锁竞争,但首次请求的“冷启动”延迟往往源于 Worker 线程上的配置收敛与连接池初始化。
Envoy 核心架构组件关系图 主线程 (Main Thread) 配置加载 · 热重启 · 统计聚合 Worker 线程池 (默认 = CPU 核心数) Worker 1 Event Loop Worker 2 Event Loop Worker N Event Loop Listener 层 端口监听 · 连接接受 · TLS 终止 · 连接级 Filter Filter 链 (网络层 + HTTP 层) 协议解析 · 路由决策 · 限流 · 故障注入 · 日志 Cluster & Endpoint 层 连接池 · 负载均衡 · 健康检查 · 端点发现 (EDS)

3.2 Listener:流量入口与连接生命周期管理

Listener 是 Envoy 接收外部流量的第一道关卡。每个 Listener 绑定一个 IP:Port,负责监听、接受连接,并将连接分发给对应的 Worker 线程。

Listener 配置属性 作用 对首次请求延迟的影响
address 绑定的 IP 与端口 端口冲突或绑定失败直接导致服务不可用
filter_chains 连接级 Filter 链定义 Filter 数量与复杂度增加握手延迟
listener_filters 连接接受前的预处理(如 TLS 检测) 错误配置可能导致连接被提前丢弃
connection_balance_config 连接在 Worker 间的分发策略 不均衡分发导致部分 Worker 过载
per_connection_buffer_limit_bytes 每个连接的读写缓冲区大小 过小缓冲区增加系统调用次数
延迟诊断提示:首次请求经过 Listener 时,Envoy 需要完成 Listener 配置收敛。如果 Listener 使用动态 xDS 更新,首次连接可能等待配置下发完成,产生额外的 100ms~500ms 延迟。建议在性能敏感场景下使用静态配置预热 Listener。

3.3 Cluster 与 Endpoint:上游服务抽象与负载均衡

Cluster 定义了一组提供相同服务的上游主机集合,而 Endpoint 则是这些主机的具体网络地址。Envoy 通过 Cluster 实现连接池管理、负载均衡与健康检查。

3.3.1 Cluster 的核心配置项

  • 连接池 (Connection Pool):复用上游连接,减少 TCP 握手开销。首次请求时连接池为空,必须新建连接,这是首次请求延迟的主要来源之一。
  • 负载均衡策略:支持 Round Robin、Least Request、Ring Hash、Maglev 等。策略选择影响请求分发效率。
  • 健康检查 (Health Check):主动探测 Endpoint 可用性,剔除异常节点。首次请求可能命中正在启动的 Endpoint,导致连接超时。
  • 端点发现 (EDS):通过 xDS 动态获取 Endpoint 列表。首次请求时若 EDS 尚未完成,请求将被阻塞。

3.3.2 Endpoint 的延迟敏感属性

属性 说明 首次请求延迟关联
address 上游主机 IP:Port DNS 解析延迟(若使用 DNS 类型)
health_status 健康状态(健康/异常/驱逐) 异常 Endpoint 导致连接失败与重试
load_balancing_weight 负载均衡权重 权重过低导致请求被分配到冷 Endpoint
metadata 自定义元数据(如版本、区域) 影响路由决策与 locality 感知
Cluster → Endpoint 连接池与首次请求链路 Envoy Proxy Cluster A 连接池 (初始为空) 首次请求:新建连接 TCP 握手 + TLS 协商 负载均衡 Round Robin / LR Endpoint 实例组 Endpoint 1 10.0.1.10:8080 健康 ✅ Endpoint 2 10.0.1.11:8080 健康 ✅ Endpoint 3 10.0.1.12:8080 异常 ❌ 首次请求连接建立时序 ① 负载均衡选中 Endpoint 1 ② TCP SYN → SYN-ACK → ACK (1 RTT) ③ TLS 握手 (2~3 RTT) → 发送 HTTP 请求

3.4 Filter 链:请求处理管道的构建与执行

Filter 链是 Envoy 实现协议处理与流量治理的核心机制。每个连接或请求经过一系列 Filter 的串联处理,完成协议解析、路由决策、限流、日志记录等操作。

3.4.1 Filter 的分类与执行顺序

Filter 类型 作用层级 典型 Filter 示例 延迟影响
Listener Filter 连接接受前 TLS Inspector、Original Destination 增加连接建立前的检测开销
Network Filter 连接级 TCP Proxy、Rate Limit、RBAC 每个连接执行一次,影响连接建立延迟
HTTP Filter 请求/响应级 Router、CORS、Fault Injection、gRPC-Web 每个请求执行,直接影响请求延迟

3.4.2 HTTP Filter 链的执行流程

当 Envoy 收到一个 HTTP 请求时,Filter 链按配置顺序依次执行。每个 Filter 可以读取、修改或终止请求。Router Filter 是链中最后一个核心 Filter,负责将请求路由到目标 Cluster。

# 典型的 HTTP Filter 链配置片段
http_filters:
  - name: envoy.filters.http.fault          # 故障注入 Filter(用于测试)
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.Fault
      abort:
        http_status: 503
        percentage:
          numerator: 0                       # 生产环境关闭
  - name: envoy.filters.http.router          # 路由 Filter(必须位于最后)
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
性能陷阱:Filter 链中每个 Filter 都会引入额外的处理开销。在首次请求场景中,如果 Filter 链包含多个需要访问外部系统(如限流服务、鉴权服务)的 Filter,将显著增加延迟。建议将轻量级 Filter(如 Header 修改、CORS)放在链前部,将可能阻塞的 Filter(如外部鉴权)放在链后部,或使用异步 Filter 模式。

3.5 代理链路建立的完整时序

理解 Envoy 代理链路建立的完整过程,是诊断首次请求延迟的基础。以下时序展示了从客户端请求到达 Envoy 到请求被转发至上游 Endpoint 的完整链路。

  1. Listener 接受连接:Worker 线程上的 Event Loop 检测到新连接,调用 Listener 的 accept 回调。
  2. Listener Filter 执行:执行 TLS Inspector 等预检测 Filter,确定连接协议类型。
  3. Network Filter 链执行:执行连接级 Filter,如 TCP Proxy 或 Rate Limit。
  4. HTTP 协议解析:Envoy 内置的 HTTP 编解码器解析请求行、Header 和 Body。
  5. HTTP Filter 链执行:依次执行 CORS、Fault Injection、Router 等 Filter。
  6. 路由决策:Router Filter 根据请求的 Host、Path 等匹配 Cluster 路由规则。
  7. 连接池获取/创建连接:检查 Cluster 连接池中是否有可用连接;若无,则新建 TCP 连接。
  8. 负载均衡选端点:根据负载均衡策略从健康 Endpoint 中选中一个目标。
  9. 上游连接建立:执行 TCP 握手、TLS 协商(若启用),发送 HTTP 请求。
  10. 响应返回:上游响应经过 Filter 链反向传递,最终返回客户端。
首次请求延迟关键点:步骤 7 和步骤 9 是首次请求延迟的主要瓶颈。连接池为空时,Envoy 必须完成完整的 TCP 握手(1 RTT)和 TLS 握手(2~3 RTT),加上 Filter 链的处理时间,首次请求延迟通常在 10ms~100ms 之间。后续请求可通过连接池复用,延迟降至亚毫秒级。

Envoy 的架构设计通过异步非阻塞 I/O 和多 Worker 线程实现了高并发处理能力,但首次请求的“冷启动”问题需要开发者从 Listener 预热、连接池预创建、Filter 链精简等角度进行针对性优化。后续章节将深入这些优化策略的具体实现。