文档章节

Dubbo (二) ——- 项目结构解析

 小刀爱编程
发布于 2018/10/16 15:49
字数 3532
阅读 743
收藏 12

本文主要说明点

概述

背景

需求

架构

Dubbo源代码项目结构

概述

分享 Dubbo 的项目结构 ,通过本文可以大致了解到Dubbo整个项目的结构

背景

将一个项目进行拆分, 进行分布式架构。

需要解决下面的问题

单一应用架构

网站流量少时单一架构,简化开发。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

垂直应用架构

访问大时单一应用速度过小,需要进行应用拆分。此时,用于加速前端页面开发的Web框架(MVC)是关键。

分布式服务架构

当垂直应用过多,将核心业务独立服务。然后提供给其他项目内部调用。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

流动计算架构

当服务更多的时候,对流量的控制,服务的限流,熔断等操作。而且还需要管理集群容量,提供集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

需求

dubbo解决下面几个需求

当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大

服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动

服务的调用量越来越大,服务的容量问题就暴露出来 机器管理,流量的控制等

架构

节点角色说明

节点角色说明

Provider暴露服务的服务提供方

Consumer调用远程服务的服务消费方

Registry服务注册与发现的注册中心

Monitor统计服务的调用次数和调用时间的监控中心

Container服务运行容器

调用关系说明

服务容器负责启动,加载,运行服务提供者

服务提供者在启动时,向注册中心注册自己提供的服务

服务消费者在启动时,向注册中心订阅自己所需的服务。

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

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

服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo 架构 下面特点 连通性、健壮性、伸缩性、以及向未来架构的升级性

连通性

注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小

监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示

服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销

服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销

注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外

注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者

注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表

注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

健壮性

监控中心宕掉不影响使用,只是丢失部分采样数据

数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务

注册中心对等集群,任意一台宕掉后,将自动切换到另一台

注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯

服务提供者无状态,任意一台宕掉后,不影响使用

服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

伸缩性

注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心

服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者

升级性

需要实现动态部署,进行流动计算

下图是未来可能的一种架构

节点角色说明

节点角色说明

Deployer自动部署服务的本地代理

Repository仓库用于存储服务应用发布包

Scheduler调度中心基于访问压力自动增减服务提供者

Admin统一管理控制台

Registry服务注册与发现的注册中心

Monitor统计服务的调用次数和调用时间的监控中心

Dubbo源代码项目结构

**模块分包 ** 每个模块都是相互隔离的,可插拔的。下面的这个图是模块引用图

下面对着这些模块做个简单介绍

**dubbo-common **

公共逻辑模块 :包括 Util 类和通用模型。

**dubbo-remoting **

远程通讯模块 :相当于 Dubbo 协议的实现,如果 RPC 用 RMI协议则不需要使用此包。

dubbo-rpc

** 远程调用模块**:抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。

dubbo-cluster

** 集群模块**:将多个服务提供方伪装为一个提供方,

包括:负载均衡, 容错,路由等,集群的地址列表可以是静态配置的,也可以是由注册中心下发。

**dubbo-registry **

注册中心模块 :基于注册中心下发地址的集群方式,以及对各种注册中心的抽象

dubbo-monitor

** 监控模块**:统计服务调用次数,调用时间的,调用链跟踪的服务。

**dubbo-config **

配置模块 :是 Dubbo 对外的 API,用户通过 Config 使用D ubbo,隐藏 Dubbo 所有细节。

**dubbo-container **

容器模块 :是一个 Standlone 的容器,以简单的 Main 加载 Spring 启动,

因为服务通常不需要 Tomcat/JBoss 等 Web 容器的特性,没必要用 Web 容器去加载服务。

整体上按照分层结构进行分包,与分层的不同点在于:

container 为服务容器,用于部署运行服务,没有在层中画出。

protocol 层和 proxy 层都放在 rpc 模块中,这两层是 rpc 的核心,在不需要集群也就是只有一个提供者时,可以只使用这两层完成 rpc 调用。

transport 层和 exchange 层都放在 remoting 模块中,为 rpc 调用的通讯基础。

serialize 层放在 common 模块中,以便更大程度复用。

依赖关系

图例说明:

图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互。

图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点。

图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用。

图中只包含 RPC 的层,不包含 Remoting 的层,Remoting 整体都隐含在 Protocol 中。

下面对各个模块进行分解介绍

dubbo-common

公共逻辑模块:包括 Util 类和通用模型。

作用提供一些工具类和通用模型例如 com.alibaba.dubbo.common.URL 

dubbo-remoting

远程通讯模块:相当于 Dubbo 协议的实现,如果 RPC 用 RMI协议则不需要使用此包。

dubbo-remoting-zookeeper

相当于 Zookeeper 客户端,与ZK 服务器通信

