HTTP 动态转发代理
通过结合 HTTP 过滤器 和 自定义集群,Envoy 支持 HTTP 动态转发代理。
这意味着 Envoy 可以执行 HTTP 代理的角色,而无需事先了解所有配置的 DNS 地址,同时仍然保留 Envoy 的大部分优势,包括异步 DNS 解析。
实现原理如下
动态转发代理 HTTP 过滤器用于暂停请求,如果目标 DNS 主机尚未在缓存中。
Envoy 将开始异步解析 DNS 地址,在解析完成时解除对等待响应的任何请求的阻塞。
任何未来的请求都不会被阻止,因为 DNS 地址已在缓存中。解析过程类似于 逻辑 DNS 服务发现类型,在任何给定时间只记住一个目标地址。
所有已知主机都存储在动态转发代理集群中,以便可以在 管理输出 中显示。
一个特殊的负载均衡器将根据 HTTP
host
/authority
标头在转发过程中选择要使用的正确主机。一段时间未使用过的主机将受到 TTL 的限制,该 TTL 会清除它们。
当上游集群已配置有 TLS 上下文时,Envoy 将自动为解析的主机名执行 SAN 验证,并通过 SNI 指定主机名。
上述实现细节意味着在稳定状态下,Envoy 可以转发大量 HTTP 代理流量,而所有 DNS 解析都异步发生在后台。
此外,所有其他 Envoy 过滤器和扩展都可以与动态转发代理支持一起使用,包括身份验证、RBAC、速率限制等。
提示
有关更多配置信息,请参见 HTTP 过滤器配置文档。
内存使用细节
Envoy 的动态转发代理支持的内存使用细节如下
每个解析的主机/端口对使用服务器全局的固定内存量,并在所有工作线程之间共享。
地址更改使用读写锁进行内联执行,不需要主机重新分配。
通过 TTL 删除的主机将在所有活动连接停止引用它们并且所有已使用内存被重新获得后被清除。
可以使用 max_hosts 字段来限制 DNS 缓存在任何给定时间存储的主机数量。
集群的 max_pending_requests 电路断路器可用于限制等待 DNS 缓存加载主机的请求数量。
长时间运行的上游连接可能会在连接仍然打开的情况下通过 TTL 使底层逻辑主机过期。
上游请求和连接仍然受其他集群电路断路器的约束,例如 max_requests。
当前的假设是连接之间共享的主机数据使用的内存量与连接和请求本身相比微不足道,因此不值得独立控制。