HTTP路由

Envoy 包括一个 HTTP 路由器过滤器,可以安装它来执行高级路由任务。这对于处理边缘流量(传统的反向代理请求处理)以及构建服务间的 Envoy 网格(通常是通过主机/授权 HTTP 头的路由到达特定的上游服务集群)非常有用。Envoy 也可以被配置为转发代理。在转发代理配置中,网格客户端可以通过适当地配置其 http 代理来成为 Envoy。路由在一个高层级接受一个传入的 HTTP 请求,将其与上游集群相匹配,在上游集群中获得一个连接池,并转发请求。路由过滤器支持以下特性:

路由作用域

作用域路由使 Envoy 可以在域名的搜索空间和路由规则上设置约束。路由作用域用一个键与路由表相关联。对于每个请求,HTTP 连接管理器都会动态计算出一个作用域键用以选择路由表。可以根据 v3 API参考 配置按需加载与路由作用域相关的 RouteConfiguration,并且按需提交 protobuf 设置为true。

作用域 RDS(SRDS) API 包含了一组作用域资源,每个资源定义了独立的路由配置,以及一个 ScopeKeyBuilder 定义了 Envoy 用于查找域每个请求相对应的作用域键构造算法。

例如,对于以下作用域内的路由配置,Envoy 将查看“addr”头部值,首先将头部值根据“;”拆分,并使用第一个‘x-foo-key’键的值做为作用域键。如果“addr”头部值为“foo=1;x-foo-key=127.0.0.1;x-bar-key=1.1.1.1”,那么将会计算出“127.0.0.1”做为作用域键用于查找相应的路由配置。

  1. fragments:
  2. - header_value_extractor:
  3. name: Addr
  4. element_separator: ;
  5. element:
  6. key: x-foo-key
  7. separator: =

为了使键能够与 ScopedRouteConfiguration 匹配,计算出的键片段数必须与 ScopedRouteConfiguration 中的相匹配。然后按顺序匹配片段。构建键中缺失的片段(视为NULL)会使请求无法匹配到任何作用域,即无法为请求找到任何的路由入口。

路由表

HTTP 连接管理器的配置拥有所有已配置的 HTTP 过滤器使用的路由表。尽管路由器过滤器是路由表的主要使用者,但是其他过滤器也有访问权限,以防它们想根据请求的最终目的地做出决策。例如,内置的限速过滤器查询路由表,以确定是否应该根据路由调用全局限速服务。连接管理器确保对特定请求的所有调用都是稳定的,即使决策涉及到随机性(例如,在运行时配置路由规则的情况下)。

重试语义

Envoy 允许在路由配置和通过请求头的特定请求中配置重试。以下配置是可能的:

  • 最大数量的重试:Envoy 将持续进行多次尝试。每次重试的间隔通过使用一个指数回溯算法(默认)决定,或者基于上游服务的头部(如果存在)。此外,所有重试都包含在总体请求超时中。这避免了由于大量重试而导致的长时间请求。
  • 重试条件:Envoy 可以根据应用程序的要求对不同类型的条件进行重试。例如,网络故障,所有 5xx 响应代码、幂等 4xx 响应码等等。
  • 重试预算:Envoy 可以通过重试预算来限制活跃请求的比例以防止流量的大幅度增长。
  • 主机选择重试插件:可以为 Envoy 的主机选择逻辑配置额外的逻辑,在重试选择主机时生效。指定重试主机谓词可以在选择某些主机时(例如在选择已尝试过的主机时)重新尝试选择主机,当选择优先级进行重试时可以配置重试优先级以调整优先级负载。

需要注意 Envoy 在 x-envoy-overloaded 存在时才重试请求。建议配置重试预算(首选)或者设置最大活跃请求断路器为设当的值以避免发生重试风暴。

请求对冲

Envoy 可以通过指定对冲策略启用请求对冲。这意味着 Envoy 将争用多个同时发生的上游请求,并将与第一个与可接受的响应头部相关联的响应返回到下游。重试策略用于确定是否应返回响应或是否应等待更多的响应。

当前,对冲只能在请求超时时响应执行。这意味着,将在不取消初始超时请求的情况下发出重试请求,并且将等待延迟响应。根据重试策略第一个“好”的响应将在下游返回。

该实现确保相同的上游请求不会重试两次。如果请求超时,导致响应5xx并创建两个可重试事件时,则可能发生这种情况。

优先级路由

Envoy 支持路由级别的优先路由。当前的优先级实现为每个优先级使用不同的连接池断路设置。这意味着,即使对于 HTTP/2 请求,也将使用两个物理连接到上游主机。在未来,Envoy 可能会通过单一连接支持真正的 HTTP/2 优先级。

当前支持的优先级是默认的高的

直接响应

Envoy 支持发送“直接”回应。这些是预先配置的 HTTP 响应,不需要代理到上游服务器。

有两种方法可以在一条路由中指定直接响应:

  • 设置 direct_response 字段。这适用于所有 HTTP 响应状态。
  • 设置 redirect 字段。这只适用于重定向响应状态,但它简化了位置头的设置。

直接响应有一个 HTTP 状态码和一个可选体。路由配置可以内联地指定响应体,或者指定包含体的文件的路径名。如果路线配置指定了一个文件路径名,Envoy 将在配置负载上读取文件并缓存内容。

注意

如果指定了响应体,那么它的大小必须不超过 4KB ,不管它是内联还是在文件中。Envoy 目前将所有正文保存在内存中,所以 4KB 的限制本意上是为了防止代理的内存占用太大。

如果路由或相关虚拟主机上设置了 response_headers_to_add ,Envoy 将在直接 HTTP 响应中包含指定的标头。