HTTP 路由

Envoy 包含一个可以被安装用来执行高级路由任务的 HTTP 路由过滤器。这对于处理边缘流量(传统的反向代理请求处理)以及构建服务间的 Envoy 网格 (通常通过基于 host/authority 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”计算后作为作用域关键字,以查找相应的路由配置。

name: scope_by_addr
fragments:
  - header_value_extractor:
      name: Addr
      element_separator: ;
      element:
        key: x-foo-key
        separator: =

为了使关键字与 ScopedRouteConfiguration 匹配,计算键中的分片数量必须与 ScopedRouteConfiguration 的数量相匹配。然后按顺序匹配片段。内置关键字中缺少片段(视为 NULL)会使请求无法匹配任何作用域,即找不到该请求的路由项。

路由表

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

重试语义

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

  • 最大重试次数:Envoy 将继续重试任何次数。重试之间的时间间隔可以通过指数退避算法(默认),也可以基于上游服务器通过请求头(如果存在)的反馈来确定。此外 所有重试都包含在整个请求超时内。 这避免了由于大量重试而导致请求时间较长。

  • 重试条件:Envoy 可以根据应用要求在不同类型的条件下重试。例如网络故障、所有 5xx 响应代码、幂等 4xx 响应代码等。

  • 重试限额:Envoy 可以通过可重试的 重试限额 来限制活动请求的比例,以防止其造成流量的大幅增长。

  • 主机选择重试插件:可以将 Envoy 配置为在选择主机进行重试时将附加逻辑应用于主机选择逻辑。指定 重试主机谓词 可以在选择某些主机时(例如在选择已尝试的主机时)重新尝试选择主机,通过配置 重试优先级 来调整选择重试优先级时 使用的优​​先级负载。

请注意,存在 x-envoy-overloaded 时 Envoy 重试请求。建议配置 重试策略(首选) 或将 最大活动重试熔断器 设置为适当的值以避免重试风暴。

请求对冲

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

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

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

优先路由

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

当前支持的优先级为 defaulthigh

直接响应

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

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

  • 设置 direct_response 字段。这适用于所有 HTTP 响应状态。

  • 设置 redirect 字段。这仅适用于重定向响应状态,但简化了 Location 请求头的设置。

直接响应包含 HTTP 状态码和可选的正文。路由配置可以内联指定响应主体,也可以指定包含主体的文件的路径名。如果路由配置指定了文件路径名,则 Envoy 将在配置加载时读取文件并缓存内容。

如果已为路由或封闭的虚拟主机设置了 response_headers_to_add,Envoy 将在直接 HTTP 响应中包括指定的请求头。