- 弹性好:
基于的服务发现机制可以快速发现服务的扩容与缩容,与相对静态的服务列表配置机制比,它是更加动态、灵活和实时的,这使得基于Dubbo开发的服务可以随时被关闭、启动和迁移,也使得应用能够以原生方式利用云环境中资源的弹性伸缩。
- 高可用:
Dubbo是完全去中心化的服务治理方案,在分布式系统运行时,任何节点宕机都不会对服务产生实质性的影响。服务提供者宕机是较为常见的问题,可以与缩容一并处理,不会影响集群的整体服务。注册中心容易被误认为Dubbo系统的中心,其实不然,即使注册中心集群整体宕机,也不会影响Dubbo应用的运行。因为服务提供者列表是缓存在每一个服务消费者本地的,因此即使不经过注册中心,服务间的远程调用仍然不会中断。不过在注册中心失效期间,服务消费者无法感知新上线的服务提供者,因此无法对系统进行扩容。
- 性能优:
采用Dubbo协议的服务消费者和服务提供者之间是点对点直连的,连接建立后无须断开,每次远程调用无须重新经过三次握手,也无须经过负载均衡服务器的二次转发,非常适用于互联网后端之间频次高、性能敏感度高的服务交互。
Dubbo支持随机、轮询、最少活跃调用数和一致性哈希这四种负载均衡策略,也提供扩展点用于定制策略。
随机策略是Dubbo默认采用的负载均衡策略。调用量越大分布越均匀,在无状态应用场景下较为适用。
轮询策略能够让流量以绝对均匀的方式分配。但是,如果服务节点处理能力不均衡的话,便会导致大量请求最终阻塞在最短板的服务节点上,从而影响集群的整体运行效果。
最少活跃数调用策略可以使请求响应迅速的服务节点获得更多的请求,使请求响应缓慢的服务节点获得较少的请求。
一致性哈希策略使用一致性哈希算法,使相同的参数总是可以被发送给同样的服务提供者,在服务节点变化时平摊请求,避免请求路由结果发生剧烈变动。一致性哈希算法在分布式缓存等方案中较为常见,无状态服务没有必要使用,但如果服务是有状态的,便可以考虑使用该策略,以降低数据在服务节点间的复制频率。
Dubbo还为负载均衡策略提供了权重,可以通过配置或Dubbo的控制台动态调节权重,控制各个服务节点分配到的请求的数量。
配置负载均衡策略很简单,以下是将接口的负载均衡策略调整为轮询策略的配置代码。
<dubbo:referenceinterface="..." loadbalance="roundrobin" />
以下是将某一种方法的负载均衡策略调整为轮询策略的配置代码。
<dubbo:referenceinterface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>
在服务调用失败时,Dubbo还提供了失效转移等容错的能力。
远程通信
使用Dubbo进行远程调用非常简单,它将多种通信方式及不同的序列化协议进行了统一封装。服务提供者和服务消费者只需在配置中指定使用的协议,便无须关心其他的实现细节了。
在正式介绍通信协议之前,我们需要先明确一下“Dubbo”这个词在不同语境中所表示的不同概念。首先,Dubbo是这个框架的名字;其次,在Dubbo框架中,服务提供者与服务消费者之间可以采用多种协议通信,Dubbo通信协议便是其中的一种;最后,远程通信时需要对在网络间传输的消息进行序列化和反序列化,Dubbo序列化协议是Dubbo框架所支持的众多序列化协议之一,是其自研的序列化算法。
Dubbo框架内置了多种通信协议,默认使用Dubbo通信协议,其他的协议还有RMI、Hessian、HTTP、WebService、Thrift、Memcached、Redis等。每个协议的连接方式、支持的序列化协议、线程模型、消息派发方式等都有很大区别。
Dubbo通信协议是Dubbo框架中最常用的通信协议。它采用Java NIO实现多路复用。对于每一个服务消费者来说,Dubbo协议的服务提供者都会创建固定数量的长连接传输消息,用于有效减少建立连接的握手次数,Dubbo通信协议使用线程池并发处理请求来增强并发效率。由于连接复用,传输大文件时的带宽占用率高可能会成为系统瓶颈,因此Dubbo通信协议适合处理高并发的小数据量互联网请求,不适合处理视频、高清照片这样的大文件或超长字符串。
Dubbo通信协议并未直接使用Java原生的NIO包进行开发,它默认采用Netty框架进行远程通信,并且可以仅通过配置的变更将远程调用的具体实现方式切换为使用Mina或Grizzly等其他通信框架,远程调用的实现对使用方完全透明。
Dubbo通信协议可以支持多种序列化协议,与变更通信框架一样,它也能够仅通过修改配置实现序列化协议的切换。Dubbo通信协议使用Hessian作为默认的序列化协议,除此之外,还支持Dubbo、JSON以及Java原生的序列化协议。

