Tianji's Blog.

dubbo项目结构

Word count: 1,848 / Reading time: 9 min
2018/09/20 Share

参考: 芋道源码 http://svip.iocoder.cn/

  1. 概览

    可以看到,代码相当多,坚持就是胜利。

  1. 代码统计

    • 可以使用IDEA Statistic插件。

    • 使用shell命令

    这个命令只过滤了部分注释,所以相比 IDEA Statistic 会偏多。

    find . -name “.java”|xargs cat|grep -v -e ^$ -e ^\s\/\/.*$|wc -

  2. dubbo模块示意图

  3. dubbo-common

    公共逻辑模块:提供工具类和通用模型。

    通用模型: 比如com.alibaba.dubbo.common.URL

    • 所有扩展点参数都包含 URL 参数,URL 作为上下文信息贯穿整个扩展点设计体系。
    • URL 采用标准格式:protocol://username:password@host:port/path?key=value&key=value
  4. dubbo-remoting

    远程通信模块:提供通用的客户端和服务端的通讯功能。、

    • dubbo-remoting-zookeeper

    相当于Zookeeper Client,负责和Zookeeper Server通信。

    • dubbo-remoting-api

      定义Dubbo clientDubbo Server的接口。

    • 其他,均实现了dubbo-remoting-api

      • dubbo-remoting-grizzly
      • dubbo-remoting-http
      • dubbo-remoting-mina
      • dubbo-remoting-netty(netty3)
      • dubbo-remoting-netty4
      • dubbo-remoting-p2p P2P 服务器,注册中心 dubbo-registry-multicast 使用该项目。

    目前看来,仅仅需要看如下:

    • dubbo-remoting-api + dubbo-remoting-netty4
    • dubbo-remoting-zookeeper
  5. dubbo-rpc

    远程调用模块:抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。集群相关的管理,由 dubbo-cluster 提供特性。同时,该模块也是整个项目的核心部分。

    • dubbo-rpc-api

      抽象各种协议以及动态代理,实现了一对一的调用。

    • 其他模块则分别实现了dubbo-rpc-api,特别注意:dubbo-rpc-default对应dubbo://

  6. dubbo-cluster

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

    • 注册中心下发,有dubbo-repository提供该特性

    • 容错

      • com.alibaba.dubbo.rpc.cluster.Cluster接口+ com.alibaba.dubbo.rpc.cluster.support
      • Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。
    • 目录
      • 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 中按路由规则选出子集,比如读写分离,应用隔离等。
    • 配置
      • com.alibaba.dubbo.rpc.cluster.Configurator接口 + com.alibaba.dubbo.rpc.cluster.configurator 包。
    • 负载均衡
      • com.alibaba.dubbo.rpc.cluster.LoadBalance接口 + com.alibaba.dubbo.rpc.cluster.loadbalance 包。
      • LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。
    • 合并结果
      • com.alibaba.dubbo.rpc.cluster.Merger 接口 + com.alibaba.dubbo.rpc.cluster.merger 包。
      • 合并返回结果,用于分组聚合。
  7. dubbo-registry
    注册中心模块:基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。

    • dubbo-registry-api抽象注册中心的注册与发现接口。

    • 其他模块,实现dubbo-registry-api,提供对应的注册中心发现

    • dubbo-registry-default对应Simple注册中心

  8. dubbo-monitor

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

  9. dubbo-config

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

  10. 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
  11. dubbo-filter

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

    • dubbo-filter-cache: 缓存过滤器
    • dubbo-filter-validation:参数验证过滤器
  12. dubbo-plugin

    插件模块: 提供内置的插件

    • dubbo-qos: 提供在线运维命令
  13. hessian-lite

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

  14. dubbo-test

    测试模块

    • dubbo-test-benchmark: 性能测试
    • dubbo-test-compatibility: 兼容性测试
    • dubbo-test-example: 使用示例
  15. dependencies-bom

    统一定义dubbo依赖的第三方库的版本号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
    <groupId>org.sonatype.oss</groupId>
    <artifactId>oss-parent</artifactId>
    <version>7</version>
    <relativePath />
    </parent>

    <groupId>com.alibaba</groupId>
    <artifactId>dubbo-dependencies-bom</artifactId>
    <version>2.6.1</version>
    <packaging>pom</packaging>

    <name>dubbo-dependencies-bom</name>
    <description>Dubbo dependencies BOM</description>
    <url>http://dubbo.io</url>

    <inceptionYear>2011</inceptionYear>
    <licenses>
    <license>
    <name>Apache 2</name>
    <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
    </license>
    </licenses>

    <organization>
    <name>The Dubbo Project</name>
    <url>http://dubbo.io</url>
    </organization>

    <issueManagement>
    <system>Github Issues</system>
    <url>https://github.com/alibaba/dubbo/issues</url>
    </issueManagement>
    <scm>
    <url>https://github.com/alibaba/dubbo/tree/master</url>
    <connection>scm:git:git://github.com/alibaba/dubbo.git</connection>
    <developerConnection>scm:git:git@github.com:alibaba/dubbo.git</developerConnection>
    </scm>
    <mailingLists>
    <mailingList>
    <name>Dubbo User Mailling List</name>
    <subscribe>dubbo+subscribe@googlegroups.com</subscribe>
    <unsubscribe>dubbo+unsubscribe@googlegroups.com</unsubscribe>
    <post>dubbo@googlegroups.com</post>
    <archive>http://groups.google.com/group/dubbo</archive>
    </mailingList>
    <mailingList>
    <name>Dubbo Developer Mailling List</name>
    <subscribe>dubbo-developers+subscribe@googlegroups.com</subscribe>
    <unsubscribe>dubbo-developers+unsubscribe@googlegroups.com</unsubscribe>
    <post>dubbo-developers@googlegroups.com</post>
    <archive>http://groups.google.com/group/dubbo-developers</archive>
    </mailingList>
    </mailingLists>
    <developers>
    <developer>
    <id>dubbo.io</id>
    <name>The Dubbo Project Contributors</name>
    <email>dubbo@googlegroups.com</email>
    <url>http://dubbo.io</url>
    <organization>The Dubbo Project</organization>
    <organizationUrl>http://dubbo.io</organizationUrl>
    </developer>
    </developers>

    <properties>
    <!-- Common libs -->
    <spring_version>4.3.10.RELEASE</spring_version>
    <javassist_version>3.20.0-GA</javassist_version>
    <netty_version>3.2.5.Final</netty_version>
    <netty4_version>4.0.35.Final</netty4_version>
    <mina_version>1.1.7</mina_version>
    <grizzly_version>2.1.4</grizzly_version>
    <httpclient_version>4.5.3</httpclient_version>
    <fastjson_version>1.2.46</fastjson_version>
    <zookeeper_version>3.4.9</zookeeper_version>
    <zkclient_version>0.2</zkclient_version>
    <curator_version>2.12.0</curator_version>
    <jedis_version>2.9.0</jedis_version>
    <xmemcached_version>1.3.6</xmemcached_version>
    <cxf_version>3.0.14</cxf_version>
    <thrift_version>0.8.0</thrift_version>
    <hessian_version>4.0.38</hessian_version>
    <servlet_version>3.1.0</servlet_version>
    <jetty_version>6.1.26</jetty_version>
    <validation_version>1.1.0.Final</validation_version>
    <hibernate_validator_version>5.4.1.Final</hibernate_validator_version>
    <jel_version>3.0.1-b08</jel_version>
    <jcache_version>1.0.0</jcache_version>
    <kryo_version>4.0.1</kryo_version>
    <kryo_serializers_version>0.42</kryo_serializers_version>
    <fst_version>2.48-jdk-6</fst_version>

    <rs_api_version>2.0</rs_api_version>
    <resteasy_version>3.0.19.Final</resteasy_version>
    <tomcat_embed_version>8.0.11</tomcat_embed_version>
    <!-- Log libs -->
    <slf4j_version>1.7.25</slf4j_version>
    <jcl_version>1.2</jcl_version>
    <log4j_version>1.2.16</log4j_version>
    <logback_version>1.2.2</logback_version>
    <commons_lang3_version>3.4</commons_lang3_version>
    </properties>

    。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    </project>

    然后dubbo-parent会引入该pom。

    为了防止用 Maven 管理 Spring 项目时,不同的项目依赖了不同版本的 Spring ,可以使用 Maven BOM 来解决者一问题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo-dependencies-bom</artifactId>
    <version>2.6.1</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>
  16. dubbo-bom

    Maven BOM(Bill Of Materials) ,统一定义了 Dubbo 的版本号

  17. dubbo-parent

  18. dubbo-all

pom依赖图:

CATALOG