Dubbo 提供了丰富的 负载均衡策略(LoadBalance) 和 集群容错模式(Cluster),用于在多个服务提供者(Provider)之间分配请求,并在部分节点失败时保证调用的可靠性。
一、Dubbo 的负载均衡策略(LoadBalance)
负载均衡策略决定了 Consumer 在调用多个 Provider 时,如何选择其中一个节点。
1. 支持的负载均衡策略
| 策略 | 名称 | 说明 |
|---|---|---|
random | 随机(默认) | 按权重随机选择一个 Provider,调用量越大越均匀 |
roundrobin | 轮询 | 按权重循环分配请求,适合性能相近的节点 |
leastactive | 最少活跃调用 | 优先调用活跃连接最少的节点,适合响应时间差异大的服务 |
consistenthash | 一致性哈希 | 相同参数的请求总是发到同一个节点,适用于缓存类场景 |
2. 各策略详解
(1)random(随机)
- 默认策略
- 支持权重(weight),权重越大被选中的概率越高
- 性能高,调用分布较均匀
- 适用场景:大多数通用场景
<dubbo:reference interface="com.example.UserService" loadbalance="random"/>
(2)roundrobin(轮询)
- 按权重循环调度
- 例如:A 权重 2,B 权重 1 → A,A,B,A,A,B…
- 适合节点性能接近的场景
- 可能存在“跨轮次延迟”问题(新节点加入后需等待轮到)
(3)leastactive(最少活跃调用)
- 活跃调用数 = 正在处理的请求数
- 优先选择处理中请求最少的节点
- 能自动实现“慢节点少分配”
- 适用场景:响应时间差异大、存在慢服务的场景
例如:A 正在处理 3 个请求,B 正在处理 1 个 → 优先选 B
(4)consistenthash(一致性哈希)
- 相同参数的请求始终路由到同一个 Provider
- 使用哈希环 + 虚拟节点保证均衡性
- 适用场景:
- 需要会话保持(如缓存)
- 减少重复计算(如风控规则)
- 可指定参与哈希的参数:
<dubbo:reference interface="com.example.UserService" loadbalance="consistenthash">
<dubbo:parameter key="hash.arguments" value="0,1" /> <!-- 参数0和1参与哈希 -->
</dubbo:reference>
3. 如何配置负载均衡
方式一:XML 配置
<!-- 消费者端 -->
<dubbo:reference interface="com.example.UserService" loadbalance="leastactive"/>
<!-- 提供者端(全局) -->
<dubbo:service interface="com.example.UserService" loadbalance="roundrobin"/>
方式二:注解(Dubbo 2.7+)
@DubboReference(loadbalance = "consistenthash")
private UserService userService;
方式三:URL 配置(如通过 Nacos)
dubbo://192.168.1.100:20880/com.example.UserService?loadbalance=leastactive
二、Dubbo 的集群容错模式(Cluster)
集群容错是指当 调用多个 Provider 时,某个节点失败如何处理。
1. 支持的集群容错模式
| 模式 | 名称 | 说明 |
|---|---|---|
failover | 失败自动切换(默认) | 失败后重试其他节点 |
failfast | 快速失败 | 一次失败就报错,不重试 |
failsafe | 失败安全 | 记录日志,忽略异常,返回空结果 |
failback | 失败自动恢复 | 记录失败请求,后台定时重试 |
forking | 并行调用 | 同时调用多个节点,任一成功即返回 |
broadcast | 广播调用 | 调用所有节点,任意一个失败则整体失败 |
2. 各模式详解
(1)failover(失败自动切换) ✅ 默认
- 调用失败后,自动重试其他节点(默认重试 2 次,共 3 次调用)
- 适用场景:读操作、幂等操作
- 注意:非幂等操作(如写)慎用,可能导致重复提交
<dubbo:reference cluster="failover" retries="2"/>
(2)failfast(快速失败)
- 一次调用失败立即抛出异常,不重试
- 适用场景:非关键服务、写操作、实时性要求高
- 避免因重试导致延迟增加
<dubbo:reference cluster="failfast"/>
(3)failsafe(失败安全)
- 出现异常时,仅记录日志,返回
null或空集合 - 适用场景:日志上报、监控数据采集等非关键服务
<dubbo:reference cluster="failsafe"/>
(4)failback(失败自动恢复)
- 调用失败后,将请求加入队列,后台定时重试
- 适用场景:消息通知、异步任务
- 保证最终成功
<dubbo:reference cluster="failback" failsent="true"/>
(5)forking(并行调用)
- 同时向多个 Provider 发起调用,任意一个成功就返回
- 适用场景:对响应时间要求极高,容忍资源浪费
- 缺点:资源消耗大
<dubbo:reference cluster="forking" forks="3"/> <!-- 同时调用3个 -->
(6)broadcast(广播调用)
- 向所有 Provider 发起调用,只要有一个失败,整体失败
- 适用场景:本地缓存刷新、配置更新
<dubbo:reference cluster="broadcast"/>
3. 如何配置集群容错
XML 配置
<dubbo:reference interface="com.example.UserService"
cluster="failover"
retries="2"
timeout="5000"/>
注解方式
@DubboReference(cluster = "failfast", timeout = 3000)
private UserService userService;
三、负载均衡 vs 集群容错 对比
| 对比项 | 负载均衡(LoadBalance) | 集群容错(Cluster) |
|---|---|---|
| 作用时机 | 选择一个节点 | 处理调用失败后的策略 |
| 调用次数 | 一次调用选一个节点 | 可能多次调用(如重试) |
| 默认策略 | random | failover |
| 配置位置 | loadbalance 属性 | cluster 属性 |
| 关系 | 是 Cluster 内部的一部分(在重试时也会重新 LoadBalance) | 包含 LoadBalance,是更高层的控制逻辑 |
💡 举例:
failover + random
第一次调用随机选 A,失败 → 重试,再次随机选 B
四、最佳实践建议
| 场景 | 推荐配置 |
|---|---|
| 通用读服务 | cluster=failover, retries=2, loadbalance=random |
| 写操作 / 非幂等 | cluster=failfast(避免重复提交) |
| 缓存类服务 | loadbalance=consistenthash |
| 高可用关键服务 | cluster=failover + 健康检查 |
| 日志上报 | cluster=failsafe |
| 配置刷新 | cluster=broadcast |
| 极致低延迟 | cluster=forking(牺牲资源换速度) |
五、总结
| 类别 | 策略 | 说明 |
|---|---|---|
| 负载均衡 | random、roundrobin、leastactive、consistenthash | 决定“选哪个” |
| 集群容错 | failover、failfast、failsafe、failback、forking、broadcast | 决定“失败了怎么办” |
✅ Dubbo 的高可用和高性能,正是通过灵活组合 LoadBalance 和 Cluster 实现的。
掌握这些策略,能让你在不同业务场景下做出最优选择。
1379

被折叠的 条评论
为什么被折叠?



