一、下载源码

1 网址

  1. https://github.com/apache/dubbo

image.png

2 克隆

  1. git clone https://github.com/apache/dubbo.git

3 编译

  1. mvn clean install -DskipTests

4 导入

  1. mvn idea:idea // 要是执行报错,就执行这个 mvn idea:workspace

image.png

二、项目说明

1. 整体架构图

image.png

2 Registry:注册中心。

1 负责服务地址的注册与查找,服务的 Provider 和 Consumer 只在启动时与注册中心交互。

2 注册中心通过长连接感知 Provider 的存在,在 Provider 出现宕机的时候,注册中心会立即推送相关事件通知 Consumer。

3 Provider:服务提供者。

在它启动的时候,会向 Registry 进行注册操作,将自己服务的地址和相关配置信息封装成 URL 添加到 ZooKeeper 中。

4 Consumer:服务消费者。

1 在它启动的时候,会向 Registry 进行订阅操作。订阅操作会从 ZooKeeper 中获取 Provider 注册的 URL,并在 ZooKeeper 中添加相应的监听器。

3 获取到 Provider URL 之后,Consumer 会根据负载均衡算法从多个 Provider 中选择一个 Provider 并与其建立连接,最后发起对 Provider 的 RPC 调用。

3 如果 Provider URL 发生变更,Consumer 将会通过之前订阅过程中在注册中心添加的监听器,获取到最新的 Provider URL 信息,进行相应的调整,比如断开与宕机 Provider 的连接,并与新的 Provider 建立连接。

4 Consumer 与 Provider 建立的是长连接,且 Consumer 会缓存 Provider 信息,所以一旦连接建立,即使注册中心宕机,也不会影响已运行的 Provider 和 Consumer。

5 Monitor:监控中心。

1 用于统计服务的调用次数和调用时间。

2 Provider 和 Consumer 在运行过程中,会在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

3 监控中心在上面的架构图中并不是必要角色,监控中心宕机不会影响 Provider、Consumer 以及 Registry 的功能,只会丢失监控数据而已。

三、项目包说明

image.png

1 dubbo-common 模块:

Dubbo 的一个公共模块,其中有很多工具类以及公共逻辑 (Dubbo SPI 实现、时间轮实现、动态编译器等)。

image.png

2 dubbo-remoting 模块:

1 Dubbo 的远程通信模块,其中的子模块依赖各种开源组件实现远程通信。

2 在 dubbo-remoting-api 子模块中定义该模块的抽象概念,在其他子模块中依赖其他开源组件进行实现,例如,dubbo-remoting-netty4 子模块依赖 Netty 4 实现远程通信,dubbo-remoting-zookeeper 通过 Apache Curator 实现与 ZooKeeper 集群的交互。

image.png

3 dubbo-rpc 模块:

1 Dubbo 中对远程调用协议进行抽象的模块,其中抽象了各种协议,依赖于 dubbo-remoting 模块的远程调用功能。

2 dubbo-rpc-api 子模块是核心抽象,其他子模块是针对具体协议的实现,例如,dubbo-rpc-dubbo 子模块是对 Dubbo 协议的实现,依赖了 dubbo-remoting-netty4 等 dubbo-remoting 子模块。 dubbo-rpc 模块的实现中只包含一对一的调用,不关心集群的相关内容。

image.png
rpc-dubbo
image.png

4 dubbo-cluster 模块:

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

2 最终的目的是将多个 Provider 伪装为一个 Provider,这样 Consumer 就可以像调用一个 Provider 那样调用 Provider 集群了。
image.png

5 dubbo-registry 模块:

1 Dubbo 中负责与多种开源注册中心进行交互的模块,提供注册中心的能力。
2 dubbo-registry-api 子模块是顶层抽象,其他子模块是针对具体开源注册中心组件的具体实现,例如,dubbo-registry-zookeeper 子模块是 Dubbo 接入 ZooKeeper 的具体实现。
image.png

6 dubbo-monitor 模块:

Dubbo 的监控模块,主要用于统计服务调用次数、调用时间以及实现调用链跟踪的服务。
image.png

7 dubbo-config 模块:

Dubbo 对外暴露的配置都是由该模块进行解析的。例如,dubbo-config-api 子模块负责处理 API 方式使用时的相关配置,dubbo-config-spring 子模块负责处理与 Spring 集成使用时的相关配置方式。有了 dubbo-config 模块,用户只需要了解 Dubbo 配置的规则即可,无须了解 Dubbo 内部的细节。
image.png

8 dubbo-metadata 模块:

dubbo-metadata 模块的实现套路也是有一个 api 子模块进行抽象,然后其他子模块进行具体实现。
image.png

9 dubbo-configcenter 模块:

Dubbo 的动态配置模块,主要负责外部化配置以及服务治理规则的存储与通知,提供了多个子模块用来接入多种开源的服务发现组件。
image.png