HTTP路由

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

  • 将域/授权映射到一组路由规则的虚拟主机。
  • 前缀和精确路径匹配规则(包括大小写敏感和大小写不敏感)。目前还不支持正则/slug 匹配,这主要是因为难以用编程方式确定路由规则是否相互冲突。因此我们并不建议在反向代理级别使用正则/slug 路由,但是我们将来可能会根据用户需求量增加对这个特性的支持。
  • 在虚拟主机级别上的 TLS 重定向
  • 在路由级别的路径/主机重定向。
  • 在路由级别的直接(非代理)HTTP 响应。
  • 显式重写
  • 自动主机重写,基于所选的上游主机的 DNS 名称。
  • 前缀重写
  • 在路由级别上的 Websocket升级
  • 请求通过 HTTP 头或路由配置指定请求重试
  • 请求通过 HTTP头路径配置指定超时。
  • 通过运行时从一个上游集群转移到另一个集群(参见流量转移/分割)。
  • 使用基于权重/百分比的路由的流量跨越多个上游集群(参见流量转移/分割)。
  • 任意标题匹配路由规则
  • 虚拟集群规范。虚拟集群是在虚拟主机级别上指定的,由 Envoy 使用,在标准集群级别上生成额外的统计信息。虚拟集群可以使用正则表达式匹配。
  • 基于优先级的路由。
  • 基于哈希策略的路由。
  • 绝对 url 支持非 tls 转发代理。

路由表

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

重试语义

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

  • 最大数量的重试:Envoy 将继续进行多次尝试。在每次重试之间使用一个指数回溯算法。此外,所有重试都包含在总体请求超时中。这避免了由于大量重试而导致的长时间请求。
  • 重试条件:Envoy 可以根据应用程序的要求对不同类型的条件进行重试。例如,网络故障,所有 5xx 响应代码、幂等 4xx 响应码等等。

请注意,根据 x-envoy-overloaded 的内容,重试可能会被禁用。

优先级路由

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

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

直接响应

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

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

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

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

注意

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

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