Dubbo,优秀的开源服务框架

411 阅读4分钟

一、简介

官方网站

1.官方说明

Apache Dubbo 是一个高可用的,基于Java的开源RPC框架。Dubbo框架不仅仅是具备RPC访问功能,还包含服务治理功能

2.发展历史

Dubbo最开始是由阿里巴巴内部使用的RPC框架。

2011年对外提供。

2012年停止更新。

2017年开始继续更新。

2019年捐献给Apache,由Apache维护2.7以上版本。

二、架构讲解

1.架构图

image

register:登记 ;

subscribe:订阅;

notify:通知;

invoke:调用;

container:容器

2.架构说明

2.1 虚线

虚线表示异步,实线表示同步。异步不阻塞线程性能高,同步阻塞线程必须等待响应结果才能继续执行,相对性能低。

2.2 Provider

暴露服务的提供方。编写持久层、业务层和事务代码

2.3 Container

运行服务容器(Spring容器),Dubbo完全基于Spring实现。

2.4 Registry

服务的注册与发现中心。放置所有Provider对外提供的信息。包含Provider的IP,访问端口,访问遵守的协议,对外提供的接口,接口中有哪些方法等相关信息。

2.5 Consumer

调用远程服务的消费方。消费者(RPC调用者,SOA调用服务的项目)开发中也是一个项目,编写service和controller(还可以包括页面等)。调用远程服务实现(XXXXServiceImpl)中的方法。

2.6 Monitor

监控中心。监控Provider的压力情况等。每隔2分钟Consumer和Provider会把调用次数发送给Monitor,由Monitor进行统计。

3.执行流程

0.start:启动Spring容器时会把Provider启动。

1.register:把Provider相关信息注册到Registry里

2.subscribe:Consumer从Registry中订阅Provider的信息

3.notify:通知给Consumer

4.invoke:Consumer根据Registry通知的信息进行调用Provider中方法。

5.count:Consumer和Provider把调用次数信息异步发送给Monitor进行统计。

4.Dubbo架构特性

Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。

4.1 连通性

  • 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
  • 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
  • 服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
  • 服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
  • 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
  • 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
  • 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
  • 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

4.2 健壮性

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

4.3 伸缩性

  • 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心
  • 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者

4.4 升级性

当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。下图是未来可能的一种架构:

image

三、Dubbo支持的协议

1.Dubbo协议(官方推荐协议)

  • 优点:

采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用) 。协议的默认端口是:20880

  • 缺点:

大文件上传时,可能出现问题(不使用Dubbo实现文件传输)

2.RMI(Remote Method Invocation)协议

  • 优点:

JDK自带的能力。

  • 缺点:

偶尔连接失败

3.Hessian协议

  • 优点:

可与原生Hessian互操作,基于HTTP协议

  • 缺点:

需hessian.jar支持,http短连接的开销大