你好,dubbo,初次见面,我想和你交个朋友。html
先给出一套官方的说法:Apache Dubbo是一款高性能、轻量级基于Java的RPC开源框架。git
文档地址: http://dubbo.apache.org/zh-cn...
文档简短形象的对单一应用架构、垂直应用架构、分布式服务架构、流动计算架构作了一个对比,能够很明白的看出这四个架构所适用的场景,由于业务需求愈来愈复杂,才会有这一系列的演变。github
RPC英文全名为Remote Procedure Call,也叫远程过程调用,其实就是一个计算机通讯协议,它是一种经过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。计算机通讯协议有不少种,对于开发来讲,不少熟悉的是HTTP协议,我这里就作个简单的比较,HTTP协议是属于应用层的,而RPC跨越了传输层和应用层。HTTP自己的三次握手协议,每发送一次请求,都会有一次创建链接的过程,就会带来必定的延迟,而且HTTP自己的报文庞大,而RPC能够按需链接,调用结束后就断掉,也能够是长连接,多个远程过程调用共享同一个连接,能够看出来RPC的效率要高于HTTP,可是相对于开发简单快速的HTTP服务,RPC服务就会显得复杂一些。算法
回到原先的话题,继续来聊聊dubbo。关于dubbo 的特色分别有连通性、健壮性、伸缩性、以及向将来架构的升级性。特色的详细介绍也能够参考上述连接的官方文档。官方文档拥有的内容我在这就不一一进行阐述了。spring
由于接下来须要对dubbo各个模块的源码以及原理进行解析,因此介绍一下dubbo的源码库,dubbo框架已经交由Apache基金会进行孵化,被挂在github开源。apache
github地址: https://github.com/apache/inc...
而后讲一下dubbo的版本策略:两个大版本并行发展,2.5.x是稳定版本,2.6.x是新功能实验版本。2.6上实验都稳定了之后,会迁移到2.5,因此若是你想了解dubbo最新的牛逼特性,就选择2.6,不然用2.5版本。我接下来介绍都是基于2.6.x版本。bootstrap
dubbo的官方文档真的写的太好了,我在这里仍是要夸赞一下。接下来我对整个框架设计的介绍是基于官方文档的基础上进行扩充,尽可能作到更加通俗易懂。api
能够看到Dubbo被拆分红不少的Maven项目(右边的我尚未截全)接下来我会介绍左边每一个模块的大体做用。缓存
若是看过dubbo官方文档的朋友确定看到过如下这个图:服务器
从以上这个图咱们能够清晰的看到各个模块之间依赖关系,其实以上的图只是展现了关键的模块依赖关系,还有部分模块好比dubbo-bootstrap清理模块等,下面我会对各个模块作个简单的介绍,至少弄明白各个模块的做用。
先来说讲上图的几个模块:
官方文档的解释:基于注册中心下发地址的集群方式,以及对各类注册中心的抽象。
个人理解是:dubbo的注册中心实现有Multicast注册中心、Zookeeper注册中心、Redis注册中心、Simple注册中心(具体怎么实现我在后面文章中会介绍),这个模块就是封装了dubbo所支持的注册中心的实现。
看看registry目录结构:
官方文档的解释:将多个服务提供方假装为一个提供方,包括:负载均衡, 容错,路由等,集群的地址列表能够是静态配置的,也能够是由注册中心下发。
个人理解:它就是一个解决出错状况采用的策略,这个模块里面封装了多种策略的实现方法,而且也支持本身扩展集群容错策略,cluster把多个Invoker假装成一个Invoker,而且在假装过程当中加入了容错逻辑,失败了,重试下一个。
看看cluster的目录结构:
官方文档的解释:包括 Util 类和通用模型。
个人理解:这个应该很通俗易懂,工具类就是一些公用的方法,通用模型就是贯穿整个项目的统一格式的模型,好比URL,上述就提到了URL贯穿了整个项目。
看看common的目录:
这个类中的包含义我就不一一讲了,具体的介绍会穿插在后续文章中,由于这些都是工具类的一些实现,包的含义也很明显。
官方文档的解释:是 Dubbo 对外的 API,用户经过 Config 使用Dubbo,隐藏 Dubbo 全部细节。
个人理解:用户都是使用配置来使用dubbo,dubbo也提供了四种配置方式,包括XML配置、属性配置、API配置、注解配置,配置模块就是实现了这四种配置的功能。
看看config的目录:
官方文档的解释:抽象各类协议,以及动态代理,只包含一对一的调用,不关心集群的管理。
个人理解:远程调用,最主要的确定是协议,dubbo提供了许许多多的协议实现,不过官方推荐时使用dubbo本身的协议,还给出了一份性能测试报告。
性能测试报告地址: http://dubbo.apache.org/zh-cn...
这个模块依赖于dubbo-remoting模块,抽象了各种的协议。
看看rpc的目录:
官方文档的解释:至关于 Dubbo 协议的实现,若是 RPC 用 RMI协议则不须要使用此包。
个人理解:提供了多种客户端和服务端通讯功能,好比基于Grizzly、Netty、Tomcat等等,RPC用除了RMI的协议都要用到此模块。
看看remoting的目录:
官方文档的解释:是一个 Standlone 的容器,以简单的 Main 加载 Spring 启动,由于服务一般不须要 Tomcat/JBoss 等 Web 容器的特性,不必用 Web 容器去加载服务。
个人理解:由于后台服务不须要Tomcat/JBoss 等 Web 容器的功能,不须要用这些厚实的容器去加载服务提供方,既资源浪费,又增长复杂度。服务容器只是一个简单的Main方法,加载一些内置的容器,也支持扩展容器。
看看container的目录:
官方文档的解释:统计服务调用次数,调用时间的,调用链跟踪的服务。
个人理解:这个模块很清楚,就是对服务的监控。
看看monitor的目录:
这个模块只有一个类,是做为dubbo的引导类,而且在中止期间进行清理资源。具体的介绍我在后续文章中讲解。
这个模块是快速启动示例,其中包含了服务提供方和调用方,注册中心用的是multicast,用XML配置方法,具体的介绍能够看官方文档。
示例介绍地址: http://dubbo.apache.org/zh-cn...
这个模块提供了内置的一些过滤器。
看看filter的目录:
该模块提供了内置的插件。
看看plugin的目录:
该模块中封装了各种序列化框架的支持实现。
看看serialization的目录:
这个模块封装了针对dubbo的性能测试、兼容性测试等功能。
看看test的目录:
读完整篇文章后不知道对你踏入dubbo源码解读是否有几分帮助,后续我将会逐步更新dubbo每一个模块的解读,若是我在哪一部分写的不够到位或者写错了,欢迎给我提意见,个人私人微信号码:HUA799695226。