文档章节

dubbo源码分析系列——项目工程结构介绍

杨武兵
 杨武兵
发布于 2016/05/29 07:59
字数 2556
阅读 1844
收藏 28

项目源码地址

本系列文章是基于当当网维护的dubbox版本进行分析的,源码地址参考:https://github.com/dangdangdotcom/dubbox

项目源码结构

我们下载源码后导入到ide中可以看到如此之多的项目组成,真的是非常之多的项目组成,而且用到的技术也非常多,redis、zookeeper,netty等等,不禁让人心生畏惧,这么大的工程源码该如何下手阅读呢?我们必须理清楚这些工程的职责和关系,才能够抽丝剥茧的把dubbo搞清楚。

核心项目间关系

结构图说明

为了让图保持清晰明了,该图特意忽略了一些具体的api实现模块,只保留了核心的一些借口定义模块,而具体技术实现的模块忽略了。通过分析dubbo的各项目及组成关系分析出该项目如下特点。

  1. duubo的项目划分得非常细。因此导致工程数目达到几十个之多,这样的好处就是开发者可以根据自己的需求去编译符合需求的包,只保留自己需要用到的模块。缺点是导致工程接口的非常复杂。
  2. 强大的可扩展性和灵活性。dubbo抽象出了很多核心接口,而针对这些接口都提供了不同的实现了,开发者可以根据自己的需要选择各种实现,也可以根据需要扩展开发自己的实现,具有非常强大的扩展和定制能力。

核心模块职责介绍

dubbo-common

通用模块,定义了几乎所有dubbo模块都会使用到的一些通用与业务领域无关的工具类(io处理、日志处理、配置处理、类处理等等),线程池扩展、二进制代码处理、class编译处理、json处理、数据存储接口,系统版本号等等通用的类和接口。

dubbo-rpc-api

分布式服务框架的核心是rpc,这是最基本的功能,这个模块定义了rpc的一些抽象的rpc接口和实现类,包括服务发布,服务调用代理,远程调用结果及异常,rpc调用网络协议,rpc调用监听器和过滤器等等。该模块提供了默认的基于dubbo协议的实现模块,还提供了hessian、http、rest、rmi、thrift和webservice等协议的实现,还实现了injvm的本地调用实现,灵活性强,非常通用,能够满足绝大多数项目的使用需求,而且还可以自行实现rpc协议。

dubbo-registry-api

注册中心也是最重要的组成部分,它是rpc中的consumer和provider两个重要角色的协调者。该项目定义了核心的注册中心接口和实现。具体实现留给了其它项目。有一个默认的实现模块,组册中心提供了mutilcast、redis和zookeeper等多种方式的注册中心实现,用于不同的使用场景。

dubbo-remoting-api

该模块是dubbo中的远程通讯模块。rpc的实现基础就是远程通讯,consmer要调用provider的远程方法必须通过网络远程通讯实现。该模块定义了远程传输器、终端(endpoint)、客户端、服务端、编码解码器、数据交换、缓冲区、通讯异常定义等等核心的接口及类构成。他是对于远程网络通讯的抽象。提供了诸如netty、mina、grizzly、http、p2p和zookeeper的协议和技术框架的实现方式。

dubbo-monitor-api

该模块是dubbo的监控模块,通过该模块可以监控服务调用的各种信息,例如调用耗时、调用量、调用结果等等,监控中心在调用过程中收集调用的信息,发送到监控服务,在监控服务中可以存储这些信息,对这些数据进行统计分析,最终可以产生各种维护的调用监控信息。dubbo默认提供了一个实现,该实现非常简单,只是作为默认的实现范例,生产环境使用价值不高,需要自行实现自己的监控。

dubbo-container-api

dubbo服务运行容器api模块。定义了启动容器列表的包含应用程序入口main方法的类Main;定义了容器接口Container,该接口包含了启动和停止方法定义;还有一些通用的分页功能的相关类。dubbo内置了javaconfig、jetty、log4j、logback和spring几种容器的实现。

dubbo-config-api

从图中可以看出改模块依赖了几乎所有的其它模块,他是dubbo的配置模块,通过它的配置和组装将dubbo组件的多个模块整合在一起给最终的开发者提供有价值的分布式服务框架。通过它的配置可以让开发者选择符合自己需求和使用场景的模块和技术,它定义了面向dubbo使用者的各种信息配置,比如服务发布配置、方法发布配置、服务消费配置、应用程序配置、注册中心配置、协议配置、监控配置等等。另外还有一个spring的配置模块,定义了一些spring的XML Schema,能够大大简化使用dubbo的配置,可以大大降低spring使用场景的学习和配置成本。

