HTTP 连接管理器(HTTP Connection Manager,HCM)是 Envoy Proxy 中的一个核心网络过滤器,负责管理 HTTP 连接的生命周期和流量控制。它提供了丰富的功能,使得 Envoy 能够处理和路由 HTTP 请求。
主要功能
以下是 HCM 的几个主要功能:
- 路由:HCM 支持基于请求的路由,可以根据请求的路径、头部信息等进行动态路由到后端服务。它允许用户定义复杂的路由规则,以满足不同的业务需求。
- 流量控制:HCM 提供流量控制机制,包括速率限制和重试策略。这些机制可以帮助保护后端服务,防止过载。
- 连接管理:HCM 负责管理 HTTP 连接的建立和关闭。它支持 HTTP/1.1 和 HTTP/2 协议,能够根据配置选择最佳的连接方式。
- 安全性:HCM 支持 TLS 配置,能够在传输层提供加密,确保数据在网络中的安全性。此外,它还支持 JWT(JSON Web Token)等身份验证机制。
- 监控和日志:HCM 集成了监控和日志功能,可以通过统计信息和日志记录来跟踪请求的性能和状态。这对于故障排查和优化非常重要。
- 集成和扩展: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 连接管理器都有一个关联的路由表,可以通过两种方式指定:
- 静态配置
- 通过 RDS API 动态配置
内部重定向
Envoy 支持在内部处理 3xx 重定向,即捕获一个可配置的 3xx 重定向响应,合成一个新请求,将其发送到新路由匹配指定的上游,并将重定向响应作为原始请求的响应返回。原始请求的头部和主体将在重定向时发送到新位置,但不支持尾部。
Envoy 的 HTTP 连接管理器是处理 HTTP 流量的核心组件,提供了丰富的功能,如协议支持、头部清理、路由和重定向,使其能够满足现代微服务架构的需求。