灰度发布机制
引用文件
目录
简介
本技术文档聚焦于 yudao-cloud 的灰度发布机制,围绕“基于 Nacos 元数据的版本路由与标签路由”展开,系统性说明从服务注册、请求接入、到流量切分与权重选择的 完整流程。文档涵盖:
- 版本路由与标签路由的实现原理与策略
- 灰度发布的完整流程与时序图
- 基于 Nacos 的配置方法与动态更新
- 基于 Nginx 的前置灰度分流方案
- 监控与可观测性建议
- 实际配置示例与常见问题排查
项目结构
与灰度发布直接相关的代码与配置主要分布在以下位置:
- 网关侧灰度负载均衡实现:yudao-gateway 模块下的灰度过滤器与负载均衡器
- 环境与标签工具:EnvUtils 工具类
- Nacos 配置中心集成:application.yaml 中的 Nacos 配置与 NacosConfigUpdater 动态更新
- 前置分流(可选):Nginx Lua 灰度分流脚本与配置
- 文档与说明:README.md 中的灰度实现说明与时序图
图表来源
- GrayReactiveLoadBalancerClientFilter.java
- GrayLoadBalancer.java
- EnvUtils.java
- EnvLoadBalancerClient.java
- application.yaml
- NacosConfigUpdater.java
- nginx.conf
- access_by_lua_block.lua
章节来源
核心组件
- 灰度过滤器(GlobalFilter)
- 作用:识别灰度请求(grayLb 方案),替换为灰度负载均衡器,完成实例选择与转发
- 关键点:对请求 URL 的 scheme 前缀进行判断,构造 LoadBalancerLifecycle 生命周期事件,最终将请求 URL 重写为具体实例地址
- 灰度负载均衡器(ReactorServiceInstanceLoadBalancer)
- 作用:根据请求头中的 version 与 tag 进行实例筛选,再基于 Nacos 权重进行随机选择
- 版本筛选:当请求头携带 version 时,仅在元数据 version 相等的实例中选择;否则回退到全部实例
- 标签筛选:当请求头携带 tag 时,进一步按 tag 过滤实例;若无匹配则回退
- 权重选择:使用 NacosBalancer 的随机权重选择算法
- 标签工具(EnvUtils)
- 作用:从请求头或服务实例元数据中提取 tag;支持将特殊占位符解析为主机名
- 环境标签负载均衡(EnvLoadBalancerClient)
- 作用:基于 tag 的实例筛选与权重选择,与灰度负载均衡器的标签逻辑一致
- Nacos 配置与动态更新
- application.yaml:声明从 Nacos 导入配置,包含 discovery 与 config 的命名空间
- NacosConfigUpdater:提供 YAML 属性智能更新能力,便于灰度配置的自动化运维
章节来源
- GrayReactiveLoadBalancerClientFilter.java
- GrayLoadBalancer.java
- EnvUtils.java
- EnvLoadBalancerClient.java
- application.yaml
- NacosConfigUpdater.java
架构总览
灰度发布整体分为两类:网关侧基于 Nacos 元数据的版本/标签路由,以及可选的前置 Nginx 基于 MAC 的分流。
图表来源
章节来源
详细组件分析
组件A:灰度过滤器(GlobalFilter)
- 职责
- 识别 grayLb 方案的请求,替换为灰度负载均衡器
- 维护 LoadBalancerLifecycle 生命周期事件,确保可观测性
- 重写请求 URL 为目标服务实例地址
- 关键行为
- 判断请求 URL 的 scheme 或 schemePrefix 是否为 grayLb
- 通过 LoadBalancerClientFactory 获取生命周期处理器
- 创 建 GrayLoadBalancer 并执行 choose
- 若无可用实例,抛出 404 异常
图表来源
章节来源
组件B:灰度负载均衡器(ReactorServiceInstanceLoadBalancer)
- 职责
- 从请求头提取 version 与 tag
- 基于 Nacos 元数据进行版本与标签筛选
- 在筛选后的实例集合中,基于 Nacos 权重进行随机选择
- 版本筛选策略
- 若请求头携带 version:仅保留元数据 version 相等的实例
- 若无 version 或无匹配:回退到全部实例
- 标签筛选策略
- 若请求头携带 tag:仅保留元数据 tag 相等的实例
- 若无 tag 或无匹配:回退到全部实例
- 权重选择
- 使用 NacosBalancer 的随机权重算法,确保权重生效
图表来源
章节来源
组件C:标签工具(EnvUtils)
- 职责
- 从请求头提取 tag;支持将占位符解析为主机名
- 从服务实例元数据提取 tag
- 用途
- 为灰度负载均衡器与环境标签负载均衡器提供统一的 tag 解析
章节来源
组件D:环境标签负载均衡(EnvLoadBalancerClient)
- 职责
- 基于 tag 过滤实例列表,并使用 Nacos 权重进行选择
- 与灰度负载均衡器的关系
- 两者均基于 tag 进行二次筛选,逻辑一致
章节来源
组件E:Nacos 配置与动态更新
- application.yaml
- 通过 spring.config.import 引入 Nacos 配置,包含 application-common.yaml、datasource.yaml 以及按环境加载的配置
- 配置 discovery 与 config 的命名空间,确保服务发现与配置读取正确
- NacosConfigUpdater
- 提供单键与批量属性更新能力,保持 YAML 格式、注释与顺序
- 适用于灰度配置的自动化运维场景(如动态调整权重、开关)
章节来源
组件F:前置分流(Nginx + Lua)
- 作用
- 基于 MAC 地址的哈希计算,将部分请求分流到新版上游(v2),其余走旧版上游(v1)
- 配置要点
- nginx.conf 中定义 backend_server_v1 与 backend_server_v2 上游
- access_by_lua_block.lua 根据请求中的 MAC 提取并计算哈希,设置 api_version 变量
- logger.lua 输出灰度命中与未命中的日志
- 适用场景
- 与网关侧灰度互补:Nginx 前置分流适合按设备维度的粗粒度灰度,网关侧更精细
章节来源