一:业务代码使用
<dubbo:reference id="hello" loadbalance="roundrobin" interface="com.zhang.HelloService" />
random=com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
roundrobin=com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
leastactive=com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance
consistenthash=com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance
这几个类都继承AbstractLoadBalance类,实现LoadBalance接口。
- RandomLoadBalance 随机,按权重设置随机概率。
- RoundRobinLoadBalance 轮循,按公约后的权重设置轮循比率。
- LeastActiveLoadBalance 最少活跃调用数,相同活跃数的随机
- ConsistentHashLoadBalance 一致性Hash,相同参数的请求总是发到同一提供者,基于虚拟节点。
二:dubbo使用LoadBalance
根据消费者调用流程讲到过在执行过程中会根据LoadBalance引用去select一个invoke。AbstractClusterInvoker|select,
在AbstractClusterInvoker中有这么一段:
public Result invoke(final Invocation invocation) throws RpcException {
checkWheatherDestoried();
LoadBalance loadbalance;
List<Invoker<T>> invokers = list(invocation);
if (invokers != null && invokers.size() > 0) {
// 当服务提供者大于0的时候,根据dubbo提供的扩展方式去寻找负载均衡的实现方式。
// 在dubbo启动流程讲到过,会把消费者封装成一个URL,这个URL里面就包含了所有信息,包括负载均衡的 loadbalance="roundrobin",然后从ExtensionLoader中获取到实例。
//大致的spi是这样的,dubbo把所有的接口和实例放在/META-INFO/dubbo/internal下,里面用接口名作为文件名,文件内容是key=类。这里的key就是在xml配置的,默认值是写在dubbo代码里的,key对应的实例类卸载文件中。
loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(invokers.get(0).getUrl()
.getMethodParameter(invocation.getMethodName(),Constants.LOADBALANCE_KEY, Constants.DEFAULT_LOADBALANCE));
} else {
loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(Constants.DEFAULT_LOADBALANCE);
}
RpcUtils.attachInvocationIdIfAsync(getUrl(), invocation);
return doInvoke(invocation, invokers, loadbalance);
}