【Dubbo】Dubbo负载均衡实现解析
📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。
📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。
🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人
🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~
🍅 文末获取联系 🍅 👇🏻 精彩专栏推荐订阅收藏 👇🏻
专栏系列(点击解锁)
学习路线(点击解锁)
知识定位
🔥Redis从入门到精通与实战🔥
Redis从入门到精通与实战
围绕原理源码讲解Redis面试知识点与实战
🔥MySQL从入门到精通🔥
MySQL从入门到精通
全面讲解MySQL知识与企业级MySQL实战 🔥计算机底层原理🔥
深入理解计算机系统CSAPP
以深入理解计算机系统为基石,构件计算机体系和计算机思维
Linux内核源码解析
围绕Linux内核讲解计算机底层原理与并发
🔥数据结构与企业题库精讲🔥
数据结构与企业题库精讲
结合工作经验深入浅出,适合各层次,笔试面试算法题精讲
🔥互联网架构分析与实战🔥
企业系统架构分析实践与落地
行业最前沿视角,专注于技术架构升级路线、架构实践
互联网企业防资损实践
互联网金融公司的防资损方法论、代码与实践
🔥Java全栈白宝书🔥
精通Java8与函数式编程
本专栏以实战为基础,逐步深入Java8以及未来的编程模式
深入理解JVM
详细介绍内存区域、字节码、方法底层,类加载和GC等知识
深入理解高并发编程
深入Liunx内核、汇编、C++全方位理解并发编程
Spring源码分析
Spring核心七IOC/AOP等源码分析
MyBatis源码分析
MyBatis核心源码分析
Java核心技术
只讲Java核心技术
本文目录
本文导读
一、Dubbo负载均衡的作用?
二、Dubbo提供了 5 种负载均衡实现
三、如何配置Dubbo负载均衡策略?
四、Dubbo负载均衡的实现
1、随机均衡算法 Random LoadBalance
2、权重轮循算法 RoundRobin LoadBalance
3、最小活跃数算法 LeastActive LoadBalance
4、一致性hash算法 ConsistentHash LoadBalance
5、最短响应时间算法 ShortestResponse LoadBalance
总结
本文导读
Dubbo作为分布式远程调用框架,要保证的点很多,比如:负载均衡、服务注册与发现、故障转移、高性能通信等等!
Dubbo是一个分布式服务框架,能避免单点故障和支持服务的横向扩容。一个服务通常会部署多个实例,如何从多个服务 Provider 组成的集群中挑选出一个进行调用,就涉及到负载均衡的策略。
一、Dubbo负载均衡的作用?
负载均衡的目的是为了能够将请求合理地平分到各服务实例上,以便发挥所有机器的叠加作用。
Dubbo 需要对 Consumer 的调用请求进行分配,避免少数 Provider 节点负载过大,而剩余的其他 Provider 节点处于空闲的状态。
因为当 Provider 负载过大时,就会导致一部分请求超时、丢失等一系列问题发生,造成线上故障。
二、Dubbo提供了 5 种负载均衡实现
基于 Hash 一致性的 ConsistentHashLoadBalance(consistenthash),一致性哈希负载均衡,相同参数的请求总是落在同一台机器上。
基于权重随机算法的 RandomLoadBalance(random),随机负载均衡,随机的选择一个,是Dubbo的默认负载均衡策略。
基于最少活跃调用数算法的 LeastActiveLoadBalance(leastactive),最少活跃调用数,相同活跃数的随机。活跃数指调用前后计数差。使慢的 Provider 收到更少请求,因为越慢的 Provider 的调用前后计数差会越大。
基于加权轮询算法的 RoundRobinLoadBalance(roundrobin),轮询负载均衡,轮询选择一个。
基于最短响应时间的 ShortestResponseLoadBalance (shortestresponse),同最小活跃数负载,算法框架完全相同
三、如何配置Dubbo负载均衡策略?
Dubbo负载均衡有多种级别的配置:服务端服务/方法级别、客户端服务/方法级别; 具体配置如下:
<!-- 服务端服务级别 -->
<dubbo:service interface="..." loadbalance="roundrobin" />
<!-- 客户端服务级别 -->
<dubbo:reference interface="..." loadbalance="random" />
<!-- 服务端方法级别 -->
<dubbo:service interface="...">
<dubbo:method name="hello" loadbalance="consistenthash"/>
</dubbo:service>
<!-- 客户端方法级别 -->
<dubbo:reference interface="...">
<dubbo:method name="hello" loadbalance="leastactive"/>
</dubbo:reference>
随机:loadbalance="random"
轮循:loadbalance="roundrobin"
最少活跃数:loadbalance="leastactive"
一致性Hash:loadbalance="consistenthash"
四、Dubbo负载均衡的实现
1、随机均衡算法 Random LoadBalance
随机,按照权重设置随机概率,调用量越大分布越均匀
是Dubbo的默认负载均衡策略
加权随机算法原理:假设我们有三个 Provider 节点 A、B、C,它们对应的权重分别为 5、2、3,权重总和为 10。现在把这些权重值放到一维坐标轴上,[0, 5) 区间属于节点 A,[5, 7) 区间属于节点 B,[7, 10) 区间属于节点 C,然后通过随机数生成器在 [0, 10) 这个范围内生成一个随机数,然后计算这个随机数会落到哪个区间中。
2、权重轮循算法 RoundRobin LoadBalance
轮循,按照权重设置轮循比率
存在问题: 请求累积的问题,请求会累积在性能较差的机器上,导致响应时间慢。
解决办法:把性能差的机器,权重调低。
缺点:无法对机器性能在时间上的变化而做出动态改变,只能人工发现机器性能下降,手动调节权重。
加权轮询负载均衡算法原理:轮询指的是将请求轮流分配给每个 Provider。例如,有 A、B、C 三个 Provider 节点,加权之后,分配给每个 Provider 节点的流量比会接近或等于它们的权重比。例如,Provider 节点 A、B、C 权重比为 5:1:1,那么在 7 次请求中,节点 A 将收到 5 次请求,节点 B 会收到 1 次请求,节点 C 则会收到 1 次请求。
每个 Provider 节点有两个权重:一个权重是配置的 weight,该值在负载均衡的过程中不会变化;另一个权重是currentWeight,该值会在负载均衡的过程中动态调整,初始值为 0。
当有新的请求进来时,RoundRobinLoadBalance 会遍历 Invoker 列表,并用对应的 currentWeight 加上其配置的权重。遍历完成后,再找到最大的 currentWeight,将其减去权重总和,然后返回相应的 Invoker 对象。
3、最小活跃数算法 LeastActive LoadBalance
处理请求慢的机器将获得更小的调用量(相同活跃数的随机,活跃调用前后计算差值),以达到系统处理最大化。
优点:灵活,能够简单的根据调用数量动态调整机器处理的数量。
最小活跃数负载均衡算法原理:LeastActiveLoadBalance 使用的是最小活跃数负载均衡算法。
它认为当前活跃请求数越小的 Provider 节点,剩余的处理能力越多,处理请求的效率也就越高,那么该 Provider 在单位时间内就可以处理更多的请求,所以我们应该优先将请求分配给该 Provider 节点。
4、一致性hash算法 ConsistentHash LoadBalance
一致性 Hash 负载均衡可以让参数相同的请求每次都路由到相同的服务节点上,这种负载均衡策略可以在某些 Provider 节点下线的时候,让这些节点上的流量平摊到其他 Provider 上,不会引起流量的剧烈波动。
优点:更加灵活。
缺点:灵活导致难度大,由于粒度 细到单个请求上,一开始在开发时就得规划好,后期变动维护人员难度大。
一致性Hash原理:假设现在有N个 Provider 节点对外提供服务,有 100 个请求同时到达,如果想让请求尽可能均匀地分布到这N个 Provider 节点上,我们可能想到的最简单的方法就是 Hash 取模,即 hash(请求参数) % N。如果参与 Hash 计算的是请求的全部参数,那么参数相同的请求将会落到同一个 Provider 节点上。
如果突然有一个 Provider 节点出现宕机的情况,那我们就需要对 2 取模,即请求会重新分配到相应的 Provider 之上。在极端情况下,甚至会出现所有请求的处理节点都发生了变化,这就会造成比较大的波动。
一致性 Hash 算法的原理也是取模算法,与 Hash 取模的不同之处在于:Hash 取模是对 Provider 节点数量取模,而一致性 Hash 算法是对 2^32 取模。
5、最短响应时间算法 ShortestResponse LoadBalance
ShortestResponseLoadBalance 是Dubbo 2.7 版本之后新增加的一个 LoadBalance 实现类。
最短响应时间的负载均衡算法原理:
实现了最短响应时间的负载均衡算法,也就是从多个 Provider 节点中,选出调用成功的且响应时间最短的 Provider 节点,不过满足该条件的 Provider 节点可能有多个,所以还要再使用随机算法进行一次选择,得到最终要调用的 Provider 节点。
总结
Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
本文讲解了Dubbo负载均衡的作用,如何配置Dubbo负载均衡策略,以及Dubbo提供5种负载均衡实现和原理。