dubbo-cluster

该模块是dubbo实现的集群模块。支持远程服务的集群,支持多种集群调用策略,包括failover,failsafe,failfast,failback,forking等。并且支持目录服务,注册中心就是目录服务的一种实现,支持负载均衡,该模块还实现了路由器特性,此外还包括合并技术,当将调用请求分发给所有的服务提供者,则会返回多个结果,则将多个结果合并需要用到合并器的实现,该模块也是非常重要的一个模块。

dubbo-admin

该项目是一个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整体架构和流程图

next

dubbo-rpc-api是最为核心的模块,我们将从该模块入手来研究。

 

© 著作权归作者所有

共有 人打赏支持
杨武兵

杨武兵

粉丝 255
博文 61
码字总数 123254
作品 1
昌平
架构师
私信 提问
从零学习游戏服务器开发(一) 从一款多人联机实时对战游戏开始

写在前面的话 经常有学生或者初学者问我如何去阅读和学习一个开源软件的代码,也有不少朋友在工作岗位时面对前同事留下的项目,由于文档不完善、代码注释少、工程数量大,而无从下手。本文将...

张小方
2018/05/24
0
0
从零学习游戏服务器开发(一) 从一款多人联机实时对战游戏开始

版权声明:欢迎关注我的微信公众号:「easyserverdev」,中文名:『高性能服务器开发』。 https://blog.csdn.net/analogous_love/article/details/80290524 写在前面的话 经常有学生或者初学...

analogous_love
2018/05/15
0
0
关于Jeecg互联网化dubbo改造方案

随着互联网化越来越走近生活,国家也在推广互联网+,传统的垂直应用架构无法应对,所以我设想对jeecg进行垂直服务化拆分。 借助dubbo官网提供 从节点的角色可以看出 Provider: 暴露服务的服务...

Jeecg
2016/08/03
41
0
SpringMVC+Mybatis+Mysql实战项目学习--环境搭建【转】

1.开发IDE:Spring Tool Suite(自带maven插件) 保证编码格式为utf-8 -Dfile.encoding=UTF-8 2.jdk:java 1.8 下载地址http://www.oracle.com/tech 1.开发IDE:Spring Tool Suite(自带maven插......

看到了打开了
2016/10/05
182
1
Could not find com.android.tools.build:gradle:3.0.1

版权声明: https://blog.csdn.net/lfdfhl/article/details/84191614 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–o...

谷哥的小弟
2018/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

zookeeper和HBASE总结

zookeeper快速上手 zookeeper的基本功能和应用场景 zookeeper的整体运行机制 zookeeper的数据存储机制 数据存储形式 zookeeper中对用户的数据采用kv形式存储 只是zk有点特别: key:是以路径...

瑞查德-Jack
46分钟前
1
0
Oracle 查询时间在当天的数据

要实现这个功能需要用到trunc这个函数对时间的操作select trunc(sysdate) from dual --2014-12-27 今天的日期为2014-12-27select trunc(sysdate, 'mm') from dual --2014-12-1 ......

覃光林
48分钟前
1
0
阿里技术专家详解 Dubbo 实践,演进及未来规划

作者:曹胜利 链接:https://www.infoq.cn/article/IwZCAp3jo_H5fJFbWOZu?utm_source=tuicool&utm_medium=referral Dubbo 整体介绍 Dubbo 是一款高性能,轻量级的 Java RPC 框架。虽然它是以...

Java干货分享
51分钟前
1
0
深入解读阿里云数据库POLARDB核心功能物理复制技术

日志是数据库的重要组成部份,按顺序以增量的方式记录了数据库上所有的操作,日志模块的设计对于数据库的可靠性、稳定性和性能都非常重要。 可靠性方面,在有一个数据文件的基础全量备份后,...

阿里云官方博客
55分钟前
1
0
Python数据科学环境:Anaconda 了解一下

几乎所有的 Python 学习者都遇到过“安装”方面的问题。这些安装问题包括 Python 自身环境的安装、第三方模块的安装、不同版本的切换,以及不同平台、版本间的兼容问题等。当你因为这些问题而...

crossin
56分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部