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 线程拥有独立的 事件循环、连接池 和 内存池,避免了全局锁竞争。
关键性能约束: Worker 线程之间不共享连接。这意味着如果 Listener 的
accept_handling 策略配置不当(例如 reuse_port 未开启),可能导致 Worker 线程负载不均。在变更门禁压测中,应监控每个 Worker 线程的 CPU 使用率和活跃连接数,识别是否存在“热点 Worker”。