2. Envoy 核心组件:Listener、Filter、Cluster、Endpoint、Router 的工作原理

Envoy 的架构围绕五个核心抽象构建:Listener(监听器)、Filter(过滤器)、Cluster(集群)、Endpoint(端点)和 Router(路由器)。理解这五个组件及其协作关系,是掌握 Envoy 流量处理模型的基础。本章将逐一拆解每个组件的工作原理,并通过数据流图展示它们如何串联成完整的请求处理链路。

2.1 组件总览与职责划分

Envoy 采用 L4/L7 分层处理 架构。Listener 负责网络接入,Filter 链负责协议解析与策略执行,Router 负责流量分发决策,Cluster 与 Endpoint 负责后端服务抽象与负载均衡。下表总结了每个组件的核心职责与工作层级:

组件 工作层级 核心职责 关键配置项
Listener L4 (TCP/UDP) 绑定端口、接受连接、管理 TLS 终止 address, filter_chains, listener_filters
Filter L4 / L7 解析协议、执行策略、生成日志与指标 typed_config, name, filter_class
Router L7 (HTTP) 匹配请求、选择路由、执行重试/超时 route_config, virtual_hosts, routes
Cluster L4 / L7 定义后端服务组、配置负载均衡策略 type (EDS/STRICT_DNS/STATIC), lb_policy
Endpoint L4 表示单个后端实例(IP:Port) address, health_status, metadata
架构要点: Listener 是入口,Filter 是处理管道,Router 是决策中枢,Cluster 是后端抽象,Endpoint 是实际目标。这五个组件形成一个从“网络接入”到“实例转发”的完整闭环。

2.2 Listener:网络接入的起点

Listener 是 Envoy 对外暴露服务的网络入口。每个 Listener 绑定一个或多个 IP:Port,负责接收来自客户端的 TCP 连接或 UDP 数据报。Envoy 支持 单 Listener 多 Filter Chain 模式,即同一个端口可以根据 TLS SNI 或源 IP 选择不同的过滤器链。

  • 绑定与接受: Listener 使用 SO_REUSEPORT 实现多 worker 线程的独立 accept,提升并发性能。
  • TLS 终止: 在 Listener 层可配置 filter_chains 中的 transport_socket,实现 TLS 卸载。
  • Listener Filter: 在连接建立后、L4 Filter 之前执行的轻量级过滤器,常用于 TLS 检测、代理协议解析。
  • 动态更新: 通过 LDS (Listener Discovery Service) 实现运行时 Listener 的增删改,无需重启。
生产实践: 在 Kubernetes 场景下,每个 Service 通常对应一个 Envoy Listener,端口由 Istio 自动分配(如 8080、8443)。通过 LDS 动态下发,实现 Sidecar 的无感配置更新。

2.3 Filter:可插拔的处理管道

Filter 是 Envoy 实现协议处理与策略注入的核心机制。Envoy 将 Filter 组织成 链式结构,按顺序依次执行。Filter 分为三类:

Filter 类型 工作层级 典型用途 示例
Listener Filter L4 (连接前) TLS 检测、代理协议解析、源 IP 识别 envoy.filters.listener.tls_inspector
Network Filter (L4) L4 (连接中) TCP 代理、速率限制、原始数据记录 envoy.filters.network.tcp_proxy
HTTP Filter (L7) L7 (请求/响应) 路由、限流、故障注入、日志、RBAC envoy.filters.http.router, envoy.filters.http.local_ratelimit

HTTP Filter 链的执行顺序至关重要:Decoder Filter(请求方向)先执行,Encoder Filter(响应方向)后执行。Router Filter 通常位于 Decoder 链的末尾,负责将请求转发给 Cluster。

避坑指南: 不要将 Router Filter 放在 Decoder 链的中间位置,否则后续 Filter 将无法获取路由决策结果。Router Filter 必须是 Decoder 链的最后一个 Filter。

2.4 Cluster 与 Endpoint:后端服务抽象

