Dubbo是一款高性能的 RPC框架,也是大厂经常使用中间件,下面我详解Dubbo负载均衡原理@mikechen
Dubbo
Dubbo 是阿里开源的一款高性能 Java RPC 框架,支持多种服务治理能力。
Dubbo 是一款功能强大且成熟的分布式服务框架,它通过提供高效的 RPC 通信、完善的服务治理和灵活的扩展机制。
极大地简化了微服务架构的开发和管理,是构建高性能、高可用分布式应用的重要选择。
Dubbo负载均衡
Dubbo的负载均衡机制,位于客户端调用流程中,是影响服务稳定性和吞吐量的重要因素。
Dubbo 的负载均衡机制是一个在消费者端实现的策略选择过程。
消费者通过注册中心获取服务提供者列表,然后根据配置的负载均衡策略,从列表中选择一个合适的提供者实例发起远程调用。
如下图所示:
Dubbo 提供了多种内置的负载均衡策略,可以根据不同的业务场景和性能需求进行选择和配置。
策略名称 | 类名 | 原理简述 |
---|---|---|
Random(默认) | RandomLoadBalance |
按权重随机选择一个 Provider |
RoundRobin | RoundRobinLoadBalance |
按顺序轮询,带权重 |
LeastActive | LeastActiveLoadBalance |
优先选择活跃请求数最少的节点 |
ConsistentHash | ConsistentHashLoadBalance |
一致性哈希,保证同参数的请求落到同节点上 |
RandomLoadBalance (默认)
RandomLoadBalance
是 Dubbo 默认策略,兼顾负载分布和计算效率。
适用于大多数无状态服务,是性能与灵活性的一个良好折中方案。
简单易实现: 这是随机策略最显著的优点。它的实现逻辑非常简单,只需要一个随机数生成器即可从服务器列表中选择一个。
由于不需要维护任何状态信息(如连接数、响应时间等),随机策略的计算开销几乎为零,对负载均衡器的性能影响很小。
但是,无法感知服务器负载, 这是随机策略最主要的缺点。
它完全忽略了后端服务器的当前负载情况,如果某些服务器已经处于高负载状态,随机策略仍然可能将新的请求发送给它们,导致这些服务器过载,影响整体性能和响应时间。
轮询(RoundRobinLoadBalance)
原理: 将每个新的请求依次分配给列表中的下一个服务器,当所有服务器都被轮询过一次后,再从第一个服务器开始。
优点: 每个提供者都会被依次调用,实现绝对的平均分配。
缺点: 如果某个提供者的处理速度较慢,会导致请求积压,影响整体性能。
最少连接(LeastActiveLoadBalance)
原理: 选择活跃数 (active) 最少的提供者,活跃数指当前正在处理的请求数。
优点: 可以让处理能力更强的提供者承担更多的请求,因为处理快的提供者活跃数会更低。能够有效地缓解慢提供者接收过多请求的问题。
缺点: 需要维护每个提供者的活跃数,有一定的开销。
一致Hash(ConsistentHashLoadBalance)
原理: 基于一致性哈希算法选择提供者。对于相同的参数,总是选择同一个提供者。
优点: 可以将具有相同特征的请求路由到同一个提供者,常用于有状态的服务,例如需要保证某个用户的请求始终由同一台服务器处理的场景,或者与缓存结合使用提高缓存命中率。
缺点: 如果提供者数量变化,可能会导致部分请求的路由发生变化,影响缓存。可以通过配置 hash.nodes
参数增加虚拟节点来提高均衡性。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》