1.Dubbo概述
Dubbo是阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的方案。它的核心功能包括:
#remoting:远程通讯基础,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。
#Cluster: 服务框架核心,提供基于接口方法的远程过程调用,包括多协议支持,并提供软负载均衡和容错机制的集群支持。
#registry: 服务注册中心,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
2. dubbo-master的目录结构
3.dubbo-cluster子工程
其中负载均衡功能就在dubbo-cluster工程中,而该工程的结构如图:
从名字就可以看出来LoadBalance接口为负载均衡的功能,齐实现的结构如下图:
最终的四个实现为dubbo的四种负载均衡的策略,再其中的抽象实现类中实现了权重的获取:
protected int getWeight(Invoker<?> invoker, Invocation invocation) { int weight = invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constan ts.WEIGHT_KEY, Constants.DEFAULT_WEIGHT); if (weight > 0) { long timestamp = invoker.getUrl().getParameter(Constants.TIMESTAMP_KEY, 0L); if (timestamp > 0L) { int uptime = (int) (System.currentTimeMillis() - timestamp); int warmup = invoker.getUrl().getParameter(Constants.WARMUP_KEY, Constants.DEFAU LT_WARMUP); if (uptime > 0 && uptime < warmup) { weight = calculateWarmupWeight(uptime, warmup, weight); } } } return weight; }
当启动时间小于预热时间时,需要减少权重;其他则按照默认给定的权重来算。
4.四种负载均衡策略
一)random
在权重不同时按照权重来随机分配,如果权重相同按照provider的数量进行随机分配
二)roundrobin
利用int变量++后的值取余集群数,达到轮询的效果
三)leastactive
获取providers的连接数,筛选出最少连接的provide集合
int[] leastIndexs = new int[length]; // 相同最小活跃数的下标
如果只有一个直接返回,大于一个使用随机算法从该数组中取
四)consistentHash
hash一致性算法调度,根据参数计算得到一个provider