dubbo-remoting-api

定义Dubbo CLient和 Dubbo Server的接口规则

实现 dubbo-remoting-api

dubbo-remoting-grizzly ,基于 Grizzly 实现。

dubbo-remoting-http ,基于 Jetty 或 Tomcat 实现。

dubbo-remoting-mina ,基于 Mina 实现。

dubbo-remoting-netty ,基于 Netty 3 实现。

dubbo-remoting-netty4 ,基于 Netty 4 实现。

dubbo-remoting-p2p ,P2P 服务器。注册中心 dubbo-registry-multicast 项目的使用该项目。

dubbo-rpc

远程调用模块:抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理

集群相关的管理,由 dubbo-cluster 提供特性

dubbo-rpc-api

抽象 各种协议以及动态代理, 实现 了一对一的调用。

其他模块,实现 dubbo-rpc-api ,提供对应的协议实现

协议参考手册

dubbo-rpc-default

对应 dubbo:// 协议。

dubbo-cluster

集群模块:将多个服务提供方伪装为一个提供方,包括:负载均衡, 集群容错,路由,分组聚合等。集群的地址列表可以是静态配置的,也可以是由注册中心下发。

注册中心下发,由 dubbo-registry 提供特性。

容错

com.alibaba.dubbo.rpc.cluster.Cluster 接口 + com.alibaba.dubbo.rpc.cluster.support 包。

Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。

拓展参见 《Dubbo 用户指南 —— 集群容错》 和 《Dubbo 开发指南 —— 集群扩展》 文档。

目录

com.alibaba.dubbo.rpc.cluster.Directory 接口 + com.alibaba.dubbo.rpc.cluster.directory 包。

Directory 代表了多个 Invoker ,可以把它看成 List ,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更。

路由

com.alibaba.dubbo.rpc.cluster.Router 接口 + com.alibaba.dubbo.rpc.cluster.router 包。

负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等。

拓展参见 《Dubbo 用户指南 —— 路由规则》 和 《Dubbo 开发指南 —— 路由拓展》 文档。

配置

com.alibaba.dubbo.rpc.cluster.Configurator 接口 + com.alibaba.dubbo.rpc.cluster.configurator 包。

拓展参见 《Dubbo 用户指南 —— 配置规则》 文档。

负载均衡

com.alibaba.dubbo.rpc.cluster.LoadBalance 接口 + com.alibaba.dubbo.rpc.cluster.loadbalance 包。

LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。

拓展参见 《Dubbo 用户指南 —— 负载均衡》 和 《Dubbo 开发指南 —— 负载均衡拓展》 文档。

合并结果

com.alibaba.dubbo.rpc.cluster.Merger 接口 + com.alibaba.dubbo.rpc.cluster.merger 包。

合并返回结果,用于分组聚合。

拓展参见 《Dubbo 用户指南 —— 分组聚合》 和 《Dubbo 开发指南 —— 合并结果扩展》 文档。

整体流程如下:

dubbo-registry

注册中心模块:基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。

dubbo-registry-api , 抽象 注册中心的注册与发现接口。

其他模块,实现 dubbo-registry-api ,提供对应的注册中心实现。在 《用户指南 —— 注册中心参考手册》 中,可以看到每种注册中心的介绍。

另外, dubbo-registry-default 对应 Simple 注册中心。

拓展参见 《Dubbo 开发指南 —— 注册中心扩展》 文档。

dubbo-monitor

监控模块:统计服务调用次数,调用时间的,调用链跟踪的服务

拓展参见 《Dubbo 开发指南 —— 监控中心扩展》 。

dubbo-config

配置模块:是 Dubbo 对外的 API,用户通过 Config 使用Dubbo,隐藏 Dubbo 所有细节。

dubbo-config-api ,实现了 API 配置 和 属性配置 功能。

dubbo-config-spring ,实现了 XML 配置 和 注解配置 功能。

dubbo-container

容器模块:是一个 Standlone 的容器,以简单的 Main 加载 Spring 启动,

因为服务通常不需要 Tomcat/JBoss 等 Web 容器的特性,没必要用 Web 容器去加载服务。

dubbo-container-api :定义了 com.alibaba.dubbo.container.Container 接口,并提供 加载所有容器启动的 Main 类。

实现

dubbo-container-api

dubbo-container-spring ,提供了 com.alibaba.dubbo.container.spring.SpringContainer 。

dubbo-container-log4j ,提供了 com.alibaba.dubbo.container.log4j.Log4jContainer 。

dubbo-container-logback ,提供了 com.alibaba.dubbo.container.logback.LogbackContainer 。

拓展参考 《Dubbo 用户指南 —— 服务容器》 和 《Dubbo 开发指南 —— 容器扩展》 文档。

dubbo-filter

