74

Dubbo 入门之二 ——- 项目结构解析

 5 years ago
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.

本文主要说明点

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

概述

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

背景

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

R7FJNv7.jpg!web

需要解决下面的问题

  • 单一应用架构

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

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

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

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

需求

aEzI3eM.jpg!web

dubbo解决下面几个需求

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

架构

FZbqAnQ.jpg!web

节点角色说明

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

调用关系说明

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

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

连通性

  • 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
  • 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
  • 服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
  • 服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
  • 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
  • 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
  • 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
  • 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

健壮性

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

伸缩性

  • 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心
  • 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者

升级性

  • 需要实现动态部署,进行流动计算
  • 下图是未来可能的一种架构

UZBJ3qI.jpg!web

节点角色说明

节点 角色说明 Deployer 自动部署服务的本地代理 Repository 仓库用于存储服务应用发布包 Scheduler 调度中心基于访问压力自动增减服务提供者 Admin 统一管理控制台 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数和调用时间的监控中心

Dubbo源代码项目结构

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

mqMjEny.jpg!web

7BfENfF.jpg!web

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

  • **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 模块中,以便更大程度复用。

依赖关系

UV3EFjY.jpg!web

图例说明:

  • 图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互。
  • 图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点。
  • 图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用。
  • 图中只包含 RPC 的层,不包含 Remoting 的层,Remoting 整体都隐含在 Protocol 中。

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

dubbo-common

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

YZfyeaJ.jpg!web

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

dubbo-remoting

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

3QfMj2J.jpg!web

  • 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 提供特性

JVfMNnv.jpg!web

  • dubbo-rpc-api
    • 抽象 各种协议以及动态代理, 实现 了一对一的调用。
  • 其他模块,实现 dubbo-rpc-api ,提供对应的协议实现
  • dubbo-rpc-default
    • 对应 dubbo:// 协议。

dubbo-cluster

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

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

ry6Zrue.jpg!web

整体流程如下:

6nM7J3R.png!web

dubbo-registry

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

vMBV7fv.png!web

dubbo-monitor

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

aaYbiiE.png!web

dubbo-config

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

67zmUbA.png!web

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

dubbo-container

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

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

MJ7faif.png!web

dubbo-filter

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

NV3qMnY.png!web

dubbo-plugin

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

NFnAr2A.png!web

hessian-lite

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

提交历史如下:

R7NJrin.png!web

dubbo-demo

dubbo-demo 快速启动示例

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

dubbo-test

dubbo-test 测试模块

Rnm2Yfr.png!web

  • 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 举例子:

feuAVnu.png!web

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK