You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Envoy中如何针对特定请求头值实现可用区感知路由?

路由规则示意图

Envoy按请求头控制跨可用区路由配置方案

实现逻辑很简单,靠Envoy原生的请求头匹配+路由级负载均衡策略就能搞定,不需要拆分多个上游集群,直接在路由层做策略分流即可。

前置准备

先把基础配置补全,否则可用区路由不生效:

  • 每个Envoy实例启动时必须正确标注自身所在可用区,可以在bootstrap配置的node.locality.zone字段填写可用区标识,也可以直接加启动参数--service-zone=你的可用区标识
  • 所有上游服务端点注册时(不管是EDS还是静态配置),必须在locality.zone字段标注节点所属可用区,保证负载均衡模块能识别节点的位置属性

完整配置示例

核心是在虚拟主机下配两条头匹配规则,分别对应两种路由策略:

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 80 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          codec_type: AUTO
          stat_prefix: ingress_http
          route_config:
            name: backend_route
            virtual_hosts:
            - name: backend_vhost
              domains: ["*"]
              routes:
              # 匹配header_value=1:允许跨可用区路由
              - match:
                  prefix: "/"
                  headers:
                  - name: header_value
                    exact_match: "1"
                route:
                  cluster: backend_service
                  # 开默认可用区感知路由:优先走本地可用区,本地节点不够时自动跨区兜底
                  zone_aware_routing:
                    enabled: true
              # 匹配header_value=2:仅路由本地可用区
              - match:
                  prefix: "/"
                  headers:
                  - name: header_value
                    exact_match: "2"
                route:
                  cluster: backend_service
                  # 元数据强匹配本地可用区节点,完全禁止跨区转发
                  metadata_match:
                    filter_metadata:
                      envoy.lb:
                        zone: "%LOCAL_ZONE%"
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: backend_service
    connect_timeout: 1s
    type: EDS
    lb_policy: LEAST_REQUEST
    # 集群级开启可用区感知路由基础能力
    common_lb_config:
      zone_aware_lb_config:
        routing_enabled:
          value: 100
    eds_cluster_config:
      eds_config:
        path: ./eds.yaml

策略说明

  • 携带header_value=1的请求:走Envoy默认的可用区感知逻辑,优先转发到同可用区上游节点,当同可用区健康节点占比低于阈值时,自动转发到其他可用区节点兜底,保证服务可用性
  • 携带header_value=2的请求:路由层通过元数据强匹配规则,只筛选和当前Envoy同可用区的上游节点,完全不会转发到其他可用区;如果本地可用区没有健康节点,直接返回503,不会触发跨区调用

验证方法

  • 发请求带header_value: 1,手动把本地可用区的上游节点全部设为不健康,可以观察到请求正常转发到其他可用区节点
  • 发请求带header_value: 2,保持其他可用区节点全健康、本地可用区节点全不健康的状态,请求会直接返回503,没有跨可用区调用产生

内容的提问来源于stack exchange,提问作者Pedro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:03:29