Dubbo简介

一. Dubbo

1. Dubbo简介

Dubbo是阿里巴巴开源的 RPC 框架,后进入 Apache 开源孵化器,它是一款高性能、轻量级的开源 Java RPC 分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现.它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo 采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色.

Dubbo目前被国内很多互联网公司广泛使用.另外当当网根据自身的需求,为Dubbo实现了一些新的功能,并将其命名为Dubbox(即Dubbo eXtensions).

2. Dubbo 发展史

  • 2011/10/27: 阿里巴巴巴宣布 Dubbo开源;

  • 2012/10/23: 发布最后一个版本 2.5.3 并停止维护更新;

  • 2017/07/31: 起死回生,官方宣布开启重新更新,并会得到重点维护;

  • 2017/09/07: 发布起死回生的第一个版本-dubbo-2.5.4;

  • 2018/01/08: Dubbo 团队透露 Dubbo 3.0 宣布正式开工,然后发布了dubbo-2.6.0 版本,主要合并了由当当网开源的 dubbox 项目分支;

  • 2018/01/22: Dubbo Spring Boot 版正式发布--dubbo-spring-boot-starter v1.0.0 公测版;

  • 2018/02/09: Dubbo 通过投票正式进入 Apache 基金会孵化器,更新了 Apache 官方域名,也不再仅限于 Java 语言;

  • 2019/05/20: Apache软件基金会宣布 Dubbo正式毕业,成为 Apache 的顶级项目.

3. Dubbo的适用场景

1️⃣. RPC分布式服务

当网站变大后,不可避免的需要拆分应用进行服务化,以提高开发效率,调优性能,节省关键竞争资源等.

比如: 为了适应不断变化的市场需求,以及多个垂直应用之间数据的方便交互,我们把公共的业务抽取出来作为独立的模块,为其他的应用提供服务,系统逐渐依赖于抽象和RPC远程服务调用.

2️⃣. 配置管理

当服务越来越多时,服务的URL地址信息就会爆炸式增长,配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大.

3️⃣. 服务依赖

当进一步发展,服务间的依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师也不能完整的描述应用的架构关系.

4️⃣. 服务扩容

接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?这些都可以用dubbo来进行管理.

4. Dubbo的主要功能

1️⃣. 透明化的远程方法调用

就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入.

2️⃣. 软负载均衡及容错机制

可在内网替代F5等硬件负载均衡器,降低成本,减少单点故障.

3️⃣. 服务的自动注册与发现

不再需要写死服务提供方的地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者.

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载.

5. Dubbo核心

1️⃣. 远程通讯

提供多种基于长连接的NIO框架的抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式.

2️⃣. 集群容错

提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持.

3️⃣. 自动发现

基于注册中心的目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器.

6. Dubbo的优点

1️⃣.透明化的远程方法调用,就像调用本地方法一样调用远程方法.Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载.只需简单配置,没有任何API侵入,可以实现Remoting: 远程通讯,提供对多种 NIO 框架抽象封装.包括“同步转异步”和“请求-响应”模式的信息交换方式.

2️⃣.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点.

3️⃣.服务自动注册与发现,不再需要写死服务提供方地址.注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者.

4️⃣.Cluster: Dubbo服务框架提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持.

7. Dubbo 的服务治理功能

特性描述
透明远程调用就像调用本地方法一样调用远程方法;只需简单配置,没有任何 API 侵入
负载均衡机制Client 端 LB,可在内网替代 F5 等硬件负载均衡器
容错重试机制服务 Mock 数据,重试次数、超时机制等
自动注册发现注册中心基于接口名称来查询服务提供者的 IP 地址,并且能够平滑添加或删除服务提供者
性能日志监控统计服务的调用次数和调用时间的监控中心
服务治理中心路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡等手动配置
自动治理中心熔断限流机制、自动权重调整等

8. Dubbo 的组件角色


组件角色说明
Provider暴露服务的服务提供者
Consumer调用远程服务的服务消费者
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心
Container服务运行容器

9. Dubbo调用关系及运行流程,原理(核心):

  • 1️⃣.服务容器 Container(例如Tomcat等) 负责启动,加载,运行服务提供者;

  • 2️⃣.服务提供者 Provider 在启动时,向注册中心注册自己提供的服务;

  • 3️⃣.服务消费者 Consumer 在启动时,向注册中心订阅自己所需的服务;

  • 4️⃣.注册中心 Registry 返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者;

  • 5️⃣.服务消费者 Consumer从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用;

  • 6️⃣.服务消费者 Consumer 和提供者 Provider,会把在内存中的累计调用次数和调用时间,定时地每分钟发送一次统计数据到监控中心 Monitor.

10. Dubbo的架构和设计思路

Dubbo框架具有极高的扩展性,主要采用微核+插件体系,并且文档齐全,很方便二次开发,适应性极强.

Dubbo的总体架构,如图所示:

