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

如何在Envoy中配置服务A与B的故障自动切换回退策略?

Envoy主备服务切换配置方案

针对你描述的主备服务切换需求,可通过Envoy的集群优先级配置+健康检查实现主服务A存活时转发至A,A不可用自动切到B,A恢复后切回的逻辑,同时适配两个服务的HTTPS/HTTP差异及不同端点路径。

核心配置思路

  • 定义两个集群分别对应服务A和B,设置A为高优先级(primary),B为低优先级(secondary)
  • 为两个集群配置对应协议的健康检查,确保Envoy能实时感知服务状态
  • 通过路由规则实现请求路径的动态重写,匹配目标服务的端点
  • 监听外部请求端口,将流量转发至配置好的主备集群

完整配置示例

static_resources:
  listeners:
  - name: main_listener
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 } # 外部请求入口端口,可按需调整
    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: main_route
            virtual_hosts:
            - name: main_host
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route:
                  cluster: active_service_cluster
                  retry_policy:
                    retry_on: "5xx,gateway-error,connect-failure,refused-stream"
                    num_retries: 2
                # 路径重写:根据目标集群动态替换请求路径
                typed_per_filter_config:
                  envoy.filters.http.router:
                    "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
                    dynamic_config:
                      path_rewrite_policy:
                        replace_prefix:
                          prefix: "/"
                          replacement: "/dataservice1/A" # 默认主服务A的端点路径
                      override_cluster_config:
                      - cluster_name: service_b_cluster
                        path_rewrite_policy:
                          replace_prefix:
                            prefix: "/"
                            replacement: "/dataservice2/B" # 切换到B时替换为对应端点路径
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

  clusters:
  # 主服务A集群(HTTPS协议)
  - name: service_a_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    priority: 0 # 最高优先级
    load_assignment:
      cluster_name: service_a_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 127.0.0.1, port_value: 8445 }
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
        sni: "localhost" # 服务A的SNI,需与服务端证书域名匹配
    health_checks:
    - timeout: 1s
      interval: 5s
      unhealthy_threshold: 2
      healthy_threshold: 2
      http_health_check:
        path: "/dataservice1/A/health" # 替换为服务A实际健康检查端点,无专用端点可复用业务路径
        port_value: 8445
        tls_config:
          sni: "localhost"

  # 备用服务B集群(HTTP协议)
  - name: service_b_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    priority: 1 # 次优先级
    load_assignment:
      cluster_name: service_b_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 127.0.0.1, port_value: 9446 }
    health_checks:
    - timeout: 1s
      interval: 5s
      unhealthy_threshold: 2
      healthy_threshold: 2
      http_health_check:
        path: "/dataservice2/B/health" # 替换为服务B实际健康检查端点

  # 组合主备集群的逻辑集群
  - name: active_service_cluster
    type: CLUSTER_TYPE
    lb_policy: ROUND_ROBIN
    cluster_type:
      name: envoy.cluster_types.priority
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.cluster_types.priority.v3.PriorityClusterConfig
        clusters:
        - cluster: service_a_cluster
        - cluster: service_b_cluster

关键配置说明

  1. 监听器配置

    • 监听0.0.0.0:8080作为外部请求入口,可根据业务需求调整端口
    • 通过http_connection_manager处理HTTP请求,并将流量路由到组合逻辑集群active_service_cluster
  2. 动态路径重写

    • 利用dynamic_config实现基于目标集群的路径替换:流量转发到A时自动替换为/dataservice1/A,切换到B时替换为/dataservice2/B,确保外部请求能正确映射到对应服务的业务端点
  3. 集群优先级与健康检查

    • service_a_cluster设为优先级0(最高),service_b_cluster设为优先级1,Envoy会优先选择优先级最高且健康的集群
    • 为A配置HTTPS健康检查,为B配置HTTP健康检查,通过interval(检查间隔)、unhealthy_threshold(判定不健康的连续失败次数)等参数控制状态感知逻辑
    • 当A健康时,流量全部发往A;A连续失败达到阈值后,自动切换到B;A恢复健康后,会切回A
  4. TLS适配

    • 服务A为HTTPS,因此在service_a_cluster中配置UpstreamTlsContext并设置SNI,确保Envoy与服务A的HTTPS通信正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:50:18