过滤器模块:提供了 内置 的过滤器。

dubbo-filter-cache

,缓存过滤器。

拓展参考 《Dubbo 用户指南 —— 结果缓存》 和 《Dubbo 开发指南 —— 缓存拓展》 文档。

dubbo-filter-validation

,参数验证过滤器。

拓展参考 《Dubbo 用户指南 —— 参数验证》 和 《Dubbo 开发指南 —— 验证扩展》 文档。

dubbo-plugin

过滤器模块:提供了 内置 的插件。

dubbo-qos

,提供在线运维命令。

拓展参考 《Dubbo 用户指南 —— 新版本 telnet 命令使用说明》 和 《Dubbo 开发指南 —— Telnet 命令扩展》 文档。

hessian-lite

hessian-lite :Dubbo 对 Hessian 2 的 序列化 部分的精简、改进、BugFix 。

提交历史如下:

dubbo-demo

dubbo-demo 快速启动示例 。

参见 《Dubbo 用户指南 —— 快速启动》 文档。

dubbo-test

dubbo-test 测试模块 。

在此我向大家推荐一个架构学习交流群。交流学习群号:821169538  里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多。

dubbo-test-benchmark

,性能测试。

dubbo-test-compatibility

,兼容性测试。

dubbo-test-spring3 ,测试对 Spring 3 的兼容性。

dubbo-test-example , 使用示例 。

Maven POM

dubbo-dependencies-bom

dubbo-dependencies-bom/pom.xml ,Maven BOM(Bill Of Materials) , 统一 定义了 Dubbo 依赖的三方库的版本号:

dubbo-parent 会引入该 BOM :

dubbo-bom

dubbo-bom/pom.xml ,Maven BOM(Bill Of Materials) , 统一 定义了 Dubbo 的版本号:

dubbo-parent

dubbo/pom.xml ,Dubbo Parent Pom 。

Dubbo 的 Maven 模块,都会引入该 pom 文件。以 dubbo-cluster 举例子:

出处: http://wsccoder.top/2018/10/15/Dubb

© 著作权归作者所有

粉丝 88
博文 108
码字总数 357080
作品 0
黄浦
私信 提问
关于Jeecg互联网化dubbo改造方案

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

Jeecg
2016/08/03
110
0
Dubbo实战一:快速入门 [译]

本文根据https://github.com/alibaba/dubbo 的README,然后实战操作记录如下: 一、简介 Dubbo不单单只是高性能的RPC调用框架,更是SOA服务治理的一种方案。 核心: 1. 远程通信,向本地调用...

泥沙砖瓦浆木匠
2016/04/03
211
0
搭建Dubbo开发学习环境——补充新版本的Dubbo-Admin的编译和执行过程

由于最近公司正在进行服务治理和改造,越来越多的项目将会被分拆成服务的形式从原有的高耦合度的项目中剥离。作为(接口)性能测试,也需要跟上变化。本文的写作目的,在于搭建一个Zookeeper...

海上测试猿
2018/05/24
0
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
210
1
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/07
172
0

没有更多内容

加载失败,请刷新页面

加载更多

从AnnotationTransactionAspect开始rushSpring事务

0. Spring 事务 with LTW 0.1. Spring 事务 With LTW的原因: Pure Proxy-base mode有缺陷,其失效原因分析及使用方法及运行机制(LoadTimeWeaverBeanDefinitionParser和 AspectJWeavingEnable......

Aruforce
11分钟前
2
0
mac 安装protobuf 2.5.0

下载安装包 目前protobuf的最新版本是3.9.1,但是hadoop等好多框架依然依赖的是2.5.0,因此,最好不要安装最新的。 https://github.com/protocolbuffers/protobuf/releases/tag/v2.5.0 编译安...

hexiaoming123
16分钟前
3
0
Qt编写自定义控件52-颜色下拉框

一、前言 这个控件写了很久了,元老级别的控件之一,开发之初主要是自己的好几个项目要用到,比如提供一个颜色下拉框设置对应的曲线或者时间颜色,视频监控项目中经常用到的OSD标签设置,这个...

飞扬青云
23分钟前
2
0
Shell脚本应用 – for、while循环语句

通过Shell脚本应用(二)学习到了if条件条件语句的使用方法等。Shell作为一种脚本编程语言,同样了包含了循环,分支等其他程序控制结构,从而能够轻松完成更加复杂、强大的功能。我们今天就来...

Linux就该这么学
28分钟前
3
0
Sqoop之导入到Hive时特殊字符导致数据变乱

问题是这样的: Sqoop从关系型数据库导入数据到Hive时,发现数据量增多了,查找之后发现是由于源数据中含义\r\t\n特殊字符的数据,这样Hive遇到之后就将其视为换行,所以导入到Hive后数据条数...

克虏伯
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部