在 Java + Dubbo 中,负载均衡(Load Balance)是 Consumer 端 在调用 Provider 时选择具体服务实例的策略。Dubbo 内置了多种负载均衡策略,也支持自定义。
下面从 使用方式 → 内置策略 → 配置方式 → 自定义实现 系统讲一下。
org.apache.dubbo.rpc.cluster.LoadBalanceDubbo 默认提供了 4 种(常见):
| 策略 | 说明 |
|---|---|
random |
默认,按权重随机 |
roundrobin |
按权重轮询 |
leastactive |
最少活跃调用数(慢机器自然少分) |
consistenthash |
一致性 Hash(适合有状态服务) |
<dubbo:service interface="com.xxx.UserService"
loadbalance="roundrobin"/>
服务端配置会被 Consumer 覆盖
<dubbo:reference interface="com.xxx.UserService"
loadbalance="roundrobin"/>
@DubboReference(loadbalance = "roundrobin")
private UserService userService;
<dubbo:reference interface="com.xxx.UserService">
<dubbo:method name="getUser" loadbalance="leastactive"/>
</dubbo:reference>
负载均衡 默认会参考权重
<dubbo:provider weight="200"/>
或
<dubbo:service interface="com.xxx.UserService" weight="100"/>
random / roundrobin:权重越大,被调用概率越高leastactive:权重影响小@DubboReference(
loadbalance = "consistenthash",
parameters = {"hash.arguments", "0"}
)
private UserService userService;
public class MyLoadBalance implements LoadBalance {
@Override
public <T> Invoker<T> select(
List<Invoker<T>> invokers,
URL url,
Invocation invocation) {
// 自定义逻辑
return invokers.get(0);
}
}
META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance
myLoadBalance=com.xxx.MyLoadBalance
@DubboReference(loadbalance = "myLoadBalance")
private UserService userService;
| 场景 | 推荐 |
|---|---|
| 普通无状态服务 | random(默认) |
| 要求均匀 | roundrobin |
| 机器性能差异大 | leastactive |
| 缓存 / 有状态 | consistenthash |
logging.level.org.apache.dubbo.rpc.cluster=DEBUG
如果你愿意,我可以:
你现在是 Dubbo 2.x 还是 3.x?用的 什么注册中心?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。