Dubbo源码阅读(1)搭建Dubbo源码阅读环境

本文介绍了如何搭建Dubbo源码阅读环境,包括下载源码、启动Zookeeper。通过分析官方提供的XML、注解和API三种配置方式的Demo,理解Dubbo的服务提供者和消费者工作原理,为后续深入源码阅读打下基础。
摘要由CSDN通过智能技术生成

Dubbo源码阅读(1)搭建Dubbo源码阅读环境

一直想阅读一些开源框架的源码,但是由于上学期事情太多而一直没有时间阅读。现在放寒假了,终于有足够的时间来阅读源码了,就先从Dubbo开始吧——毕竟这个寒假是有写一个自己的RPC框架的打算的,从阅读RPC框架的源码开始也是一个不错的选择。

虽然我对Dubbo实在是说不上喜欢——明明定位是一个RPC框架却有服务注册与发现、监控等服务治理的功能,在使用时有时会发现一些莫名其妙的默认行为,根据RPC Benchmark(https://github.com/hank-whu/rpc-benchmark)的测试结果Dubbo的性能也是垫底的,给人的感觉就是这个框架在云原生时代显得毫无必要的复杂(当然这也有可能是历史包袱所致,毕竟Dubbo算是一个比较老的框架了,或许和使用Java语言也有一定关系)。相比而言,我更喜欢gRPC这种只有RPC功能不关心其他任何事情的纯粹的RPC框架,可以很方便地和Kubernetes、Istio等服务治理框架进行整合而不用担心功能重合、冲突。但是,Dubbo毕竟是Java Web开发首选的RPC框架,能发展到今天的规模(听说还要出Go语言版本的Dubbo)、能成为Java Web面试的一大考点说明它还是有很多值得学习的地方的,所以我还是认为读一读它的源码对于了解RPC框架、服务治理框架的工作原理以及后续自己写一个Kotlin RPC框架有非常大的帮助。

Reference

这一系列教程主要是跟随拉勾教育的《Dubbo源码解读与实战》进行的,中间可能也会参考一些其他教程或文章。

Dubbo的架构

  • Registry:注册中心。保存服务名与服务地址的映射关系, 负责服务地址的注册与查找,服务的 Provider 和 Consumer 只在启动时与注册中心交互。注册中心通过长连接感知 Provider 的存在,在 Provider 的地址出现变动的时候,注册中心会通知 Consumer。

  • Provider:服务提供者。 提供服务的接口(API)和服务的实现。在它启动的时候,会向 Registry 进行注册(远程注册、本地注册——找到API的实现类)操作,将自己服务的地址和相关配置信息封装成 URL 添加到 ZooKeeper 中。

  • Consumer:服务消费者。 在它启动的时候,会向 Registry 进行订阅操作。订阅操作会从 ZooKeeper 中获取 Provider 注册的 URL,并在 ZooKeeper 中添加相应的监听器,再将获取到的服务地址缓存到本地。获取到 Provider URL 之后,Consumer 会根据负载均衡算法从多个 Provider 中选择一个 Provider 并与其建立连接,最后发起对 Provider 的 RPC 调用。 如果 Provider URL 发生变更,Consumer 将会通过之前订阅过程中在注册中心添加的监听器,获取到最新的 Provider URL 信息,进行相应的调整,比如断开与宕机 Provider 的连接,并与新的 Provider 建立连接。Consumer 与 Provider 建立的是长连接,且 Consumer 会缓存 Provider 信息,所以一旦连接建立,即使注册中心宕机,也不会影响已运行的 Provider 和 Consumer。

  • Monitor:监控中心。 用于统计服务的调用次数和调用时间。Provider 和 Consumer 在运行过程中,会在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。监控中心不是必要的角色,没有监控中心或者监控中心宕机不会影响RPC调用。

Dubbo源码的下载

官方仓库地址:https://github.com/apache/dubbo

命令:

git clone git@github.com:apache/dubbo.git    # 从GitHub上下载源码
git checkout -b dubbo-2.7.7 dubbo-2.7.7      # 切换到2.7.7版本。最新版本已经是2.7.8了,但是教程使用的是2.7.7,为了和教程保持一致还是用2.7.7吧
mvn clean install -Dmaven.test.skip=true     # 编译、安装源码
mvn idea:idea													       # 转换为IDEA项目

最后使用IDEA打开生成好的项目,就可以看到Dubbo的主要模块了:

其中几个核心模块的主要组成如下:

  • dubbo-common:工具类模块,提供了一些供其他模块使用的工具类。

  • dubbo-remoting:通信模块,依赖各种开源组件实现远程通信。

  • dubbo-rpc:对远程调用协议进行抽象的模块。

  • dubbo-cluster:负责管理集群的模块,提供了负载均衡、容错、路由等一系列集群相关的功能。该模块没有子模块。

  • dubbo-registry:负责与多种开源注册中心进行交互的模块,提供注册中心的能力。其中dubbo-registry-api是顶层抽象,其他模块是具体实现。

  • dubbo-monitor:监控模块,统计服务的调用次数、调用时间,进行调用链追踪。

  • dubbo-config:对外暴露Dubbo的配置。

  • dubbo-metadata:Dubbo的元数据模块。

  • dubbo-configcenter:Dubbo的动态配置模块。

阅读源码前的准备:启动Zookeeper

Dubbo官方推荐使用Zookeeper作为注册中心,所以我们需要在本地启动一个注册中心。比起下载安装,使用Docker启动当然是更优雅也更省力的方式,所以我们使用Docker来启动Zookeeper:

docker pull zookeeper
docker run -d -p 2181:2181 --name zookeeper --restart always zookeeper

然后使用docker ps命令查看,如果STATUSUP,则启动成功。

Dubbo官方Demo1:基于XML文档的配置

在看具体的Demo之前,先来看看官方Demo提供/消费的服务是什么形式。

Dubbo的服务以接口(interface)为粒度,这个接口可以被认为是服务提供者和服务消费者的公约——类似于gRPC的proto文件,它反映了与RPC调用有关的一些信息,例如:

  • 服务的名称、每个服务下有什么方法
  • 请求的名称、包含什么参数、每个参数是什么类型
  • 响应的名称、包含什么参数、每个参数是什么类型

Dubbo的官方Demo都使用了dubbo-demo-interface模块下的两个接口:

服务提供者(dubbo-demo-xml-provider)

查看dubbo-demo-xml-provider模块的pom.xml文件,可以看到有以下依赖:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-demo-interface</artifactId>
    <version>${project.parent.version}</version>
</dependency>

该模块是基于Spring的,在该模块的resources/spring目录下有一个dubbo-provider.xml,其中配置了dubbo所需要的一些信息:

<!-- 指定Zookeeper的地址为127.0.0.1:2181 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

<!-- 使用Dubbo协议 -->
<dubbo:protocol name="dubbo"/>

<!-- 把Dubbo服务配置为Spring Bean -->
<bean id="demoService" class="org.apache.dubbo.demo.prov
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值