本文主要说明点

  1. 概述
  2. 背景
  3. 需求
  4. 架构
  5. Dubbo源代码项目结构

概述

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

背景

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

需要解决下面的问题

  • 单一应用架构

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

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

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

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

需求

dubbo解决下面几个需求

  1. 当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大
  2. 服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动
  3. 服务的调用量越来越大,服务的容量问题就暴露出来 机器管理,流量的控制等

架构

节点角色说明

节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器

调用关系说明

  1. 服务容器负责启动,加载,运行服务提供者
  2. 服务提供者在启动时,向注册中心注册自己提供的服务
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

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 ,基于 JettyTomcat 实现。
    • 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 提供特性。

整体流程如下:

dubbo-registry

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

dubbo-monitor

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

dubbo-config

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

推荐阅读 《Dubbo 开发指南 —— 配置设计》

dubbo-container

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

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

dubbo-filter

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

dubbo-plugin

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

hessian-lite

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

提交历史如下:

dubbo-demo

dubbo-demo 快速启动示例

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

dubbo-test

dubbo-test 测试模块

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 入门之二 ——- 项目结构解析的更多相关文章

  1. ionic项目结构解析

    ionic项目结构解析 原始结构 创建一个IonicDemo项目 'ionic start IonicDemo sidemenu' 这种结构多模块开发比较麻烦,因为view跟controller分开路 ...

  2. vue(16)vue-cli创建项目以及项目结构解析

    vue-cli创建项目 上一篇我们安装了vue-cli,接下来我们就使用该脚手架进行创建项目 1.进入一个目录,创建项目 创建项目命令如下: vue create <Project Name&g ...

  3. dubbo、web应用 项目结构以及发布目录结构

    一.dubbo服务项目结构及发布结构 dubbo 服务项目结构 xxxxx-api 接口类和一些DTO 用于供其他项目依赖 需要提供dubbo服务的接口命名 以Facade结尾 (xxxxxFacad ...

  4. TypeScript编写Vue项目结构解析

    使用TypeScript编写Vue项目也已经有了一段时间,笔者在刚刚使用TypeScript时候也是很茫然,不知道从何下手,感觉使用TypeScript写项目感觉很累赘并不像JavaScript那么灵 ...

  5. Minecraft Forge编程入门三 “初始化项目结构和逻辑”

    经过前面两个教程Minecraft Forge编程入门一 "环境搭建"和Minecraft Forge编程入门二 "工艺和食谱",我们大体知道了如何自定义合成配 ...

  6. dubbo入门学习(二)-----dubbo hello world

    一.dubbo hello world入门示例 1.提出需求 某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址: 我们现在需要创建两个服务模块进行测试: 模块 功能 订单服务web模块 创 ...

  7. vs项目结构解析

    当我们用VS开发一个项目的时候,首先应该清楚用VS这个IDE生成的一些文件和文件夹是什么意思,起什么作用,什么场合下使用. 因为我使用的是VS2015,就以这个为例来进行一些说明: 首先要做的是更改你 ...

  8. 分布式服务框架Dubbo入门案例和项目源码

    本项目源代码:http://download.csdn.net/detail/fansunion/9498406 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案, 是 ...

  9. ionic 2.x 3.x项目结构解析

    myApp │ config.xml //项目配置文件,包名.名称.minSdkVersion等都在此处配置 │ ionic.config.json │ package.json //项目依赖文件列表 ...

随机推荐

  1. k8s1.13.3安装istio(helm方式)

    官方文档:https://istio.io/zh/docs/setup/kubernetes/install/helm/ 一.环境信息 centos7 k8s1.13.3 主机名 ip cpu ram ...

  2. fiddler抓包工具总结

    Fiddler 抓包工具总结 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也 ...

  3. spring aop 的代理工厂

    参考 https://docs.spring.io/spring/docs/4.3.11.RELEASE/spring-framework-reference/htmlsingle/#aop-unde ...

  4. Android Studio将引用第三方jar包的library打包成jar包

    在该module的build.gradle中添加 task makeJar(type: Jar) { archiveName 'mysdk.jar' from('build/intermediates ...

  5. Runnable与Callable区别

    相同点: 两者都是接口:(废话) 两者都可用来编写多线程程序: 两者都需要调用Thread.start()启动线程: 不同点: 两者最大的不同点是:实现Callable接口的任务线程能返回执行结果:而 ...

  6. Python基础-if判断以及其他循环

    if else 判断: #!/usr/bin/env python # -*- coding:utf-8 -*- import getpass name = input("用户名??&quo ...

  7. appium安装问题集锦

    问题一: MacBook-Air:Cellar$ npm -v dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.61.dyl ...

  8. [ 10.4 ]CF每日一题系列—— 486C

    Description: 给你一个指针,可以左右移动,指向的小写字母可以,改变,但都是有花费的a - b 和 a - z花费1,指针移动也要花费,一个单位花费1,问你把当前字符串变成回文串的最小化费是 ...

  9. 报错:Maximum call stack size exceeded

    最后通过查看一篇别人的博客,通过对照,发现我把参数值写反了,把参数a的值写成了参数b的值.详情可以看如下博客: https://www.cnblogs.com/dunitian/p/5865725.h ...

  10. PSR-PHP开发规范(本文版权归作者:luluyrt@163.com)

    遵循PSR-4的自动加载 一.简介 首先这里要了解PSR,Proposing a Standards Recommendation(提出标准建议)的缩写,就是一种PHP开发规范,让我们研发出来的代码更 ...