【灰度发布(一)】服务端灰度发布需求目的和方案设计选型
一.问题背景
增加一套对内技术团队可见的服务端环境,用于模拟真实生产环境,对即将发布的版本进行完整验证。其核心目标是:
-
降低API发版风险,验证代码逻辑和接口联调是否在生产部署结构下无问题
-
让测试人员早于真实用户直面线上版本,避免线上故障
- 回归测试、冒烟测试、压测等
目前市面上主流的服务端灰度方案如下
| 灰度方案 | 描述 | 优点 | 缺点 | 典型适用场景 |
| 1. 完全物理隔离部署 | 独立部署一套灰度环境(域名+服务+中间件+数据库),通过修改Host或VIP进行切换 | - 风险隔离彻底 - 适合核心交易数据灰度验证 - 可用于客户定向预发环境 |
- 成本极高(人力、机器)需要镜像一套生产环境 - 数据同步复杂 - 环境维护压力大 |
核心金融系统灰度、政企私有云客户灰度 |
| 2. SpringCloud + Nacos metadata 标签路由 | 在注册中心配置metadata标签,灰度流量按Header或用户标识打到指定版本服务 |
- 易集成 |
- 客户端/网关需支持Header透传 |
业务系统、如:社区系统、推荐业务等 |
|
3. 基于容器编排平台(如 K8s) |
借助 Istio、Envoy 等服务网格的流量控制功能,实现按百分比、用户ID 灰度 | - 线性放量控制风险 - 可配合Prometheus监控 - 自动化回滚友好 |
- 需配套治理平台 |
使用 K8s + Istio 的 |
由于目前服务端的技术架构是基于SpringCloud的微服务架构:从实现成本和考虑到需要基于流量特征和标签的扩展性上来考虑,方案二更适用于现在的研发流程和服务端开发团队人员
因此以下主要讨论基于SpringCloud + Nacos metadata 标签路由灰度方案实现
二.基于 SpringCloud + Nacos metadata 标签路由的灰度方案
核心要求
1.实现南北向的流量灰度:客户端-->API网关-->业务服务A(灰度)
如下图所示

2.实现东西向的流量灰度:业务服务A(灰度)→ 业务服务B(灰度)

核心问题
关于请求流量标签的约定,标签生成和传递方式
目前这里有以下3种方案实现
| 方案1 | 客户端传递标签(Header/参数) | - 精准控制请求- 支持用户粒度灰度- 简单易实现 | - 客户端需改动- 老版本无法支持- 接口调用必须带标签 | 新项目/新版App灰度验证,或允许客户端配合的系统 | |
| 方案2 | Nginx 注入标签(通过灰度域名) | - 客户端无感知- 实现快速切换(如 gray-api.xxx.com)- 结构清晰,部署简单 | - 多维护一套入口域名- 依赖 Nginx 管理- 动态调整复杂(如无法细粒度控制) | Web/APP 使用统一网关、希望快速实现环境隔离 | |
| 方案3 | Gateway 注入标签(基于逻辑) | - 完全透明- 支持规则灵活扩展(IP、cookie、用户ID等)- 易于和 Nacos metadata 联动 | - 实现复杂度略高- 某些隐式规则难追踪- 若逻辑配置错误,容易影响全局路由 | API网关统一流量入口,强调自动化和灵活灰度控制 | 兜底方案 |
| 方案4 |
Nginx 注入标签 |
- 客户端无感知-客户端本地无需接入灰度域名 | -不暴露公网IP的情况下,限制使用内网访问,内网到CLB或内网到Nginx网络链路需要打通,APP配置繁琐,需要越狱或root | 内网测试 | 可通过自建DNS 实现 |
当前现状:目前使用的是第三种实现方案,API网关通过入口请求的特征去配置灰度路由以及添加指定的Header标签
优点:配置灵活,可以根据请求特征各种组合
缺点:配置流程相对比较繁琐,特别是请求特征不固定情况下,会导致路由管理混乱,需要在网关配置过滤器和断言,强依赖开发这对于网关业务的熟悉程度
- id: 灰度路由id
uri: grayLb://nn-speed //灰度路由
predicates:
- Path=/xxxx/**
- RemoteAddr=127.0.0.1//配置指定IP的断言
- Header=reqChannel,1
filters:
- StripPrefix=1
- AddRequestHeader=grayTag, 8888 //断言成功后,这里添加灰度标志,进入到灰度路由
- id: 路由id
uri: lb://xxxx //正常路由
predicates:
- Path=/xxxx/**
filters:
- StripPrefix=1
结论
经过团队内部多轮讨论,最终的确认客户端接入灰度的方案为混合方案接入
Web/PC 端:方案四
APP端:方案二

浙公网安备 33010602011771号