本文主要说明点

  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. 导出mysql的表格内容到txt文件

    操作流程: $ mysql -uroot -p mysql> use foo; mysql> select * from userinfo into outfile '/var/lib/m ...

  2. 20155205 郝博雅 《网络对抗技术》Exp1 PC平台逆向破解

    20155205 郝博雅 <网络对抗技术>Exp1 PC平台逆向破解 一.实验准备 1. 掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令& ...

  3. Paper | 量化CV任务的关联性,寻找最佳迁移策略(Taskonomy)

    目录 1. 问题 2. 方法 3. 实验设计 3.1. 解决词典内部(一组已知)任务的能力 3.2. 解决新任务(少量标记数据)的能力 4. 讨论和启发 论文:Taskonomy: Disentang ...

  4. scrapy的入门使用(一)

    1. scrapy项目实现流程 创建一个scrapy项目:scrapy startproject mySpider 生成一个爬虫:scrapy genspider  提取数据:完善spider,使用x ...

  5. Eclipse搭建服务器,实现与Android的简单通信

    ---恢复内容开始--- 目标:实现客户端(Android App)与服务器(PC)的简单通信 相关准备:eclipse_mars.tomcat8.Android Studio 实现: 1.java环 ...

  6. JAVA:简单添加菜单界面(swing)第二版

    环境:jdk1.8 package com.le.tool; import java.awt.Color; import java.awt.Container; import java.awt.Flo ...

  7. VMware安装xp虚拟机

    VMware安装xp虚拟机 1.用到的软件: 2.安装VMware:  接受 选择自定义 要等上一小会. 输入密钥:百度一个就可以了. 安装成功: 禁用VMware网卡: 3.安装xp系统: 创建新的 ...

  8. jQuery获取父级、兄弟节点的方法

    一.jQuery的父节点查找方法 $(selector).parent(selector):获取父节点 $(selector).parentNode:以node[]的形式存放父节点,如果没有父节点,则 ...

  9. 瞎搞poj1013

    http://poj.org/problem?id=1013 题意:给你标记从A到L的石子,其中有一个石子,可能会轻于其它石子,也可能重于其它石子.你只能通过三次天平的测量去找到这个石子.天平的三个状 ...

  10. TeeChart For VCL/FMX V2017使用教程:第一章-准备开始

    https://blog.csdn.net/vbfgm/article/details/79338775 第一章 准备开始-构建图表和填充数据序列 1.1 简介 通过代码或Dataset(数据集)访问 ...