Envoy 中的 Filter 是一种可插拔的组件,用于处理进出代理的流量。过滤器可以在不同的层次上工作,包括网络层(L3/L4)和 HTTP 层。

过滤器的类型

Envoy 提供了多种类型的过滤器,主要可以分为以下几类:

  1. 监听器过滤器(Listener Filters):这些过滤器在网络层级上操作,处理传入的连接请求,如 TLS 握手或协议检测。
  2. 网络过滤器(Network Filters):网络过滤器直接操作 TCP 流量,负责处理所有通过特定监听器的数据。典型的网络过滤器包括 TCP 代理、HTTP 连接管理器等。
  3. HTTP 过滤器(HTTP Filters):这些过滤器专门用于处理 HTTP 流量,可以操作 HTTP 请求和响应。它们在 HTTP 连接管理器的上下文中运行,例如实现路由、身份验证和授权等功能。
  4. 自定义过滤器(Custom Filters):Envoy 也支持自定义过滤器开发,允许开发者根据特定需求创建过滤器。

过滤器的工作流程

在 Envoy 中,过滤器以管道的形式组织,请求和响应数据会依次流经每个过滤器。每个过滤器可以对数据进行处理,并决定是否将数据传递给链中的下一个过滤器。这种设计允许灵活地添加、修改或删除任何处理步骤,而不会影响其他组件。

image
过滤器的工作流程

网络过滤器 (Network Filters)

网络过滤器在 Listener 级别工作,用于处理原始字节流。它们在 Listener 接收到新连接时被实例化。常见的网络过滤器包括:

  • TLS 终止:处理 TLS 握手并终止 TLS 连接。
  • Redis 代理:实现 Redis 协议的代理逻辑。
  • MongoDB 代理:实现 MongoDB 协议的代理逻辑。
  • DynamoDB 代理:实现 DynamoDB 协议的代理逻辑。

网络过滤器按照配置的顺序组成一个过滤器链,依次处理进出的流量。

HTTP 过滤器 (HTTP Filters)

HTTP 过滤器在 HTTP 连接管理器级别工作,用于处理 HTTP 请求和响应。它们在 HTTP 连接管理器接收到新的 HTTP 请求时被实例化。常见的 HTTP 过滤器包括:

  • 路由:实现请求路由逻辑,将请求转发到合适的上游集群。
  • 速率限制:对请求速率进行限制。
  • 缓冲:为请求和响应实现缓冲。
  • CORS:实现 CORS 策略。
  • Gzip:对响应进行 Gzip 压缩。

HTTP 过滤器也是按照配置的顺序组成一个过滤器链,依次处理 HTTP 请求和响应。

Listener 过滤器 (Listener Filters)

Listener 过滤器在 Listener 接收到新连接时被实例化,用于收集连接信息,为后续的网络过滤器链选择做准备。例如,Listener 过滤器可以收集 TLS 握手数据,包括 SNI 和 ALPN,以选择合适的网络过滤器链。

如何配置 Envoy 过滤器?

配置 Envoy 过滤器通常涉及定义 YAML 或 JSON 配置文件。下面是一个配置 HTTP 过滤器的简单示例:

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 }
    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
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: service_cluster }
          http_filters:
          - name: envoy.filters.http.router

在这个配置中,我们设置了一个 HTTP 连接管理器作为网络过滤器,它使用了 HTTP 路由过滤器来管理请求的路由。

最后更新于 2024/11/07