HTTP connection manager
HTTP连接管理 HTTP是现代面向服务的体系结构的关键组成部分,Envoy实施了大量HTTP特定功能。Envoy有一个内置的网络级 filter,称为 HTTP连接管理器。该 filter将原始字节转换为HTTP级别的消息和事件(例如,接收到的标头,接收的正文数据,接收的预告片等)。它还处理所有HTTP连接和请求共有的功能,例如访问日志记录,请求ID生成和跟踪, 请求/响应头操作,路由表管理和统计信息。
HTTP连接管理器配置。
HTTP协议 Envoy的HTTP连接管理器对HTTP / 1.1,WebSockets和HTTP / 2具有本机支持。它不支持SPDY。Envoy的HTTP支持首先设计为HTTP / 2多路复用代理。在内部,HTTP / 2术语用于描述系统组件。例如,HTTP请求和响应发生在stream上。编解码器API用于将不同的有线协议转换为与流,请求,响应等无关的协议形式。对于HTTP / 1.1,编解码器将协议的串行/流水线功能转换为类似于HTTP的形式/ 2到更高的层。这意味着大多数代码不需要了解流是起源于HTTP / 1.1还是HTTP / 2连接。
HTTP标头清理 出于安全原因,HTTP连接管理器执行各种头清理操作。
路由表配置 每个HTTP连接管理器 filter都有一个关联的路由表。可以通过以下两种方式之一指定路由表:
静态地。
通过RDS API动态地。
重试插件配置 通常,在重试期间,主机选择与原始请求遵循相同的过程。重试插件可用于修改此行为,它们分为两类:
主机谓词:这些谓词可用于“拒绝”主机,这将导致主机选择重新尝试。可以指定任意数量的谓词,如果任何谓词拒绝主机,则主机将被拒绝。
Envoy支持以下内置主机谓词
envoy.retry_host_predicates.previous_hosts:这将跟踪以前尝试过的主机,并拒绝已经尝试过的主机。
envoy.retry_host_predicates.omit_canary_hosts:这将拒绝任何标记为金丝雀主机的主机。主机通过设置标记为在端点的 filter过滤的元数据。有关更多详细信息,请参见LbEndpoint。canary: trueenvoy.lb
envoy.retry_host_predicates.omit_host_metadata:这将基于预定义的元数据匹配条件拒绝任何主机。有关更多详细信息,请参见下面的配置示例。
优先级谓词:这些谓词可用于调整为重试尝试选择优先级时使用的优先级负载。只能指定一个这样的谓词。
Envoy支持以下内置优先级谓词
envoy.retry_priorities.previous_priorities:这将跟踪先前尝试的优先级,并调整优先级负载,以便在后续的重试尝试中将其他优先级作为目标。
主机选择将继续进行,直到配置的谓词接受主机或达到可配置的最大尝试次数为止 。
这些插件可以组合使用,以影响主机选择和优先级负载。还可以使用自定义重试插件扩展Envoy,类似于添加自定义 filter的方式。
配置实例
例如,要将重试配置为首选尚未尝试过的主机,envoy.retry_host_predicates.previous_hosts可以使用内置 谓词:
retry_policy: retry_host_predicate:
name: envoy.retry_host_predicates.previous_hosts
host_selection_retry_max_attempts: 3
这将拒绝先前尝试的主机,最多重试主机选择3次。为了处理不可能(无法找到满足条件的主机)或不可能(无法找到合适的主机,唯一合适的主机具有相对较低的权重)的情况,必须对尝试进行限制。
要基于主机的元数据拒绝主机,envoy.retry_host_predicates.omit_host_metadata可以使用:
retry_policy: retry_host_predicate:
name: envoy.retry_host_predicates.omit_host_metadata
typed_config:
"@type": type.googleapis.com/envoy.extensions.retry.host.omit_host_metadata.v3.OmitHostMetadataConfig
metadata_match:
这将拒绝其元数据中具有匹配(键,值)的任何主机。
要将重试配置为在重试期间尝试其他优先级,envoy.retry_priorities.previous_priorities可以使用内置功能 。
retry_policy: retry_priority: name: envoy.retry_priorities.previous_priorities typed_config: "@type": type.googleapis.com/envoy.extensions.retry.priority.previous_priorities.v3.PreviousPrioritiesConfig update_frequency: 2 这将针对尚未使用的后续重试尝试中的优先级。该update_frequency参数决定应重新计算优先级负载的频率。
这些插件可以组合使用,这将同时排除先前尝试的主机和先前尝试的优先级。
retry_policy: retry_host_predicate:
name: envoy.retry_host_predicates.previous_hosts
host_selection_retry_max_attempts: 3
retry_priority:
name: envoy.retry_priorities.previous_priorities
typed_config:
"@type": type.googleapis.com/envoy.extensions.retry.priority.previous_priorities.v3.PreviousPrioritiesConfig
update_frequency: 2
内部重定向
Envoy支持内部处理3xx重定向,即捕获可配置的3xx重定向响应,合成新请求,将其发送到新路由匹配所指定的上游,并将重定向后的响应作为对原始请求的响应返回。
内部重定向是通过路由配置中的内部重定向策略字段配置的。启用重定向处理后,来自上游的与redirect_response_codes匹配的任何3xx响应 都将由Envoy处理。
为了成功处理重定向,它必须通过以下检查:
具有与redirect_response_codes中的一个匹配的响应代码,该响应代码要么是302(默认情况下),要么是一组3xx代码(301、302、303、307、308)。
具有带有有效的标准URL的位置标头。
该请求必须已由Envoy完全处理。
该请求不得包含正文。
allow_cross_scheme_redirect为true(默认为false),或者下游请求的方案和位置标头相同。
给定下游请求中先前处理的内部重定向的数量不超过 该请求或重定向的请求所命中的路由的最大内部重定向。
所有谓词都接受目标路由。
任何失败都将导致重定向传递到下游。
由于重定向的请求可能会在不同的路由之间退回,因此重定向链中的任何路由都会
没有启用内部重定向
或 当重定向链命中时,内部最大重定向次数小于或等于重定向链长度
或任何谓词不允许
将导致重定向传递到下游。
可以使用两个谓词来创建DAG,以定义重定向链,先前的路由谓词和allow_listed_routes。具体来说,允许列出的路由谓词定义了DAG中各个节点的边缘,而先前的路由谓词定义了边缘的“已访问”状态,因此可以避免循环。
第三个谓词safe_cross_scheme 可用于阻止HTTP-> HTTPS重定向。
重定向通过这些检查后,将通过以下方式修改发送到原始上游的请求标头:
将完全限定的原始请求URL放在x-envoy-original-url标头中。
用Location标头中的值替换Authority / Host,Scheme和Path标头。
然后,更改后的请求标头将选择新的路由,通过新的filter chains发送,然后在上游进行所有正常的Envoy请求清理。
警告
请注意,HTTP连接管理器清理操作(例如清除不可信的标头)将仅应用一次。即使原始路由和第二个路由相同,每个路由的报头修改也将同时应用于原始路由和第二路由,因此请谨慎配置报头修改规则,以避免重复不必要的报头值。
重定向流示例如下所示:
客户端发送GET请求以获取http://foo.com/bar
上游1发送带有“位置:http://baz.com/eep”的302
Envoy配置为允许在原始路由上进行重定向,并向上游2发送新的GET请求,以使用其他请求标头“ x-envoy-original-url:http//来获取http://baz.com/eep。 foo.com/bar”
Envoy将对http://baz.com/eep的响应数据代理到客户端,作为对原始请求的响应。
超时时间 各种可配置的超时适用于HTTP连接及其组成流。请查看 此常见问题解答条目,以获取重要超时配置的概述。
Last updated