本文将解析 Envoy 的路由匹配机制,涵盖 RouteMatch 的各个组成部分。

什么是路由匹配

路由匹配 是 Envoy 决定如何将进入的请求分发到后端服务的核心机制。通过定义一系列的匹配条件,Envoy 可以根据请求的不同属性(如路径、头信息、查询参数等)灵活地将流量引导到相应的服务或版本。

RouteMatch 组件概览

RouteMatch 是配置路由匹配规则的主要结构体。它包含多个字段,每个字段对应一种匹配条件。下表汇总了 RouteMatch 的各个字段及其简要说明:

字段 类型 描述
prefix string 前缀匹配规则,匹配请求 :path 头的开头部分。仅能设置一个匹配字段。
path string 精确路径匹配,path 必须与请求 :path 头完全匹配。仅能设置一个匹配字段。
safe_regex RegexMatcher 使用正则表达式匹配整个路径。仅能设置一个匹配字段。
connect_matcher ConnectMatcher 匹配 CONNECTCONNECT-UDP 请求。仅能设置一个匹配字段。
path_separated_prefix string 路径分隔前缀匹配,匹配或以 / 结尾的前缀。仅能设置一个匹配字段。
path_match_policy TypedExtensionConfig 定义路径匹配策略的扩展配置。仅能设置一个匹配字段。
case_sensitive BoolValue 指示前缀或路径匹配是否区分大小写。默认 true
runtime_fraction RuntimeFractionalPercent 基于运行时键值的匹配概率,用于流量逐步迁移。
headers HeaderMatcher(重复) 指定一组请求头,所有指定头匹配时规则生效。
query_parameters QueryParameterMatcher(重复) 指定一组查询参数,所有指定参数匹配时规则生效。
grpc GrpcRouteMatchOptions 仅匹配 gRPC 请求。
tls_context TlsContextMatchOptions 匹配客户端 TLS 上下文,如证书呈现和验证状态。
dynamic_metadata MetadataMatcher(重复) 指定一组动态元数据匹配条件,所有条件匹配时规则生效。

注意:在 RouteMatch 中,prefixpathsafe_regexconnect_matcherpath_separated_prefixpath_match_policy 中只能设置一个。

高级匹配选项

GrpcRouteMatchOptions

用于指定仅匹配 gRPC 请求的条件,通过检查 content-type 头是否为 application/grpc 或其变体。

TlsContextMatchOptions

用于匹配客户端的 TLS 上下文,主要包括是否呈现证书和证书的验证状态。

ConnectMatcher

用于匹配 CONNECTCONNECT-UDP 请求,适用于 HTTP/1.1 的 CONNECT 请求匹配。

路由匹配流程图

以下是 Envoy 路由匹配的简化流程图,展示了多个匹配条件如何共同决定路由规则是否匹配:

image
路由匹配流程图

说明:

  1. Envoy 接收到请求后,根据配置选择匹配字段(如 prefixpath 等)。
  2. 依次检查各匹配条件是否满足。
  3. 所有匹配条件满足时,路由规则匹配成功,流量被转发到指定集群。
  4. 否则,继续检查下一个路由规则。

配置示例

以下是一个综合使用多个匹配条件的路由配置示例:

routes:
  - match:
      prefix: "/api/v1/"
      headers:
        - name: "User-Agent"
          exact_match: "Envoy"
      query_parameters:
        - name: "debug"
          present_match: true
      case_sensitive: false
    route:
      cluster: "service_v1"
  - match:
      path: "/healthcheck"
      grpc: {}
    route:
      cluster: "health_service"
  - match:
      safe_regex:
        google_re2: {}
        regex: "^/user/[0-9]+$"
      tls_context:
        presented:
          value: true
    route:
      cluster: "user_service"

说明:

  1. 第一个路由规则
    • 前缀匹配 /api/v1/,不区分大小写。
    • 请求头 User-Agent 必须精确匹配 Envoy
    • 查询参数 debug 必须存在。
    • 匹配成功后,流量转发到 service_v1 集群。
  2. 第二个路由规则
    • 精确路径匹配 /healthcheck
    • 仅匹配 gRPC 请求。
    • 匹配成功后,流量转发到 health_service 集群。
  3. 第三个路由规则
    • 使用正则表达式匹配 /user/ 后跟数字的路径。
    • 客户端必须呈现 TLS 证书。
    • 匹配成功后,流量转发到 user_service 集群。

总结

Envoy 的路由匹配机制极其灵活,支持多种匹配条件的组合使用,能够满足复杂的流量管理需求。通过合理配置 RouteMatch 的各个字段,开发者可以精准控制流量的路由行为,实现灰度发布、A/B 测试、请求过滤等高级功能。理解并掌握这些匹配条件的使用,是有效利用 Envoy 进行微服务治理的基础。

参考资料