HTTP 连接管理器(HCM)简介

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

统一 HTTP 解决方案
统一 HTTP 解决方案

工程定位与作用

HCM 是 Envoy 处理 HTTP 流量的核心组件,负责将底层字节流解析为 HTTP 消息,并通过 HTTP 过滤器链实现流量治理、协议转换、安全控制等功能。它支持 HTTP/1.1、HTTP/2、HTTP/3 及 WebSocket,适用于微服务、API 网关等多种场景。

HTTP 过滤器链机制

HCM 支持灵活的 HTTP 过滤器链,每个过滤器可实现解码(请求)、编码(响应)或双向处理。过滤器链顺序影响数据流:

  • 请求路径:按配置顺序依次调用解码器过滤器(decoder)
  • 响应路径:按逆序依次调用编码器过滤器(encoder)

典型配置片段:

http_filters:
  - name: envoy.filters.http.cors
  - name: envoy.filters.http.jwt_authn
  - name: envoy.filters.http.router

工程实践建议:最后一个过滤器通常为 router,前面可插入认证、限流、日志等功能性过滤器。

路由与虚拟主机

HCM 内部集成了强大的路由系统,可根据请求路径、头部等灵活路由到不同上游集群。路由配置由虚拟主机(virtual_hosts)组织,支持多域名、优先级、前缀/正则/精确匹配等。

路由配置示例:

route_config:
  name: my_route_config
  virtual_hosts:
  - name: main
    domains: ["example.com", "*.example.com"]
    routes:
    - match:
        prefix: "/api"
      route:
        cluster: api_service
    - match:
        prefix: "/"
      route:
        cluster: web_service

主要功能

以下是 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

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 流量的核心组件,提供了丰富的功能,如协议支持、头部清理、路由和重定向,使其能够满足现代微服务架构的需求。

文章导航

章节内容

这是章节的内容页面。

章节概览