跳到主要内容

负载均衡策略

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 组件详解
  6. 依赖关系分析
  7. 性能优化建议
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向 yudao-cloud 的负载均衡策略,聚焦于 Spring Cloud LoadBalancer 与网关侧灰度发布机制。内容涵盖:

  • Ribbon 与 Spring Cloud LoadBalancer 的实现原理与差异
  • 灰度发布的负载均衡机制:基于版本号的实例筛选、权重分配与故障转移
  • 负载均衡算法选择:轮询、随机、加权、响应时间等策略
  • 性能优化:连接池、超时、健康检查参数调整
  • 配置示例与监控指标说明

注意:yudao-cloud 在网关层采用 Spring Cloud LoadBalancer,并通过自定义过滤器与负载均衡器实现灰度能力;同时在基础设施模块提供 Prometheus 与 Micrometer 指标集成,便于观测。

项目结构

与负载均衡相关的关键位置:

  • 网关层:灰度过滤器与灰度负载均衡器
  • 框架层:多环境 RPC 自动装配与客户端工厂
  • 配置层:应用配置与生产配置
  • 监控层:Prometheus 服务发现与通用指标标签

Mermaid Diagram Code:

graph TB
subgraph "网关层"
F["GrayReactiveLoadBalancerClientFilter<br/>灰度负载均衡过滤器"]
L["GrayLoadBalancer<br/>灰度负载均衡器"]
end
subgraph "框架层"
AC["YudaoEnvRpcAutoConfiguration<br/>RPC 自动装配"]
CF["EnvLoadBalancerClientFactory<br/>Env 客户端工厂"]
end
subgraph "配置层"
APP["application.yaml<br/>应用配置"]
PROD["application-prod.yaml<br/>生产配置"]
end
subgraph "监控层"
PC["PrometheusController<br/>服务发现接口"]
MA["YudaoMetricsAutoConfiguration<br/>通用指标标签"]
end
F --> L
AC --> CF
CF --> L
APP --> F
PROD --> APP
PC --> APP
MA --> APP

图示来源

章节来源

核心组件

  • 灰度负载均衡过滤器:拦截以特定 scheme(grayLb)开头的请求,注入灰度负载均衡器并完成实例选择与 URI 重建。
  • 灰度负载均衡器:从请求头提取版本号与标签,按版本与标签筛选实例,再基于权重随机选择目标实例。
  • 多环境 RPC 自动装配:替换默认客户端工厂,增强基于标签的实例过滤能力。
  • 配置与监控:应用配置引入 Nacos 与本地配置;基础设施提供 Prometheus 服务发现与通用指标标签。

章节来源

架构总览

下图展示灰度请求在网关侧的处理时序与组件交互。

Mermaid Diagram Code:

sequenceDiagram
participant C as "客户端"
participant G as "GrayReactiveLoadBalancerClientFilter"
participant LB as "GrayLoadBalancer"
participant N as "注册中心(Nacos)"
participant S as "目标服务实例"
C->>G : "请求(Header : version/tag, Scheme : grayLb)"
G->>G : "校验 URL Scheme 并保存原始 URL"
G->>LB : "构造请求上下文并调用 choose()"
LB->>N : "拉取可用实例列表(含 metadata)"
N-->>LB : "返回实例列表"
LB->>LB : "按 version/tag 筛选实例"
LB->>LB : "基于权重随机选择实例"
LB-->>G : "返回目标 ServiceInstance"
G->>S : "重建 URI 并转发请求"
S-->>C : "返回响应"

图示来源

章节来源

组件详解

灰度负载均衡过滤器(Gateway)

  • 功能要点
    • 仅对以 grayLb 为 scheme 的请求生效,拦截后注入灰度负载均衡器。
    • 通过 LoadBalancerClientFactory 获取生命周期处理器,执行 onStart/onComplete 等钩子。
    • 选择实例后重建 URI 并写入上下文,继续链路转发。
  • 关键行为
    • 选择实例失败时抛出找不到实例异常,触发 404 或回退策略(由属性控制)。
    • 支持安全实例(HTTPS)与非安全实例(HTTP)的协议覆盖。

Mermaid Diagram Code:

