HTTP 连接管理器(HCM)简介

查看本文大纲

HTTP 连接管理器(HTTP Connection Manager,HCM)是 Envoy Proxy 中的一个核心网络过滤器,负责管理 HTTP 连接的生命周期和流量控制。它提供了丰富的功能,使得 Envoy 能够处理和路由 HTTP 请求。

主要功能

以下是 HCM 的几个主要功能:

  1. 路由:HCM 支持基于请求的路由,可以根据请求的路径、头部信息等进行动态路由到后端服务。它允许用户定义复杂的路由规则,以满足不同的业务需求。
  2. 流量控制:HCM 提供流量控制机制,包括速率限制和重试策略。这些机制可以帮助保护后端服务,防止过载。
  3. 连接管理:HCM 负责管理 HTTP 连接的建立和关闭。它支持 HTTP/1.1 和 HTTP/2 协议,能够根据配置选择最佳的连接方式。
  4. 安全性:HCM 支持 TLS 配置,能够在传输层提供加密,确保数据在网络中的安全性。此外,它还支持 JWT(JSON Web Token)等身份验证机制。
  5. 监控和日志:HCM 集成了监控和日志功能,可以通过统计信息和日志记录来跟踪请求的性能和状态。这对于故障排查和优化非常重要。
  6. 集成和扩展:HCM 能够与 Envoy 的其他组件紧密集成,如访问控制、速率限制、熔断器、全局速率限制服务等。由于 HCM 的设计高度模块化,用户可以通过配置或编写自定义过滤器来扩展其功能。

配置示例

HCM 的配置通常在 Envoy 的配置文件中定义,以下是一个简单的配置示例:

static_resources:
  listeners:
  - name: listener_0
    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
          access_log:
          - name: envoy.access_loggers.stdout
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  host_rewrite_literal: www.envoyproxy.io
                  cluster: service_envoyproxy_io
  clusters:
  - name: service_envoyproxy_io
    type: LOGICAL_DNS
    dns_lookup_family: V4_ONLY
    load_assignment:
      cluster_name: service_envoyproxy_io
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: www.envoyproxy.io
                port_value: 443
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
        sni: www.envoyproxy.io

在这个示例中:

  • stat_prefix 用于指定统计信息的前缀。
  • codec_type 设置了 HCM 支持的 HTTP 协议版本(如自动选择 AUTO)。
  • route_config 定义了路由配置,virtual_hosts 包含了路由的具体规则。
  • http_filters 配置了 HCM 中的 HTTP 过滤器链,这里使用了一个基础的 router 过滤器。
  • admin 接口提供了一种管理和监控 Envoy 代理实例的方式,允许你实时查看其状态、配置和统计信息。

这个 Envoy 配置文件定义了一个基本的反向代理服务,监听本地端口 10000,将所有进入的 HTTP 请求路由到 www.envoyproxy.io,并通过 TLS 加密与上游服务通信。

HTTP 协议支持

Envoy 的 HTTP 连接管理器原生支持 HTTP/1.1、HTTP/2 和 HTTP/3,包括 WebSockets。Envoy 的 HTTP 支持最初是为了成为一个 HTTP/2 多路复用代理。内部使用 HTTP/2 术语来描述系统组件,比如一个 HTTP 请求和响应发生在一个"流"上。

使用一个编解码器 API 来将不同的协议翻译成一种与协议无关的流、请求、响应等形式。对于 HTTP/1.1,编解码器将协议的串行/流水线功能翻译成看起来像 HTTP/2 的东西,这意味着大部分代码不需要理解一个流是从 HTTP/1.1、HTTP/2 还是 HTTP/3 连接上来的。

HTTP 头部清理

HTTP 连接管理器出于安全原因执行各种操作,如清理敏感头部。

路由表配置

每个 HTTP 连接管理器都有一个关联的路由表,可以通过两种方式指定:

  1. 静态配置
  2. 通过 RDS API 动态配置

内部重定向

Envoy 支持在内部处理 3xx 重定向,即捕获一个可配置的 3xx 重定向响应,合成一个新请求,将其发送到新路由匹配指定的上游,并将重定向响应作为原始请求的响应返回。原始请求的头部和主体将在重定向时发送到新位置,但不支持尾部。

Envoy 的 HTTP 连接管理器是处理 HTTP 流量的核心组件,提供了丰富的功能,如协议支持、头部清理、路由和重定向,使其能够满足现代微服务架构的需求。

最后更新于 2024/11/07