2. Envoy 核心架构回顾:四层/七层代理模型、Listener/Cluster/Route 配置模型、Worker 线程模型

在进入性能瓶颈定位与调优之前,必须对 Envoy 的核心架构有精确的认知。Envoy 并非简单的反向代理,而是一个基于 事件驱动 和 多线程 的 L3/L4/L7 代理。其架构可拆解为三个核心维度:代理模型、配置模型、线程模型。理解这三者之间的交互关系,是后续分析 CPU 热点、内存分配、连接池争用等性能问题的前提。

2.1 四层/七层代理模型

Envoy 同时支持传输层(L4)和应用层(L7)代理,两者在数据路径和资源消耗上存在显著差异。

特性 四层代理 (TCP/UDP) 七层代理 (HTTP/HTTP2/gRPC)
工作层级 传输层 (OSI L4) 应用层 (OSI L7)
数据解析 不解析 payload,仅处理 TCP/UDP 流 解析 HTTP 头部、Body、协议帧
路由依据 源/目的 IP、端口、SNI Host、Path、Header、Cookie、Method
连接池 简单连接转发 HTTP 连接池、多路复用、流控
性能开销 低(零拷贝、无协议解析) 高(协议解析、头部处理、编解码)
典型场景 数据库代理、TLS 透传、UDP 网关 API 网关、服务网格、流量镜像
性能提示: 在变更门禁场景中,如果业务仅需 IP+Port 转发,务必使用 TCP 代理(L4)以避免不必要的 HTTP 解析开销。L7 代理的头部解析和路由匹配是 CPU 密集型操作,在高并发下容易成为瓶颈。

2.2 Listener / Cluster / Route 配置模型

Envoy 的配置模型围绕三个核心概念构建:Listener(监听器)、Cluster(集群)、Route(路由)。这是 Envoy 数据平面的配置骨架。

  • Listener:定义 Envoy 如何接收来自下游的入站连接。每个 Listener 绑定一个 IP:Port,并配置过滤器链(Filter Chain)。
  • Cluster:定义上游服务集群的端点(Endpoint)、负载均衡策略、连接池配置、健康检查等。
  • Route:定义如何将 Listener 接收到的请求匹配并转发到特定的 Cluster。路由规则支持精确匹配、前缀匹配、正则匹配等。

以下是一个典型的静态配置片段,展示了三者之间的引用关系:

static_resources:
  listeners:
  - name: listener_http
    address:
      socket_address: { address: 0.0.0.0, port_value: 10000 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match: { prefix: "/api" }
                route: { cluster: service_api }
              - match: { prefix: "/web" }
                route: { cluster: service_web }
          http_filters:
          - name: envoy.filters.http.router

  clusters:
  - name: service_api
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_api
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: api.example.com, port_value: 8080 }

  - name: service_web
    type: STRICT_DNS
    lb_policy: LEAST_REQUEST
    load_assignment:
      cluster_name: service_web
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: web.example.com, port_value: 8080 }
调优关注点: 在变更门禁中,频繁的配置更新(xDS 推送)可能导致 Listener/Cluster/Route 的热加载。需要关注 listener_manager 和 cluster_manager 的更新耗时,以及旧配置的优雅排空(Drain)过程,避免连接中断。

2.3 Worker 线程模型

Envoy 采用 单进程-多 Worker 线程 架构,这是其高性能的核心。每个 Worker 线程拥有独立的 事件循环、连接池 和 内存池,避免了全局锁竞争。

Envoy Worker 线程模型架构 Main Thread (主线程) 配置加载 / xDS 订阅 / 证书轮换 / 统计管理 / 热重启协调 Worker 0 事件循环 (Event Loop) Listener 0 连接 连接池 (独立) 内存池 (独立) Worker 1 事件循环 (Event Loop) Listener 1 连接 连接池 (独立) 内存池 (独立) Worker N 事件循环 (Event Loop) Listener N 连接 连接池 (独立) 内存池 (独立) 共享内存区 (Shared Memory) 全局统计计数器 / 内存分配器 (tcmalloc) / 热重启状态 I/O 多路复用 (epoll / kqueue) — 非阻塞 Accept & Read/Write
关键性能约束: Worker 线程之间不共享连接。这意味着如果 Listener 的 accept_handling 策略配置不当(例如 reuse_port 未开启),可能导致 Worker 线程负载不均。在变更门禁压测中,应监控每个 Worker 线程的 CPU 使用率和活跃连接数,识别是否存在“热点 Worker”。

2.4 核心架构总结