本系列文章是基于当当网维护的dubbox版本进行分析的,源码地址参考:https://github.com/dangdangdotcom/dubboxjava
咱们下载源码后导入到ide中能够看到如此之多的项目组成,真的是很是之多的项目组成,并且用到的技术也很是多,redis、zookeeper,netty等等,不由让人心生畏惧,这么大的工程源码该如何下手阅读呢?咱们必须理清楚这些工程的职责和关系,才可以抽丝剥茧的把dubbo搞清楚。git
为了让图保持清晰明了,该图特地忽略了一些具体的api实现模块,只保留了核心的一些借口定义模块,而具体技术实现的模块忽略了。经过分析dubbo的各项目及组成关系分析出该项目以下特色。github
通用模块,定义了几乎全部dubbo模块都会使用到的一些通用与业务领域无关的工具类(io处理、日志处理、配置处理、类处理等等),线程池扩展、二进制代码处理、class编译处理、json处理、数据存储接口,系统版本号等等通用的类和接口。web
分布式服务框架的核心是rpc,这是最基本的功能,这个模块定义了rpc的一些抽象的rpc接口和实现类,包括服务发布,服务调用代理,远程调用结果及异常,rpc调用网络协议,rpc调用监听器和过滤器等等。该模块提供了默认的基于dubbo协议的实现模块,还提供了hessian、http、rest、rmi、thrift和webservice等协议的实现,还实现了injvm的本地调用实现,灵活性强,很是通用,可以知足绝大多数项目的使用需求,并且还能够自行实现rpc协议。redis
注册中心也是最重要的组成部分,它是rpc中的consumer和provider两个重要角色的协调者。该项目定义了核心的注册中心接口和实现。具体实现留给了其它项目。有一个默认的实现模块,组册中心提供了mutilcast、redis和zookeeper等多种方式的注册中心实现,用于不一样的使用场景。spring
该模块是dubbo中的远程通信模块。rpc的实现基础就是远程通信,consmer要调用provider的远程方法必须经过网络远程通信实现。该模块定义了远程传输器、终端(endpoint)、客户端、服务端、编码解码器、数据交换、缓冲区、通信异常定义等等核心的接口及类构成。他是对于远程网络通信的抽象。提供了诸如netty、mina、grizzly、http、p2p和zookeeper的协议和技术框架的实现方式。json
该模块是dubbo的监控模块,经过该模块能够监控服务调用的各类信息,例如调用耗时、调用量、调用结果等等,监控中心在调用过程当中收集调用的信息,发送到监控服务,在监控服务中能够存储这些信息,对这些数据进行统计分析,最终能够产生各类维护的调用监控信息。dubbo默认提供了一个实现,该实现很是简单,只是做为默认的实现范例,生产环境使用价值不高,须要自行实现本身的监控。设计模式
dubbo服务运行容器api模块。定义了启动容器列表的包含应用程序入口main方法的类Main;定义了容器接口Container,该接口包含了启动和中止方法定义;还有一些通用的分页功能的相关类。dubbo内置了javaconfig、jetty、log4j、logback和spring几种容器的实现。api
从图中能够看出改模块依赖了几乎全部的其它模块,他是dubbo的配置模块,经过它的配置和组装将dubbo组件的多个模块整合在一块儿给最终的开发者提供有价值的分布式服务框架。经过它的配置可让开发者选择符合本身需求和使用场景的模块和技术,它定义了面向dubbo使用者的各类信息配置,好比服务发布配置、方法发布配置、服务消费配置、应用程序配置、注册中心配置、协议配置、监控配置等等。另外还有一个spring的配置模块,定义了一些spring的XML Schema,可以大大简化使用dubbo的配置,能够大大下降spring使用场景的学习和配置成本。网络
该模块是dubbo实现的集群模块。支持远程服务的集群,支持多种集群调用策略,包括failover,failsafe,failfast,failback,forking等。而且支持目录服务,注册中心就是目录服务的一种实现,支持负载均衡,该模块还实现了路由器特性,此外还包括合并技术,当将调用请求分发给全部的服务提供者,则会返回多个结果,则将多个结果合并须要用到合并器的实现,该模块也是很是重要的一个模块。
该项目是一个web应用,能够独立部署,它能够管理dubbo服务,经过该管理应用能够链接注册中心,重点是读取注册中心中的信息,也能够经过该应用改写注册中心的信息,从而实现动态的管控服务。该模块的功能也很是简单,对于实际的生产使用场景,还须要对该应用的功能进行扩展和定制,以知足实际的使用场景。
经过分析项目结构,让咱们对dubbo有了一个全面系统的了解,尤为是对于它的组成结构,可是这只是一个开始,对于细节的掌握,咱们还须要逐层深刻,进入到每一个具体的项目和类中去探索它的实现细节。
咱们能够看出来dubbo是一个设计比较精良的项目,它的项目和代码组织结构合理;而且它又是一个很是庞大的项目,涉及的具体技术包含方方面面,若是不进行良好的设计,那项目的质量也没法保障,也要求它必须进行良好的设计;同时它又是一个很是通用和灵活的框架项目,该项目定义了大量的api和配置,也提供了不少框架和技术的实现方案,所以它可以适应绝大多数的使用场景,另外又具备很是灵活的配置和扩展能力,所以也可以很是方便地扩展实现以知足本身个性化的需求,它的普遍流行也是有其必然缘由的。
从它的设计中又印证了我一直比较认同的一种设计模式。就是分层设计模型:
底层是一些通用和支撑性的通用模块,好比dubbo-commom、dubbo-remoting-api,它们是很是通用的,不解决任何领域业务问题,可以使用于所有或者多数业务领域模块;
中间层是核心业务领域模块。它们相互组合协做完成一个完整的对使用者有价值的功能特性,分布式服务框架里面就是dubbo-rpc-api远程调用、dubbo-registry-api是注册中心、dubbo-monitor-api是监控中心和dubbo-container-api等。模块化设计下降了代码复杂度和缩小了关注焦点,也有利于分工协做,还方便各模块可以独立演变;结构化良好的中间层才可以灵活应对各类技术和业务需求的演变。
上层是用户界面模块。该层会将结构化良好的中间层服务进行配置和组装,整合成为一个对用户有价值的打包服务,在该层要考虑的是用户体验,下降用户的学习和使用成本,这就须要面向用户类型、用户使用场景进行设计,用户类型须要了解用户掌握的知识,环境和使用场景,依据这些特性进行设计,面向原生java环境使用dubbo-config-api模块去配置使用dubbo,面向使用spring环境则使用dubbo-config-spring模块,该层是主要是为了下降用户的学习使用成本,填补内部结构和用户之间的知识、技能方面的鸿沟。
dubbo-rpc-api是最为核心的模块,咱们将从该模块入手来研究。