模块分包

以下内容来自官方文档:https://dubbo.apache.org/zh/docs/v2.7/dev/design/

「准备」Dubbo 源码全局概览 - 图2

模块说明:

  • dubbo-common 公共逻辑模块:包括 Util 类和通用模型。
  • dubbo-remoting 远程通讯模块:相当于 Dubbo 协议的实现,如果 RPC 用 RMI协议则不需要使用此包。
  • dubbo-rpc 远程调用模块:抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。
  • dubbo-cluster 集群模块:将多个服务提供方伪装为一个提供方,包括:负载均衡, 容错,路由等,集群的地址列表可以是静态配置的,也可以是由注册中心下发。
  • dubbo-registry 注册中心模块:基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。
  • dubbo-monitor 监控模块:统计服务调用次数,调用时间的,调用链跟踪的服务。
  • dubbo-config 配置模块:是 Dubbo 对外的 API,用户通过 Config 使用Dubbo,隐藏 Dubbo 所有细节。
  • dubbo-container 容器模块:是一个 Standlone 的容器,以简单的 Main 加载 Spring 启动,因为服务通常不需要 Tomcat/JBoss 等 Web 容器的特性,没必要用 Web 容器去加载服务。

前言

《如何自己实现一个 RPC框架》中我们介绍到一个最基本的 RPC 框架应该包括下面几部分:

  1. 注册中心 :注册中心负责服务地址的注册与查找,相当于目录服务。
  2. 网络传输 :既然我们要调用远程的方法,就要发送网络请求来传递目标类和方法的信息以及方法的参数等数据到服务提供端。
  3. 序列化和反序列化 :要在网络传输数据就要涉及到序列化
  4. 动态代理 :屏蔽程方法调用的底层细节。
  5. 负载均衡 : 避免单个服务器响应同一请求,容易造成服务器宕机、崩溃等问题。
  6. 传输协议 :这个协议是客户端(服务消费方)和服务端(服务提供方)交流的基础。

更完善的一点的 RPC 框架可能还有监控模块。

Dubbo 是比较成熟的 RPC 框架了,它当然满足我们所说的这些要求,我们看一下 Dubbo 源码的模块结构就可以看出来了。

Dubbo 核心模块介绍

dubbo-common(公共逻辑模块)

image.png

这部分主要是一些通用工具类(Util)比如Dubbo 对 SPI(org.apache.dubbo.common.extension)、时间轮算法(org.apache.dubbo.common.timer)的实现都放在这个模块下。

除了工具类之外,dubbo-common 还包括一些通用模型比如 URL(Dubbo 通过URL 传递配置信息)。

dubbo-remoting (网络传输模块)

image.png

想要调用远程方法,必然涉及到网络传输。网络传输模块很大程度决定了Dubbo的性能和稳定性,所以,这块的设计非常重要。

dubbo-remoting-api 模块是整个网络传输模块的抽象,定义了一些网络传输模块必须要实现的接口以及通用的一些实现,dubbo-remoting 模块下的其他模块都要对其进行实现。

从上图可以看出,Dubbo 的网络传输模块有多种实现方式。除了我们比较熟悉的 Netty 实现方式之外,还有Grizzly、Mina等实现方式。

Netty、Grizzly、Mina三者都是基于 Java NIO,并且Netty相比于其他两者封装和设计的要更好一些。

dubbo-registry (注册中心模块)

image.png

注册中心相当于服务提供者和消费者中间的桥梁,负责服务地址的注册与查找,相当于目录服务。

dubbo-registry-api 模块是整个注册中心传输模块的抽象,定义了一些注册中心模块必须要实现的接口以及通用的一些实现。

Dubbo 的注册中心输模块也有多种实现方式。除了我们比较熟悉的 zookeeper、nacos 实现方式之外,还有mutilcast、redis等实现方式。

一般情况下,我们都是使用zookeeper作为注册中心,这也是 Dubbo 官方推荐的一种方式。

image.png

dubbo-config(配置模块)

image.png

我们在源码环境那一节中提到: dubbo-demo 模块下,包含了 3 种不同类型(xml、api、annotation)配置方式使用 Dubbo 的demo。

dubbo-config 就是对这些配置方式的实现。

  • dubbo-config-api :API配置方式的实现(纯代码使用)。
  • dubbo-config-spring :XML和注解方式的实现。

    image.png

    dubbo-monitor (监控模块)

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

从上图可以看出,监控模块只有一个默认实现。

dubbo-rpc(远程调用模块)

image.png

dubbo-rpc 模块抽象了各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。

从“远程调用模块” 这个名字中,我们大概就能推断出 dubbo-rpc 模块依赖了网络传输模块(dubbo-remoting)。

dubbo-rpc-api 模块是整个远程调用模块的抽象,定义了一些远程调用模块必须要实现的接口以及通用的一些实现。

Dubbo 本身就提供了多种协议实现比如 dubbo协议、hession协议、gRPC协议,不过官方更推荐使用dubbo协议。并且,还给出了一份性能测试报告
image.png

dubbo-cluster(集群模块)

image.png

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