全局守卫是全站灰度发布的天然入口,通过“识别→判断→分流”闭环实现路由前统一灰度决策,结合元信息、开关服务与动态导航,对业务透明且支持链路一致性。

全局守卫是实现全站灰度发布的天然入口,它在每次路由跳转前统一拦截,适合集中判断是否进入灰度逻辑。关键不在于“拦住所有请求”,而是在守卫中提取用户特征、查开关状态、动态决定走新版还是旧版路由——整个过程对业务组件透明,也不需要改每个页面的代码。
守卫中做灰度决策的三步闭环
真正的灰度控制不是简单跳转,而是“识别→判断→分流”闭环:
-
识别上下文:从路由元信息(
to.meta.gray)、请求头(X-Gray-Group)、用户登录态(user.role或user.id)、甚至 URL 参数(?v=canary)中提取灰度依据 -
判断开关状态:调用统一的
FeatureService.shouldEnable('new-home'),内部基于缓存(如 Redis)读取当前功能是否开启、对哪些用户生效、流量比例多少 -
执行分流动作:不硬编码跳转路径,而是通过
router.resolve()预解析目标路由,再用next({ ... })显式导航;可重定向到灰度版路由(如/home-v2),也可复用同一组件但传入不同 props 标识版本
路由元信息 + 动态匹配策略
避免在每个 router.addRoute() 里重复写灰度逻辑,推荐把灰度配置下沉到路由定义本身:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 给需灰度的路由加元字段:
{ path: '/dashboard', meta: { feature: 'new-dashboard', percentage: 15 } } - 守卫中读取
to.meta.feature,自动拼接缓存 key(如feature:new-dashboard:ip:10.10.1.5或feature:new-dashboard:user:U12345) - 支持多级 fallback:先查用户白名单 → 再按哈希 ID 分流 → 最后兜底看全局开关,保证灰度可控、可退
与后端协同的链路一致性保障
前端守卫只管“看到什么”,但数据和接口也得同步灰度,否则出现界面新、接口旧的错配:
- 在守卫确认进入灰度后,往请求拦截器(如 Axios Interceptor)里自动注入 header:
X-Release-Phase: canary - 若使用微服务网关,该 header 会透传至下游服务,触发全链路灰度路由(如 Spring Cloud Gateway + Nacos 规则匹配)
- 前端组件内发起 API 调用时,不再依赖硬编码的
/api/v1/user,而是通过apiClient.get('/user', { version: 'v2' })由 client 自动拼接灰度路径或 header
功能开关的劫持不是覆盖,而是增强
所谓“劫持”,不是替换原有路由行为,而是在标准流程中插入一层轻量适配:
- 守卫里不做业务渲染,只决定
next()的参数;组件内部仍用v-if="isCanary"控制局部 UI 差异,保持职责清晰 - 开关状态变更(如运营后台关闭灰度)后,前端无需刷新——利用事件总线或 Pinia store 订阅变更,触发
router.replace()重定向到稳定版 - 保留强制灰度入口:开发环境访问
/?debug=gray可绕过所有规则直接进灰度,方便联调