Cluster 定义了一组提供相同服务的后端实例集合,Endpoint 则是这些实例的具体网络地址。Envoy 通过 EDS (Endpoint Discovery Service) 或静态配置管理 Endpoint 的生命周期。

  • Cluster 类型:
    • STATIC: 静态配置,适用于固定后端。
    • STRICT_DNS: 通过 DNS 解析获取 IP 列表,适用于 DNS 轮询场景。
    • LOGICAL_DNS: 只解析一次,适用于长连接场景。
    • EDS: 通过 xDS 动态下发,适用于大规模服务网格。
  • 负载均衡策略: 支持 ROUND_ROBIN、LEAST_REQUEST、RING_HASH、MAGLEV 等。
  • 健康检查: Envoy 主动对 Endpoint 发起 HTTP/TCP 健康检查,不健康的 Endpoint 会被移出负载均衡池。
  • 端点权重: 每个 Endpoint 可配置权重,用于灰度发布或流量分配。
关键指标: 监控 cluster.upstream_rq_xx 系列指标(如 2xx、5xx)和 cluster.membership_healthy,可以快速判断后端集群的健康状态与负载均衡效果。

2.5 Router:流量分发决策引擎

Router 是 Envoy L7 路由的核心组件,通常以 HTTP Filter 的形式存在(envoy.filters.http.router)。它根据 路由配置(RouteConfiguration) 匹配请求,并决定将请求转发到哪个 Cluster。

路由匹配规则支持多层条件:

匹配维度 配置字段 示例
请求路径 match.path / match.safe_regex /api/v1/*
请求头 match.headers host: example.com
查询参数 match.query_parameters version=v2
HTTP 方法 match.headers (结合 :method) GET / POST
动态元数据 match.metadata 用于金丝雀发布

Router 还负责执行 重试策略、超时控制、流量镜像 和 故障注入 等高级功能。

2.6 组件协作数据流

下图展示了从客户端请求到后端响应的完整数据流,清晰呈现 Listener、Filter、Router、Cluster、Endpoint 的协作关系:

Envoy 核心组件协作数据流 客户端 Listener Filter Chain L4 Filter HTTP Filter (含 Router) Router Cluster Endpoint 池 Endpoint 1 (10.0.0.1:8080) Endpoint 2 (10.0.0.2:8080) 后端实例 TCP 连接 原始数据 HTTP 请求 路由决策:选择 Cluster 负载均衡 转发 数据流说明: 1. 客户端建立 TCP 连接到达 Listener,Listener 完成 TLS 终止和连接管理。 2. 连接进入 Filter Chain,依次经过 L4 Filter 和 HTTP Filter 链(含 Router Filter)。 3. Router 根据路由配置匹配请求,选择目标 Cluster。 4. Cluster 通过负载均衡算法选择一个健康的 Endpoint,将请求转发到后端实例。

2.7 组件配置示例

以下是一个简化的 Envoy 配置片段,展示了 Listener、Filter、Router、Cluster、Endpoint 的声明方式:

static_resources:
  listeners:
  - name: listener_http
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }
    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 }
          http_filters:
          - name: envoy.filters.http.router
  clusters:
  - name: service_api
    connect_timeout: 0.25s
    type: EDS
    lb_policy: LEAST_REQUEST
    eds_cluster_config:
      eds_config:
        resource_api_version: V3
配置要点: 注意 http_filters 中 Router Filter 位于列表末尾;Cluster 的 type: EDS 表示端点由控制面动态下发,适用于 Istio 等服务网格场景。

2.8 组件故障排查要点

当流量处理出现异常时,可以按以下组件维度进行排查:

组件 常见故障现象 排查命令 / 指标
Listener 连接超时、端口冲突 curl -s http://localhost:15000/listeners 查看 Listener 状态
Filter 请求被错误拦截、日志缺失 检查 Filter 顺序与 typed_config 参数
Router 请求 404、路由到错误 Cluster curl -s http://localhost:15000/config_dump 查看路由配置
Cluster 后端不可达、负载不均 curl -s http://localhost:15000/clusters 查看集群健康状态
Endpoint 端点被标记为不健康、权重异常 检查 EDS 响应与健康检查日志
常见误区: 不要混淆 Cluster 的 type 与 Endpoint 的发现方式。例如,type: STRICT_DNS 的 Cluster 仍然可以通过 EDS 覆盖端点,但 DNS 解析结果会优先被 EDS 替换。理解这一优先级关系对排查端点发现问题至关重要。