灰度发布通过权重配置分流请求,核心是按预设比例将流量分发至新旧版本服务实例。需选支持权重的网关(如nginx、spring cloud gateway等),确保实例可区分、负载均衡策略启用、权重为正整数且有参照系,并支持动态调整、监控与快速回滚。

直接用权重配置分流请求做灰度发布,核心是让新旧版本服务实例按预设比例承接流量,不依赖用户身份或请求内容,适合初期验证稳定性。关键在于选对工具、配对参数、动态可调。
选对支持权重的网关或框架
不是所有中间件都原生支持按权重分发。常用且成熟的选择包括:
-
Nginx / Nginx Ingress:通过
upstream块中weight参数设定,如server a.example.com weight=80;和server b.example.com weight=20;,默认按加权轮询分发 -
Spring Cloud Gateway:使用
Weight路由断言,需配合服务注册中心(如 Nacos)中不同版本实例的元数据标识,并在路由配置里显式定义权重组 - Shenyu 网关:在管理控制台“上游服务”页面为每个实例设置权重值,Divide 插件自动按比例路由
-
Dubbo:在服务提供者侧通过注册中心(如 ZooKeeper)动态设置
weight参数,消费者拉取后按权重选择节点 -
brpc:客户端配置
load_balancer_name="wrr",并在server_list中指定各地址及对应整数权重
权重配置要满足三个基本条件
光写个数字不够,必须确保实际生效:
-
服务实例可区分:新旧版本不能共用同一个服务名或 IP+端口;例如在 Nacos 中,v1 实例打标
version: 1.0,v2 打标version: 2.0;在 Nginx 中则必须是两个独立域名或地址 -
负载均衡策略启用:比如 Spring Cloud Gateway 默认不启用 Weight 断言,需在路由配置中明确写出
- weight=group1, 80这类语句;Nginx 必须用upstream块,不能直接proxy_pass单地址 - 权重值为正整数且有参照系:权重本身无单位,只看相对大小。设 v1 权重 70、v2 权重 30,等效于 7:3;设 v1=7、v2=3 效果相同。避免用 1 和 0.3 这类非整数(部分组件不支持)
上线后要能动态调整和观测
灰度不是设完就完事,得随时响应数据反馈:
-
支持热更新:Nginx 需
nginx -s reload;Shenyu、Dubbo 管理后台可点选修改;Spring Cloud Gateway 结合 Actuator + 配置中心(如 Apollo)也能实现运行时刷新 - 监控关键指标:重点看新版本的错误率、平均延迟、QPS 是否突增或骤降;旧版本是否因流量减少出现连接空闲超时等问题
- 预留快速回滚路径:比如把新版本权重一键调回 0,或临时在 Nginx 中注释掉新服务行并 reload;不要等出问题再找配置文件
常见踩坑点提醒
这些细节容易被忽略,但直接影响灰度效果:
- Nginx 的
weight在ip_hash或least_conn模式下不生效,必须确认未开启冲突策略 - Spring Cloud Gateway 的 Weight 断言要求同一权重组内所有路由目标必须属于同一服务名(如都指向
my-service),不能混用不同服务 - brpc 的 WRR 权重会受延迟自动惩罚——如果新版本响应慢,权值会被动态压低,可能偏离你设定的 20%,需关注
quadratic_latency设置 - 权重只控制“请求分发比例”,不保证单个用户会固定打到同一版本(即无会话保持),如需用户级一致性,得叠加 Cookie 或 Header 路由











