【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提供了 5 种负载均衡实现)

三、如何配置Dubbo负载均衡策略?

四、Dubbo负载均衡的实现

[1、随机均衡算法 Random LoadBalance](#1、随机均衡算法 Random LoadBalance)

[2、权重轮循算法 RoundRobin LoadBalance](#2、权重轮循算法 RoundRobin LoadBalance)

[3、最小活跃数算法 LeastActive LoadBalance](#3、最小活跃数算法 LeastActive LoadBalance)

[4、一致性hash算法 ConsistentHash LoadBalance](#4、一致性hash算法 ConsistentHash LoadBalance)

[5、最短响应时间算法 ShortestResponse 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负载均衡有多种级别的配置:服务端服务/方法级别、客户端服务/方法级别; 具体配置如下:

XML 复制代码
<!-- 服务端服务级别 -->
<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种负载均衡实现和原理。

相关推荐
Mr_Xuhhh6 分钟前
递归搜索与回溯算法
c语言·开发语言·c++·算法·github
SoraLuna9 分钟前
「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计
算法·macos·cangjie
爱吃生蚝的于勒2 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
jerry6095 小时前
7天用Go从零实现分布式缓存GeeCache(改进)(未完待续)
分布式·缓存·golang
舞动CPU5 小时前
linux c/c++最高效的计时方法
linux·运维·服务器
皮锤打乌龟6 小时前
(干货)Jenkins使用kubernetes插件连接k8s的认证方式
运维·kubernetes·jenkins
钰@6 小时前
小程序开发者工具的network选项卡中有某域名的接口请求,但是在charles中抓不到该接口
运维·服务器·小程序
古人诚不我欺6 小时前
jmeter常用配置元件介绍总结之分布式压测
分布式·jmeter
wanhengwangluo6 小时前
云服务器和物理服务器的区别有哪些?
运维·服务器
秦jh_7 小时前
【Linux】多线程(概念,控制)
linux·运维·前端