
SpringCloud Alibaba系列——11Dubbo的负载均衡原理
作者 | 一起撸Java
来源 |今日头条
学习目标
- Dubbo的负载均衡策略有哪些及各自特点
第1章 负载均衡
1.1 RandomLoadBalance
1.1.1 使用场景
在大请求量的情况下,想要让请求落到所有节点的比率跟机器的权重比率接近那么就可以使用随机算法。
随机算法是dubbo默认的负载均衡算法,在dubbo随机的负载均衡算法有两种
1、完全随机
2、权重随机
完全随机就是不考虑权重从服务列表中根据服务列表的长度来随机选择一个,这样做是没考虑机器性能差异的。
权重随机,是给不同机器的机器加不同的权重,机器性能好点的权重高,性能差点的权重低,权重高的机器能随机分配更多的请求,反之亦然。
1.1.2 源码分析
1.2 RoundRobinLoadBalance
1.2.1 使用场景
无需记录当前所有服务器的连接状态,所以它是一种无状态负载均衡算法,实现简单,适用于每台服务器性能相近的场景下。为了解决轮询算法应用场景的局限性。当遇到每台服务器的性能不一致的情况,我们需要对轮询过程进行加权,以调控每台服务器的负载。
经过加权后,每台服务器能够得到的请求数比例,接近或等于他们的权重比。比如服务器 A、B、C 权重比为 5:3:2。那么在10次请求中,服务器 A 将收到其中的5次请求,服务器 B 会收到其中的3次请求,服务器 C 则收到其中的2次请求。
1.2.2 源码分析
从上述代码我们可以看到,MockClusterInvoker当中就是走了三套逻辑:
1、没有配置mock的情况
2、mock="force:"的情况
3、配置了mock的其他情况
我们都知道如果配置了force:就代表要进行强制降级,就不会走后端的rpc调用了,所以这里是直接调用到了
我们再看看mockInvoker的invoke方法
我们看一下normalizeMock方法
我们获取到mock的返回值内容后需要把该返回值包装成方法返回值类型,所以这里必须要有一个返回值类型的包装,我们看一下parseMockValue方法:
从上面的逻辑来看,如果是force:return 则会不走rpc直接返回一个结果,然后把这个结果包装成方法的返回值类型。