flowchart TD
Start(["进入 filter"]) --> CheckScheme["检查 URL Scheme 是否为 grayLb"]
CheckScheme --> |否| Pass["放行至下游链路"]
CheckScheme --> |是| BuildReq["构造请求上下文与生命周期处理器"]
BuildReq --> Choose["调用 GrayLoadBalancer.choose()"]
Choose --> HasInst{"是否找到实例?"}
HasInst --> |否| ThrowErr["抛出找不到实例异常"]
HasInst --> |是| Rebuild["重建 URI 并写入上下文"]
Rebuild --> Next["继续链路"]
Pass --> End(["结束"])
ThrowErr --> End
Next --> End

图示来源

章节来源

灰度负载均衡器(Reactor)

  • 功能要点
    • 从请求头读取 version 与 tag,分别进行版本与标签筛选。
    • 若无匹配版本或版本头缺失,则回退到全部实例。
    • 最终在候选实例中基于权重进行随机选择。
  • 算法说明
    • 版本筛选:根据实例元数据中的 version 字段匹配。
    • 标签筛选:根据请求头 tag 与实例元数据中的 tag 匹配。
    • 权重选择:使用 Nacos 提供的随机加权算法(HostByRandomWeight3)。

Mermaid Diagram Code:

flowchart TD
Enter(["进入 choose"]) --> GetHdr["读取请求头(version/tag)"]
GetHdr --> Fetch["获取实例列表"]
Fetch --> Empty{"实例为空?"}
Empty --> |是| EmptyResp["返回空响应"]
Empty --> |否| FilterVer["按 version 筛选"]
FilterVer --> VerEmpty{"筛选后为空?"}
VerEmpty --> |是| UseAll["使用全部实例"]
VerEmpty --> |否| UseSel["使用筛选结果"]
UseAll --> FilterTag["按 tag 再次筛选"]
UseSel --> FilterTag
FilterTag --> Weight["基于权重随机选择实例"]
Weight --> Done(["返回目标实例"])

图示来源

章节来源

多环境 RPC 自动装配与客户端工厂

  • 功能要点
    • 替换默认 LoadBalancerClientFactory,返回带 EnvLoadBalancerClient 代理的 ReactiveLoadBalancer。
    • 通过 EnvRequestInterceptor 注入标签等请求头,辅助实例筛选。
  • 适用场景
    • 当注册中心为 Nacos 时,可直接利用其权重与元数据能力。
    • 若更换注册中心,需调整权重与元数据解析逻辑。

Mermaid Diagram Code:

classDiagram
class YudaoEnvRpcAutoConfiguration {
+loadBalancerClientFactory(...)
+envRequestInterceptor()
}
class EnvLoadBalancerClientFactory {
+getInstance(serviceId)
}
class EnvLoadBalancerClient {
+choose(request)
}
YudaoEnvRpcAutoConfiguration --> EnvLoadBalancerClientFactory : "创建"
EnvLoadBalancerClientFactory --> EnvLoadBalancerClient : "包装"

图示来源

章节来源

配置与使用示例

  • 网关配置
    • 应用配置引入 Nacos 与本地配置,支持按环境切换。
    • 生产配置示例展示了如何启用 Nacos 注册与配置中心。
  • 灰度调用方式
    • 请求 scheme 使用 grayLb,header 中携带 version 与 tag,即可触灰色度策略。
  • Nacos 元数据
    • 服务实例元数据中可包含 version 与 tag,用于灰度筛选与权重配置。

章节来源

依赖关系分析

  • 组件耦合
    • GrayReactiveLoadBalancerClientFilter 依赖 LoadBalancerClientFactory 与 GatewayLoadBalancerProperties。
    • GrayLoadBalancer 依赖 ServiceInstanceListSupplier 与 NacosBalancer。
    • EnvLoadBalancerClientFactory 依赖 Spring Cloud LoadBalancer 的工厂体系。
  • 外部依赖
    • 注册中心:Nacos(版本与权重元数据)。
    • 监控:Prometheus 与 Micrometer(指标暴露与服务发现)。

Mermaid Diagram Code:

graph LR
F["GrayReactiveLoadBalancerClientFilter"] --> L["GrayLoadBalancer"]
L --> S["ServiceInstanceListSupplier"]
L --> NB["NacosBalancer"]
AC["YudaoEnvRpcAutoConfiguration"] --> CF["EnvLoadBalancerClientFactory"]
CF --> L
APP["application.yaml"] --> F
PC["PrometheusController"] --> APP
MA["YudaoMetricsAutoConfiguration"] --> APP

