1. Envoy 架构总览:线程模型、事件驱动机制与核心组件
Envoy 是 CNCF 毕业的高性能七层代理,其架构设计围绕非阻塞事件驱动与多线程协作展开。理解线程模型、事件循环以及三大核心组件(Listener、Cluster、Filter)是调优通信机制与资源画像的前提。本节从宏观架构切入,逐一拆解这些基础模块。
1.1 线程模型:主线程 + Worker 线程池
Envoy 采用 1 个主线程(Main Thread)+ N 个 Worker 线程(Worker Thread) 的对称模型。主线程负责配置管理、证书轮换、统计聚合等控制面任务;Worker 线程各自持有独立的事件循环,处理连接建立、读写事件和 Filter 链执行。这种设计避免了锁竞争,实现了接近线性的性能扩展。
| 线程角色 | 职责范围 | 关键特性 |
|---|---|---|
| Main Thread | xDS 配置订阅、DNS 解析、证书管理、Admin API、统计刷新 | 不处理数据面流量;配置变更通过“热交换”同步给 Worker |
| Worker Thread | Listener accept、连接读写、Filter 链执行、Cluster 负载均衡 | 每个 Worker 独立事件循环;连接通过 SO_REUSEPORT 或内部分发绑定 |
| File Flusher Thread | 异步日志写入、文件刷新 | 避免 Worker 线程因 I/O 阻塞 |
CPU 核数 或 核数 - 1。在 GitOps 场景下,频繁配置更新时需关注主线程的 xDS 处理能力,避免因配置推送积压导致 Worker 空转。
1.2 事件驱动机制:libevent 与事件循环
Envoy 底层基于 libevent 实现跨平台事件驱动。每个 Worker 线程内部运行一个 EventDispatcher,它封装了 libevent 的 event_base,负责监听 socket 可读/可写、定时器、信号等事件。当事件触发时,Dispatcher 调用注册的回调函数,驱动连接状态机与 Filter 链执行。
// 伪代码:Worker 线程事件循环核心逻辑
while (!dispatcher_.isTerminated()) {
// 1. 运行所有待处理的 deferred 任务(如连接关闭回调)
dispatcher_.runDeferred();
// 2. 调用 libevent 事件分发,阻塞等待事件
event_base_loop(event_base_, EVLOOP_ONCE);
// 3. 处理已就绪的 I/O 事件、定时器、信号
dispatcher_.dispatchEvents();
}
1.3 核心组件:Listener、Cluster、Filter
Envoy 的数据面处理路径可以抽象为 Listener → Filter Chain → Cluster 三段式。Listener 负责接收入站流量,Filter 链负责请求/响应的拦截与转换,Cluster 负责定义上游端点与负载均衡策略。三者通过配置紧密协作,形成完整的代理流水线。
1.3.1 Listener(监听器)
Listener 定义 Envoy 在哪个 IP:Port 上监听入站连接。支持 TCP、UDP、Unix Domain Socket 等协议。每个 Listener 可以绑定多个 Filter Chain,通过 Filter Chain Match 根据 SNI、ALPN、源 IP 等条件选择不同的处理流水线。
- Listener 过滤器(Listener Filter):在连接建立前执行,如 TLS 握手、Proxy Protocol 解析、原始 IP 检测。
- 连接平衡(Connection Balance):通过
exact_balance或active_balance将新连接均匀分发到 Worker 线程。 - SO_REUSEPORT:Linux 内核级负载分发,允许每个 Worker 独立 accept,减少锁争用。
1.3.2 Cluster(集群)
Cluster 定义 Envoy 将流量转发到的上游服务集合。包含端点发现方式(静态、DNS、EDS)、负载均衡算法(轮询、最少请求、一致性哈希)、连接池大小、健康检查策略等。
| Cluster 配置项 | 说明 | GitOps 场景关注点 |
|---|---|---|
type |
STRICT_DNS / LOGICAL_DNS / EDS / STATIC | EDS 配合控制面实现动态端点注入 |
lb_policy |
ROUND_ROBIN / LEAST_REQUEST / RING_HASH / MAGLEV | 一致性哈希用于会话保持场景 |
circuit_breakers |
最大连接数、最大请求数、最大重试数 | 防止同步窗口期内突发流量击穿上游 |
outlier_detection |
被动健康检查:连续错误驱逐、成功率检测 | 快速隔离异常端点,减少同步窗口抖动 |
1.3.3 Filter(过滤器)
Filter 是 Envoy 可扩展性的核心。分为 Listener Filter、Network Filter(L4)、HTTP Filter(L7) 三层。Filter 链以“流水线”方式串联,每个 Filter 可以修改请求/响应、终止处理、生成动态元数据。
- Network Filter:TCP 代理、TLS 终止、MySQL/Redis 协议嗅探。
- HTTP Filter:Router、RBAC、Rate Limit、gRPC-Web、Local Reply。
- Wasm / Lua Filter:支持动态扩展,适合 GitOps 场景下快速注入自定义逻辑。
1.4 组件协作流程示例
以一次 HTTP 请求为例,展示 Listener、Filter、Cluster 如何协作:
- Listener accept:Worker 线程从 Listener 的 socket 接受新连接,触发 Network Filter 链。
- TLS 终止:TLS Inspector Filter 完成握手,提取 SNI。
- HTTP 协议解析:HttpConnectionManager 将字节流解析为 HTTP 请求头/体。
- 路由决策:Router Filter 根据请求 Host/Path 匹配路由规则,选定目标 Cluster。
- 负载均衡:Cluster 从健康端点中按策略选择一个 Upstream,建立连接池连接。
- 转发与响应:请求发送至 Upstream,响应经 Filter 链返回客户端。