流量切换本质是基于规则的动态路由与负载均衡协同实现,核心通过spring cloud gateway断言、nacos元数据打标、自定义loadbalancer及sentinel实时降级完成灰度、ab测试、平滑迁移与自动回切。

流量切换在微服务中本质是“按条件把请求分发到不同服务实例或版本”,不是简单开关,而是基于规则的动态路由与负载均衡协同实现。核心靠 Spring Cloud Gateway 的路由断言 + 自定义 LoadBalancer 策略,再配合注册中心(如 Nacos)的元数据打标,就能完成灰度、AB 测试、故障隔离等典型切分场景。
1. 用 Gateway 断言做路径/请求级流量分发
这是最常用、最轻量的切分方式,适合按 URL、Header、参数等维度分流:
- 配置两个路由指向同一服务的不同集群(比如
user-service-v1和user-service-v2),用Header或Query断言区分 - 示例:对带
X-Env: gray请求走 v2 版本,其余走 v1
spring:
cloud:
gateway:
routes:
- id: user-v1
uri: lb://user-service-v1
predicates:
- Header=X-Env, !gray
- id: user-v2
uri: lb://user-service-v2
predicates:
- Header=X-Env, gray
注意:lb:// 表示走服务发现,要求这两个服务名在注册中心真实存在且有对应实例。
2. 用 Nacos 元数据 + 自定义 LoadBalancer 实现实例级灰度
当需要把特定用户、设备或地区流量导向某几个带标签的实例时,需结合注册中心元数据和自定义负载均衡器:
- 在 Nacos 控制台给目标实例添加元数据,如
version=gray或zone=shanghai - 写一个继承
ServiceInstanceListSupplier的类,过滤出含指定元数据的实例列表 - 再配一个
ReactorLoadBalancer,只从该子集里选实例
这样调用方无需改代码,只要在请求头传 X-Version: gray,下游负载均衡器就自动只挑带 version=gray 标签的实例。
3. 用 Weight 断言实现平滑流量迁移
适用于新老版本逐步切流,比如从 v1 迁移到 v2,想先放 5% 流量过去验证:
- 在 Nacos 中将 v1 和 v2 实例分别归入不同分组(如
group: DEFAULT_GROUP和group: GRAY_GROUP) - Gateway 路由配置中使用
Weight断言,按组分配权重
- id: user-weighted
uri: lb://user-service
predicates:
- Weight=DEFAULT_GROUP, 95
- Weight=GRAY_GROUP, 5
该方式依赖 Nacos 分组能力,且需确保两个分组下都有健康实例,否则权重失效。
4. 配合 Sentinel 做失败自动回切
光切流不够,还要防异常。可在关键接口上加 @SentinelResource,配置降级规则:
- 当 v2 版本响应时间超过 500ms 或错误率超 30%,自动触发降级,把流量切回 v1
- 降级逻辑可自定义,比如返回兜底数据,或重定向到备用服务
这属于“智能切流”——不是静态配置,而是根据实时质量指标动态调整。