Dubbo的框架设计一共划分了10个层,最上面的Service层是留给使用Dubbo开发分布式服务的开发者来实现业务逻辑的接口层.图中左边淡蓝色背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口.

Dubbo框架设计一共划分了10层:

  • 服务接口层(Service): 该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现;

  • 配置层(Config): 对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过Spring解析配置生成配置类;

  • 服务代理层(Proxy): 服务接口的透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory;

  • 服务注册层(Registry): 封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService,可能没有服务注册中心,此时服务提供方直接暴露服务;

  • 集群层(Cluster): 封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router和LoadBalance.将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互;

  • 监控层(Monitor): RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor和MonitorService;

  • 远程调用层(Protocol): 封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter. Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理. Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现;

  • 信息交换层(Exchange): 封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer;

  • 网络传输层(Transport): 抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec;

  • 数据序列化层(Serialize): 可复用的一些工具,扩展接口为Serialization、ObjectInput、ObjectOutput和ThreadPool.

11. dubbo各层关系描述

根据官方提供的,对于上述各层之间关系的描述,如下所示:

  • 在RPC中,Protocol是核心层,也就是只要有Protocol + Invoker + Exporter就可以完成非透明的RPC调用,然后在Invoker的主过程中添加Filter拦截点;

  • 而Cluster是外围概念,所以Cluster的目的是将多个Invoker伪装成一个Invoker,这样其它人只要关注Protocol层Invoker即可,加上Cluster或者去掉Cluster对其它层都不会造成影响,因为只有一个提供者时,是不需要Cluster的;

  • Proxy层封装了所有接口的透明化代理,而在其它层都以Invoker为中心,只有到了暴露给用户使用时,才用Proxy将Invoker转成接口,或将接口实现转成Invoker,也就是去掉Proxy层RPC是可以Run的,只是不那么透明,不那么看起来像调本地服务一样调远程服务;

  • 而Remoting的实现是Dubbo协议的实现,如果你选择RMI协议,整个Remoting都不会用上,Remoting内部再划为Transport传输层和Exchange信息交换层,Transport层只负责单向消息传输,是对Mina、Netty、Grizzly的抽象,它也可以扩展UDP传输,而Exchange层是在传输层之上封装了Request-Response语义;

  • Registry和Monitor实际上不算一层,而是一个独立的节点,只是为了全局概览,用层的方式画在一起.

12. Dubbo架构图

Dubbo按照工作阶段分为部署阶段和运行阶段.其中部署阶段在图中以蓝色的线来表示,代表服务注册、服务订阅的过程,而运行阶段在图中以红色的线来表示,代表一次 RPC 的完整调用.

部署阶段中服务提供方在启动时在指定的端口上暴露服务,并向注册中心汇报自己的地址.
服务调用方启动时向注册中心订阅自己感兴趣的服务.

运行阶段注册中心先将地址列表推送给服务消费者,服务消费者选取一个地址向对端发起调用.在这个过程中,服务消费者和服务提供者的运行状态会上报给监控中心.

这张图从左往右看,分为两部分,左半边蓝色背景的部分代表服务消费者,右半边绿色背景的部分代表服务提供者.

左边九层按功能来划分又被分为了三大类,分别是面向用户的 Biz 层、框架核心 RPC 以及负责远程传输的 Remoting,右边按面向人群又划分为了两类,上面两层是面向用户的 API,而下面七层是面向扩展提供者的 SPI.

图中的线代表对象与对象之间不同的关系,紫色代表继承,黑色代表依赖,蓝色虚线代表服务注册、服务订阅的过程,也就是上面讲的部署阶段,红色代表一次完整的 RPC 调用,也就是运行阶段.

我们顺着红色的线,来看下一次完整的 RPC 调用是如何进行的.

首先从图的左边开始,服务消费者从 Proxy 层发起一次 RPC 调用,Dubbo 从 Registry 层拿到服务的地址列表,再通过 Cluster 层选择其中的一个作为目标地址,再流经 Protocol 决定的执行链,最后将服务信息,包括要调用的服务名、方法名、参数等序列化,再经过应用协议编码,通过Transport 层发送到网络上.

右边的服务提供者从网络上收到数据以后,从下往上,依次通过应用协议解码、反序列化得到要调用的服务信息,再经由执行链,最终通过 Invoker 找到目标服务的目标方法,执行并返回结果.

13. Dubbo服务调用流程

14. Dubbo调用模型

15. Dubbo的注册/注销服务

服务的注册与注销,是对服务提供方角色而言,那么注册服务与注销服务的时序图,如图所示:

16. Dubbo的订阅/取消服务

为了满足应用系统的需求,服务消费方可能需要从服务注册中心订阅指定的由服务提供方发布的服务,在得到通知可以使用服务时,就可以直接调用服务.反过来,如果不需要某一个服务了,可以取消该服务.下面看一下对应的时序图,如图所示:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