图示来源

章节来源

性能优化建议

  • 连接池与超时
    • 网关侧请求超时与重试策略建议结合业务特性配置,避免长尾延迟放大。
    • 服务端连接池参数(最大连接、空闲回收、校验周期)应与实例数量与 QPS 匹配,减少连接抖动。
  • 健康检查
    • 结合 Actuator 健康检查端点与注册中心健康状态联动,缩短故障实例剔除时间。
    • Prometheus 抓取间隔与超时需与实例规模匹配,避免过度拉取导致抖动。
  • 算法与缓存
    • 在实例数量稳定且权重变化较少时,可考虑缓存实例权重计算结果,降低每次选择开销。
    • 避免在高并发场景下频繁进行大规模实例筛选,必要时通过标签缩小候选集。
  • 监控与告警
    • 通过 Micrometer 通用标签与 Prometheus 服务发现,建立实例级与服务级指标看板。
    • 关注实例选择成功率、平均响应时间、错误率与 GC/线程池等 JVM 指标。

[本节为通用性能指导,无需列出具体文件来源]

故障排查指南

  • 现象:灰度请求未生效
    • 检查请求 scheme 是否为 grayLb,以及是否正确传递 version 与 tag。
    • 确认服务实例元数据中是否存在 version 与 tag 字段。
  • 现象:找不到实例(404)
    • 灰度负载均衡器在未找到实例时会抛出找不到实例异常,检查实例健康状态与筛选条件。
  • 现象:流量未按预期分布
    • 核对 Nacos 权重配置与实例元数据,确保权重值正确。
    • 若更换注册中心,需同步调整权重与元数据解析逻辑。
  • 监控定位
    • 使用 Prometheus 服务发现接口确认实例列表与标签。
    • 通过 Micrometer 指标查看请求量、错误率与延迟分布。

章节来源

结论

yudao-cloud 在网关层通过 Spring Cloud LoadBalancer 与自定义灰度组件实现了灵活的灰度发布能力:以请求头为入口,结合版本与标签进行实例筛选,并在候选集中基于权重随机选择。配合 Nacos 元数据与 Micrometer/Prometheus 监控,可在保证稳定性的同时实现平滑的流量切分与快速回滚。

[本节为总结性内容,无需列出具体文件来源]

附录

Ribbon 与 Spring Cloud LoadBalancer 的对比与选择

  • 实现原理
    • Ribbon:基于客户端的负载均衡,内置多种算法与丰富的扩展点,但已停止维护。
    • Spring Cloud LoadBalancer:基于 Spring Cloud 的新一代客户端负载均衡,与注册中心解耦更彻底,生态更契合当前技术栈。
  • 灰度能力
    • Ribbon:可通过自定义 IRule 与 ServerList 实现版本/标签筛选与权重分配。
    • Spring Cloud LoadBalancer:通过自定义 ReactorServiceInstanceLoadBalancer 与 ServiceInstanceListSupplier 更易扩展,且与网关过滤器天然契合。
  • 建议
    • 新项目优先采用 Spring Cloud LoadBalancer;存量 Ribbon 项目可逐步迁移。

[本节为概念性内容,无需列出具体文件来源]

灰度发布策略与算法

  • 版本号筛选
    • 依据请求头 version 与实例元数据 version 匹配,实现小流量灰度。
  • 标签筛选
    • 依据请求头 tag 与实例元数据 tag 匹配,实现区域/环境隔离。
  • 权重分配
    • 在候选实例中基于权重随机选择,实现渐进式流量切分。
  • 故障转移
    • 当目标实例不可用时,回退到其他可用实例;若仍无可用实例,触发异常处理。

章节来源

配置示例与监控指标

  • 配置示例
    • 网关应用配置:引入 Nacos 与本地配置,按环境切换。
    • 灰度调用:请求 scheme 使用 grayLb,header 传入 version 与 tag。
  • 监控指标
    • Prometheus 服务发现接口:/actuator/prometheus/sd
    • 通用指标标签:通过 YudaoMetricsAutoConfiguration 注入 application 标签

章节来源

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答