【灰度发布(一)】服务端灰度发布需求目的和方案设计选型

一.问题背景

增加一套对内技术团队可见的服务端环境,用于模拟真实生产环境,对即将发布的版本进行完整验证。其核心目标是:

  • 降低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(灰度)

  如下图所示

image

 

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

image

核心问题

关于请求流量标签的约定,标签生成和传递方式

目前这里有以下3种方案实现

方案1 客户端传递标签(Header/参数) - 精准控制请求- 支持用户粒度灰度- 简单易实现 - 客户端需改动- 老版本无法支持- 接口调用必须带标签 新项目/新版App灰度验证,或允许客户端配合的系统  
方案2 Nginx 注入标签(通过灰度域名) - 客户端无感知- 实现快速切换(如 gray-api.xxx.com)- 结构清晰,部署简单 - 多维护一套入口域名- 依赖 Nginx 管理- 动态调整复杂(如无法细粒度控制) Web/APP 使用统一网关、希望快速实现环境隔离  
方案3 Gateway 注入标签(基于逻辑) - 完全透明- 支持规则灵活扩展(IP、cookie、用户ID等)- 易于和 Nacos metadata 联动 - 实现复杂度略高- 某些隐式规则难追踪- 若逻辑配置错误,容易影响全局路由 API网关统一流量入口,强调自动化和灵活灰度控制 兜底方案
方案4

Nginx 注入标签
通过修改本地Hosts 解析到指定IP
 

- 客户端无感知-客户端本地无需接入灰度域名 -不暴露公网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端:方案二

 

posted @ 2025-08-22 20:06  听风是雨  阅读(39)  评论(0)    收藏  举报
/* 看板娘 */