Dubbo源码环境

前言

上一篇文章中对 Dubbo 的整个项目结构进行了说明,本篇文章我们来进行源码搭建及核心模块说明。

Dubbo 架构

节点角色说明

以下说明中注册中心以 Zookeeper 为例,不同的注册中心的注册和订阅是不同的。

  • Registry 注册中心
    注册中心负责服务地址的注册与查找,服务提供者和消费者只在启动时与注册中心交互(以客户端形式),注册中心不转发请求,压力较小。注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者。注册中心,服务提提供者,服务消费者三者之间均为长连接。

  • Provider 服务提供者
    启动的时候向注册中心进行注册操作,将自己的服务地址和相关配置信息封装成 Dubbo URL 添加到注册中心中。服务提供者无状态,任意一台宕机后不影响使用,全部宕机后服务消费者应用将无法使用。

  • Consumer 服务消费者
    启动的时候向注册中心进行注册和订阅操作,注册操作会将自己的服务地址和相关配置信息封装成 Dubbo URL 添加到注册中心中。订阅操作会从注册中心中获取服务提供者注册的URL,并在注册中心中添加相应的监听器。获取到服务提供者URL列表后,消费者会根据负载均衡算法从多个服务提供者中选择一个服务提供者并与其建立连接,最后对服务提供者发起远程调用。如果服务提供者 URL 发生变更,消费者将会通过之前订阅过程中在注册中心添加的监听器,获取到最新的服务提供者URL列表,然后更新服务目录。消费者与提供者建立的是长连接,且消费者会在本地缓存服务提供者列表,所以一旦连接建立,即使注册中心宕机,服务提供者和服务消费者仍能通过本地缓存通讯。

  • Monitor 监控中心

    统计服务的调用次数和调用时间。服务提供者和服务消费者在运行过程中,会在内存中统计调用次数和调用时间,定时发送统计数据到监控中心。监控中心在架构图中不是必要角色,监控中心宕机只会丢失监控数据而已,其它的没有影响。

调用关系

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

源码环境搭建

  • 直接从官方仓库克隆源代码
    1
    https://github.com/apache/dubbo.git
  • 切换分支,使用 Dubbo 2.6.5 版本
    1
    git checkout -b dubbo-2.6.5 dubbo-2.6.5
  • 编译
    1
    mvn clean install -Dmaven.test.skip=true

Dubbo 源码核心模块说明

编译完成后我们可以看到项目结构如下图所示:

下面我们简单介绍上图中的核心模块,每个模块的分析将在后面的文章中详细说明。

dubbo-common 模块

Dubbo 的一个公共模块,里面包含了动态编译相关实现、Dubbo SPI的核心实现、日志框架集成,线程池相关的工具类等。

dubbo-remoting 模块

Dubbo 的远程通信模块,其中的子模块依赖各种开源组件实现远程通信。dubbo-remoting-api 子模块中定义了远程通信的抽象概念,其它子模块依赖开源组件进行实现,如 dubbo-remoting-netty 子模块依赖 Netty 3 实现远程通信。

dubbo-rpc 模块

Dubbo 的远程调用协议模块,其中抽象了各种协议,依赖于远程通信模块的远程调用功能。dubbo-rpc-api 子模块中定义了调用协议的抽象,其它子模块是针对具体协议的实现,如 dubbo-rpc-dubbo 子模块是对 Dubbo 协议的实现,依赖了 dubbo-remoting 模块中的 Netty 等子模块。注意,dubbo-rpc 模块的实现中只包含一对一的调用,不关心集群的内容。

dubbo-cluster 模块

Dubbo 中负责管理集群的模块,提供了负载均衡、路由、容错等集群相关的功能。

dubbo-registry 模块

Dubbo 中负责与多种注册中心交互的模块,提供注册中心的能力。dubbo-registry-api 子模块是对注册中心的抽象,其它子模块是针对具体注册中心的实现,如 dubbo-registry-zookeeper 子模块是 Dubbo 接入 Zookeeper 的具体实现。

dubbo-config 模块

Dubbo 的配置信息是由该模块定义和解析的。dubbo-config-api 子模块负责处理 API 方式的相关配置,dubbo-config-spring 子模块负责处理与 Spring 集成方式的相关配置。有了配置模块,开发者只需要根据 Dubbo 的配置规则去实现功能即可,底层实现交给 Dubbo 的各个模块去完成。

dubbo-serialization 模块

Dubbo 的序列化模块,是 Dubbo 设计的最后一层,负责管理整个框架网络传输时的序列化和反序列化工作。 dubbo-serialization-api 子模块是对序列化和反序列抽象定义,包含了很多的接口,其它子模块针对具体的序列化方式进行实现,如 dubbo-serialization-fastjson 子模块是对 fastjson 的具体实现。

小结

本篇文章简单介绍了 Dubbo 的核心架构及核心组件的功能,说明了搭建 Dubbo 源码环境步骤,最后介绍了 Dubbo 核心模块,为后续分析 Dubbo 源码做准备。