测试环境永远不纯?我们用一套灰度体系解决了它

0 阅读3分钟

🚀 我们把前端灰度发布做成了一套“中台能力”

从分支混乱到多版本并行,我们踩过的坑,比代码还多。


一、真正的痛点,不在代码

很多人以为前端灰度很简单:

不就是加个 Header 吗?

但当你团队规模变大,需求并行增多,你会发现真正的问题是:

❌ 测试环境代码永远不纯

两个 feature 同时要上测试:

featureA
featureB

上线时间不同,但都要进测试环境。

于是只能:

merge A + merge B → 发布

测试同学测的是“未来版本”。

上线风险指数级放大。


❌ 分支模型越来越复杂

  • 临时合并分支
  • 防污染分支
  • 测试专用分支
  • 预发布临时分支

Git 结构越来越怪。


❌ SSR 根本做不了灰度

SPA 静态资源还能目录隔离。

但 SSR?

  • 多 Docker 实例
  • 动态 IP
  • 服务注册发现
  • 负载均衡

复杂度直接上一个量级。


二、我们抽象出了 4 个核心能力

我们没有做“一个灰度方案”。

我们做的是一套:

前端灰度发布中台能力

包含四层:

  1. 访问分流模型
  2. 资源隔离模型
  3. 构建标识注入模型
  4. 服务注册发现模型

三、SPA 灰度设计

核心思想:资源目录隔离

https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/1656cede24dd42d1963f1fb9ed89fdb2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5Zyo6KW_5a6J54mn576K55qE54mb5rK55p6c:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjk0NjM0Njg5NDIzMzEzMyJ9&rk3s=e9ecf3d6&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1771235770&x-orig-sign=b2TuurGef3m5YE1RgKqicKdej%2BY%3D

https://i.sstatic.net/777oP.png

4

目录结构:

/project/
   /prod/
   /default/
   /featureA/
   /featureB/

访问流程:

Client
  ↓
Header: fe-grayVersion=featureA
  ↓
Gateway
  ↓
拼接目录
  ↓
返回对应 index.html

关键构建代码:

publicPath: `${saFeUrl}/${pkg.name}/${resEnv}${feGrayVersion}`

✔ 多版本可长期共存
✔ 不依赖 Git 合并
✔ 不需要多域名


四、真正的难点:SSR 灰度

SPA 解决的是“文件隔离”。

SSR 解决的是“服务隔离”。


SSR 架构模型

https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/4f1dfff6528a49049814f45b6e56a314~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5Zyo6KW_5a6J54mn576K55qE54mb5rK55p6c:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjk0NjM0Njg5NDIzMzEzMyJ9&rk3s=e9ecf3d6&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1771235769&x-orig-sign=7B4zdHhlqm9J8UudzSZjufbF6Dg%3D

https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/d4cbcc3f42134bb29d48cdb05ffa8e5a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5Zyo6KW_5a6J54mn576K55qE54mb5rK55p6c:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjk0NjM0Njg5NDIzMzEzMyJ9&rk3s=e9ecf3d6&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1771235770&x-orig-sign=oUreUKu8ESTvg2BzpT2gsoGVO%2FY%3D

4

核心组件:

  • 服务注册:Nacos
  • 网关转发
  • 加权轮询负载均衡
  • 健康探针

流程

Client
  ↓
Header: fe-grayVersion
  ↓
Gateway
  ↓
订阅 Nacos
  ↓
根据 metadata.feGrayVersion 过滤实例
  ↓
负载均衡
  ↓
Proxy

每个灰度版本:

  • 一个 Docker 镜像
  • 一个注册实例
  • 一个 metadata 标识

我们实现的负载均衡算法

平滑加权轮询:

currentWeight += weight
选最大
减去 totalWeight

这是工业级算法。


五、DevOps 才是关键一环

灰度不是运行时问题。

而是构建问题。

构建流程:

DevOps 开启灰度
  ↓
注入 devops.json
  ↓
合并 env-cmdrc
  ↓
注入环境变量
  ↓
构建

部署规则:

灰度开关部署路径
关闭/prod
开启/prod/default
指定版本/prod/featureA

六、灰度上线后,发生了什么?

✔ 多版本真正并行

featureA
featureB
default
prod

长期共存。


✔ 分支模型大幅简化

测试不再依赖 merge。


✔ SSR 首次支持灰度

很多公司只做了 SPA 灰度。

SSR 是我们最大的技术挑战。


七、未来升级方向

下一步准备做:

  • 流量比例灰度(10% → 100%)
  • 用户 ID 稳定灰度
  • 自动异常回滚
  • 灰度 + AB 实验融合

结论

灰度发布不是一个发布技巧,而是一种架构能力。

当你的系统支持:

  • 多版本并行
  • 动态分流
  • 自动回滚
  • 无侵入扩展

它就不再是一个“发布方案”,

而是一套真正的:

前端发布中台能力。