Dubbo内置负载均衡策略

Dubbo内置负载均衡策略

Dubbo内置了4种负载均衡策略:

  • RandomLoadBalance:

随机负载均衡。随机的选择一个。是Dubbo的默认负载均衡策略。

  • RoundRobinLoadBalance:

轮询负载均衡。轮询选择一个。

  • LeastActiveLoadBalance:

最少活跃调用数,相同活跃数的随机。活跃数指调用前后计数差。使慢的 Provider 收到更少请求,因为越慢的 Provider 的调用前后计数差会越大。

  • ConsistentHashLoadBalance:

一致性哈希负载均衡。相同参数的请求总是落在同一台机器上。

Dubbo 负载均衡 集群容错 服务路由

在讨论负载均衡之前,我想先解释一下这3个概念。

负载均衡
集群容错
服务路由
这3个概念容易混淆。他们都描述了怎么从多个 Provider 中选择一个来进行调用。那他们到底有什么区别呢?下面我来举一个简单的例子,把这几个概念阐述清楚吧。

有一个Dubbo的用户服务,在北京部署了10个,在上海部署了20个。一个杭州的服务消费方发起了一次调用,然后发生了以下的事情:

  1. 根据配置的路由规则,如果杭州发起的调用,会路由到比较近的上海的20个 Provider。
  2. 根据配置的随机负载均衡策略,在20个Provider中随机选择了一个来调用,假设随机到了第7个 Provider。
  3. 结果调用第7个 Provider 失败了。
  4. 根据配置的Failover集群容错模式,重试其他服务器。重试了第13个Provider,调用成功。
  • 上面的第1,2,4步骤就分别对应了路由,负载均衡和集群容错。 - Dubbo中,先通过路由,从多个 Provider 中按照路由规则,选出一个子集。再根据负载均衡从子集中选出一个 Provider 进行本次调用。
  • 如果调用失败了,根据集群容错策略,进行重试或定时重发或快速失败等。

可以看到Dubbo中的路由,负载均衡和集群容错发生在一次RPC调用的不同阶段。最先是路由,然后是负载均衡,最后是集群容错。 本文档只讨论负载均衡,路由和集群容错在其他的文档中进行说明。
顺序上:

  • 服务路由
  • 负载均衡
  • 集群容错

Dubbo

Dubbo

高性能Java RPC框架.Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

HTTP/TCP 都属于RPC

特性一览

面向接口代理的高性能RPC调用

提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。

智能负载均衡

内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

服务自动注册与发现

支持多种注册中心服务,服务实例上下线实时感知。

高度可扩展能力

遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。

运行期流量调度

内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。

可视化的服务治理与运维

提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

Dubbo核心角色

Dubbo核心角色

核心角色:

  • 服务提供者者,
  • 服务消费者,
  • 注册中心,
  • 监控中心

服务提供者:

  1. 提供服务的接口 (API)
  2. 实现服务(实现类)
  3. 注册服务(远程服务,本地注册)
  4. 暴露服务(比如启动tomcat)

注册中心:

  1. 保存服务名与服务器地址映射的关系,
  2. 服务地址变更主动通知服务消费者

服务消费者:

  1. 启动时从服务中心获取服务地址并缓存
  2. 根据负载均衡策略选出一个服务地址进行服务调用。

监控中心:
统计服务的调用次数和调用时间的监控中心