负载均衡策略
引用文件
目录
简介
本文件面向 yudao-cloud 的灰度负载均衡策略,系统性阐述版本匹配算法、实例筛选逻辑与权重计算机制;深入解析 GrayLoadBalancer 的核心实现,包括请求头解析、服务实例过滤与基于 Nacos 权重的随机选择算法;说明基于 tag 的实例过滤机制与版本不匹配时的回退策略;并提供配置参数说明、使用示例与故障排查指南。
项目结构
灰度负载均衡能力由网关侧的全局过滤器与自定义负载均衡器共同实现,并复用环境标签(tag)的实例过滤逻辑。
图表来源
- GrayReactiveLoadBalancerClientFilter.java
- GrayLoadBalancer.java
- EnvUtils.java
- EnvLoadBalancerClient.java
章节来源
- GrayReactiveLoadBalancerClientFilter.java
- GrayLoadBalancer.java
- EnvUtils.java
- EnvLoadBalancerClient.java
核心组件
- 灰度全局过滤器:拦截 grayLb 协议的请求,注入负载均衡生命周期并委派给 GrayLoadBalancer 选择实例。
- 灰度负载均衡器:从请求头提取版本号与标签,按版本与标签双维度筛选实例,再基于 Nacos 权重进行随机选择。
- 环境标签工具:统一解析请求头 tag 与实例元数据 tag,支持特殊占位符解析为主机名。
- 环境标签负载均衡(参考):展示仅基于 tag 的实例过滤与权重选择思路,灰度 LB 复用其 tag 过滤逻辑。
章节来源
- GrayReactiveLoadBalancerClientFilter.java
- GrayLoadBalancer.java
- EnvUtils.java
- EnvLoadBalancerClient.java
架构总览
灰度请求处理时序如下:
图表来源
组件详解
GrayLoadBalancer:灰度负载均衡器
- 请求头解析
- 版本字段:从请求头读取 version,用于按服务元数据 version 进行实例筛选。
- 标签字段:从请求头读取 tag,用于按服务元数据 tag 进行实例筛选。
- 实例筛选逻辑
- 版本匹配:若请求头携带 version,仅保留元数据 version 相等的实例;若无匹配或无 version 头,则回退到全部实例。
- 标签匹配:在版本筛选结果上进一步按 tag 过滤;若无匹配或无 tag 头,则回退到当前集合。
- 权重计算与选择
- 在最终候选实例集中,使用 Nacos 的随机权重算法进行实例选择。
- 关键注意
- 当前权重依赖 Nacos 的 nacos.weight;若更换注册中心,需调整权重选择逻辑。
图表来源
章节来源
GrayReactiveLoadBalancerClientFilter:灰度全局过滤器
- 功能职责
- 识别 grayLb 协议的请求,注入负载均衡生命周期回调。
- 直接构造 GrayLoadBalancer 并委派实例选择,替代默认的 ReactiveLoadBalancerClientFilter。
- 生命周期与错误处理
- 正常流程:记录生命周期事件、更新请求 URL、写入响应上下文。
- 异常流程:触发生命周期完成事件并抛出未找到实例异常。
- 回退策略
- 若非 grayLb 协议,直接放行至后续过滤器链。
图表来源
章节来源
基于 tag 的实例过滤机制
- 请求头与实例元数据
- 请求头 tag:可通过特殊占位符解析为主机名,便于本地调试。
- 实例元数据 tag:来源于服务实例的 metadata。
- 过滤策略
- 若请求头存在 tag,仅保留元数据 tag 相等的实例;若无匹配或无 tag,则回退到全部实例。
- 与版本匹配的关系
- tag 过滤在版本过滤之后执行,确保先按版本缩小候选集,再按环境标签进一步收敛。
章节来源
版本不匹配时的回退策略
- 版本匹配失败或缺失时,灰度 LB 会回退到全部可用实例,保证服务可用性。
- 该策略与 tag 过滤相互独立:即使版本回退,仍可按 tag 进一步筛选。
章节来源
权重计算机制
- 当前实现
- 在候选实例集中,使用 Nacos 的随机权重算法进行实例选择。
- 扩展建议
- 若更换注册中心,需替换为对应注册中心提供的权重选择实现。
章节来源
依赖关系分析
- 组件耦合
- GrayReactiveLoadBalancerClientFilter 依赖 GrayLoadBalancer;GrayLoadBalancer 依赖 EnvUtils 与 Nacos 权重选择。
- EnvLoadBalancerClient 提供了仅基于 tag 的过滤与权重选择思路,灰度 LB 复用其 tag 过滤逻辑。
- 外部依赖
- Nacos 注册中心提供服务实例列表与元数据(version/tag)。
- Spring Cloud LoadBalancer 提供基础的负载均衡抽象与生命周期回调。
图表来源
- GrayReactiveLoadBalancerClientFilter.java
- GrayLoadBalancer.java
- EnvUtils.java
- EnvLoadBalancerClient.java
章节来源
- GrayReactiveLoadBalancerClientFilter.java
- GrayLoadBalancer.java
- EnvUtils.java
- EnvLoadBalancerClient.java
性能考量
- 选择策略复杂度
- 版本与 tag 过滤均为线性扫描,时间复杂度 O(n);在实例规模较大时,建议控制候选集大小(通过路由或网关规则)。
- 权重选择
- 基于 Nacos 的权重随机选择,避免额外计算开销;若更换注册中心,需评估新实现的性能与一致性。
- 日志与可观测性
- 灰度 LB 在回退与空实例时输出警告日志,便于定位问题;结合 SkyWalking/Prometheus 可观测性体系进行监控。
[本节为通用性能讨论,无需列出具体文件来源]
故障排查指南
- 常见问题与定位
- 未命中版本实例:确认请求头 version 是否正确传递,以及服务实例元数据 version 是否一致。
- 未命中标签实例:确认请求头 tag 是否正确传递,以及服务实例元数据 tag 是否一致;注意特殊占位符解析为主机名的情况。
- 实例为空:检查注册中心健康状态与服务发现配置。
- 未走灰度路径:确认请求 URL Scheme 是否为 grayLb。
- 关键日志位置
- 版本回退与标签回退均有 明确警告日志,便于快速定位。
- 相关配置
- Nacos 地址与命名空间:确保网关侧配置正确,以便获取正确的服务实例列表。
章节来源
结论
yudao-cloud 的灰度负载均衡通过“版本 + 标签”的双维筛选与 Nacos 权重随机选择,实现了可控、可回退的灰度流量分配。其核心在于:
- 明确的版本匹配与回退策略;
- 可扩展的标签过滤机制;
- 与注册中心紧密耦合的权重选择。
在生产环境中,建议:
- 明确版本与标签的语义边界;
- 控制候选实例规模;
- 做好灰度开关与回退策略的治理。
[本节为总结性内容,无需列出具体文件来源]