Dubbo 入门之二 ——- 项目结构解析
source link: http://wsccoder.top/2018/10/15/Dubbo-入门之二-项目结构解析/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
本文主要说明点
- 概述
- 背景
- 需求
- 架构
- 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-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 开发指南 —— 配置设计》 。
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
,提供在线运维命令。
hessian-lite
hessian-lite
:Dubbo 对 Hessian 2 的 序列化 部分的精简、改进、BugFix 。
提交历史如下:
dubbo-demo
dubbo-demo
快速启动示例 。
参见 《Dubbo 用户指南 —— 快速启动》 文档。
dubbo-test
dubbo-test
测试模块 。
-
dubbo-test-benchmark
,性能测试。
- 参考 《Dubbo 用户指南 —— 性能测试报告》 文档。
-
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
举例子:
3.14.4 dubbo-all
dubbo/all/pom.xml
,Dubbo All Pom ,定义了 Dubbo 的 打包脚本 。
我们在使用 Dubbo 库时,引入该 pom 文件。
引用参考自 下列文章
http://svip.iocoder.cn/Dubbo/intro/
https://dubbo.incubator.apache.org/zh-cn/docs/user/preface/background.html
https://dubbo.incubator.apache.org/zh-cn/docs/user/preface/architecture.html
https://dubbo.incubator.apache.org/zh-cn/docs/dev/build.html
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK