Dubbo 入门之二 ——- 项目结构解析
Posted 程序员技术前沿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo 入门之二 ——- 项目结构解析相关的知识,希望对你有一定的参考价值。
Dubbo 入门之二 ——- 项目结构解析
本文主要说明点
概述
背景
需求
架构
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 开发指南 —— 配置设计》 。
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
测试模块。
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
以上是关于Dubbo 入门之二 ——- 项目结构解析的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot+Dubbo+zookeeper 快速入门案例