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


    本文主要说明点

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

    概述

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

    背景

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

    image

    需要解决下面的问题

    • 单一应用架构

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

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

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

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

    需求

    image

    dubbo解决下面几个需求

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

    架构

    dubbo-architucture

    节点角色说明

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

    调用关系说明

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

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

    连通性

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

    健壮性

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

    伸缩性

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

    升级性

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

    dubbo-architucture-futures

    节点角色说明

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

    Dubbo源代码项目结构

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

    /dev-guide/images/dubbo-modules.jpg

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

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

    依赖关系

    /dev-guide/images/dubbo-relation.jpg

    图例说明:

    • 图中小方块 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-registry 包结构

    dubbo-monitor

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

    dubbo-monitor 包结构

    dubbo-config

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

    dubbo-config 包结构

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

    dubbo-container

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

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

    dubbo-container 包结构

    dubbo-filter

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

    dubbo-filter 包结构

    dubbo-plugin

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

    dubbo-plugin 包结构

    hessian-lite

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

    提交历史如下:

    hessian-lite 提交历史

    dubbo-demo

    dubbo-demo 快速启动示例

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

    dubbo-test

    dubbo-test 测试模块

    dubbo-test 包结构

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

    引入关系

    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

  • 相关阅读:
    php无限极分类
    如何使用百度地图
    如何在windows下用IDA优雅调试ELF
    [补] winpcap编程——EAPSOCKET实现校园网锐捷登录(mentohust)
    [补] winpcap编程——EAP协议与EAPSOCKET实现
    [补] windows C socket编程——大物实验预约
    [C++ Calculator 项目] 文件读入与可视化实现
    Area of Circle
    [C++ Calculator 项目] 基础运算实现
    [C++ Calculator 项目] 初试
  • 原文地址:https://www.cnblogs.com/wangshouchang/p/9800659.html
Copyright © 2020-2023  润新知