想看Dubbo源码?建议先看看这一篇

4,204 阅读8分钟

 本文首发于公众号【看点代码再上班】,建议关注公众号,及时阅读最新文章。

一定要看的原文地址:mp.weixin.qq.com/s?__biz=M……

大家好,我是tin,这是我的第16篇原创文章

tin开始分享 Dubbo 源码啦!
(本文源码基于2.7,Dubbo3 暂时不考虑)

真正开始深入阅读Dubbo的原理和核心源码前,今天先讲讲Dubbo的一些基本理解以及Dubbo如何运行使用。话不多说,上目录:

Dubbo是什么?从何来?

Dubbo是阿里巴巴开源的一个高性能RPC服务框架,主要用于支持应用服务间高性能的远程通信,简单来说,就是两个服务之间互相传输数据。

我们最熟悉的浏览器访问一个网址获取数据,它最终对应到后端具体的某一个服务A,但是服务A有可能需要向服务B获取数据,这时,A与B之间的数据通信就可以使用Dubbo框架了。

Dubbo的官网地址:dubbo.apache.org/zh/

源码地址:github.com/apache/dubb…

Dubbo发展历程有些坎坷,中间还被"遗弃"过,差点夭折。

2011 年 10 月 27 日,阿里巴巴开源服务化治理方案框架 Dubbo。那时候正是国内面向服务治理的设计理念落地实施起始阶段。

2012 年 10 月 23 日,阿里巴巴发布Dubbo 2.5.3版本,在 Dubbo开源刚满一周年,阿里宣布停止对Dubbo 的主要升级,至此,Dubbo基本处于"遗弃"阶段

2013 年、2014 年,阿里对 Dubbo2.4 有过两次更新升级,然后停止了所有维护工作。

阿里停止维护Dubbo 期间,当当网开始维护自己的 Dubbo 分支版本 Dubbox。在2017年之前,很多互联网公司也基本都是使用的Dubbox(比如我们公司)。

2017 年 9 月 7 日,阿里重新恢复对Dubbo的维护,并悄无声息地发布了 2.5.4 版本,此版本和上一版本2.5.3 已相差了将近5年时间。在2017年剩下的4个月,阿里相继发布Dubbo 2.5.5、2.5.6、2.5.7、2.5.8版本。

2018 年 1 月 8 日发布 Dubbo 2.6.0 版本,新版本把当当网开源的 Dubbox 进行了合并,至此,Dubbo重新完成了大一统。

2018 年 2 月 15 日,阿里将 Dubbo 贡献给 Apache软件基金会,就有了现在的Apache Dubbo。

2019 年 5月 20 日,Apache软件基金会宣布Dubbo正式毕业,成为 Apache的顶级项目。  

2021 年 6 月 13 日,云原生背景下的Dubbo3正式发布,现在,Dubbo3的最新版本是3.0.5。

Dubbo 的四大角色

​ 结合上图先说下Dubbo的基本工作流程,主要分为四步:

  • ① Provider 向注册中心注册服务信息;
  • ② Consumer 从注册中心订阅提供者服务;
  • ③ Consumer 通过服务URL调用 Provider;
  • ④ Consumer 和 Provider 异步上报统计信息给监控中心。

工作流程所涉及的四大模块分别是:

  • 注册中心Registry
  • 服务提供者Provider
  • 服务消费者Consumer
  • 监控中心Monitor

每个模块代表一种角色,都可独立存在,它们之间形成相互依赖的关系。

注册中心Registry

作为服务发现的一个核心组件,主要职责就是对服务地址等信息的注册保存以及快速查找,是其他各个模块连接的中间枢纽。注册中心有几个特征:

  • (1)动态加入:一个服务提供者Provider新加入到系统,注册中心可以动态感知,并把Provider信息通知给所有服务消费者Consumer。
  • (2)动态发现:类似动态加入的特征,服务消费者Consumer无需任何操作即可动态感知服务配置的变化,所以,Consumer只需在启动时从注册中心拉取一次Provider信息并缓存到本地,当Provider发生变化时由注册中心通知Consumer做出相应更改。
  • (3)统一配置:因为是一个注册中心的原因,可以统一管理配置,避免每个服务配置不一致的问题。

Dubbo支持的注册中心有多种,从源码包dubbo-registry结构就可以看出: ​ 但我们一般用较多的是zookeeper,Dubbo官方推荐使用的也是zookeeper。

服务提供者Provider

Provider在启动时向注册中心注册自己的相关服务,之后通过长链接方式保持和注册中心通信,如果Provider有下线等变更,注册中心实时感知,然后再通知到Consumer。

如果使用zookeeper作为注册中心,Provider信息保存在zookeeper节点中,形式如:/dubbo/com.xxx.xxx.DemoService/providers。节点示例如图下: ​ 在Providers目录下就是服务提供者的URL信息。

服务消费者者Consumer

Consumer同样是在启动时向注册中心订阅服务提供者的信息,并把相关信息缓存一份到本地内存和本地磁盘,后续再由注册中心和Consumer之间的通知机制通知Consumer相关信息变更(比如zookeeper,Consumer只需在对应的节点上添加监听器监听Provider的变更即可)。

Consumer的缓存机制是一种用空间换取时间的做法,避免了Consumer每次远程调用都要去注册中心拉取服务列表而大大降低系统性能的问题。同时,如果中途注册中心系统宕机不可用,也不会影响Consumer调用Provider继续运行。

监控中心Monitor

顾名思义,Monitor只做监控使用,比如当Consumer发起调用时,会异步将调用、统计信息等上报给监控中心。监控中心采集展示的信息包括但不限于服务列表、服务配置、服务调用次数等。

Dubbo源码下载

上文已给出Dubbo的源码地址,接下来,我们先把Dubbo源码下载到本地。

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

从Dubbo的github地址可以查到现在Dubbo2.7的最新版本是2.7.15 ​ 我们把Dubbo源码切到2.7.15

git checkout -b dubbo-2.7.15 dubbo-2.7.15

最终Dubbo的源码结构就如下图所示啦: ​ Dubbo源码模块拆分非常多,但从命名上基本可以看出每个模块的作用。

比如dubbo-registry,是注册中心实现的源码

​ dubbo-remoting是Dubbo网络通信的核心实现,其底层使用到了netty进行开发 ​ dubbo-rpc是Dubbo的远程调用模块,抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理 ​ dubbo-cmmon是Dubbo的公共逻辑模块,包括 Util 类和通用模型 ​ dubbo-cluster是Dubbo的集群模块。将多个服务提供方伪装为一个提供方,包括:负载均衡, 容错,路由等,集群的地址列表可以是静态配置的,也可以是由注册中心下发 ​ dubbo-monitor就是Dubbo的监控模块。统计服务调用次数、调用时间、调用链跟踪等。

编写运行 Dubbo 服务

Dubbo源码包已经包含有相应的demo,这些demo都是直接可运行,打开源码包,找到dubbo-demo模块: ​ 以上都是dubbo程序示例,几个模块分别代表:

  • dubbo-demo-annotation:基于注解的demo示例
  • dubbo-demo-api:基于api的demo示例
  • dubbo-demo-interface:定义demo的接口
  • dubbo-demo-xml:基于xml配置的demo示例

下面用xml配置方式(dubbo-demo-xml包)跑一个dubbo示例看一看。

第一步,启动Provider

找到dubbo-demo-xml-provider,然后找到dubbo-provider.xml文件,这里已经配置好了服务提供者的配置信息: ​ 很明显,demo使用的注册中心就是zookeeper,如果要把这个服务跑起来,还需要在本地启动一个zookeeper。因为我使用的是macos m1电脑,安装使用zk的步骤可以参考这篇文章:

zhuanlan.zhihu.com/p/466902641

DemoService接口定义在dubbo-demo-interface模块:

​ 接口实现类DemoServiceImpl在dubbo-demo-xml-provider ​ 找到dubbo-demo-xml-provider下的Application类,运行main方法: ​ 当provider启动成功后,我们在zookeeper上可以看到对应的节点信息(默认在/dubbo目录下):

ls /dubbo/org.apache.dubbo.demo.DemoService/providers

从第二张图我们可以看到服务提供者的URL信息。

第二步,启动Consumer

找到dubbo-demo-xml-consumer,然后找到dubbo-consumer.xml文件,这里已经配置好了服务消费者的配置信息:

​ 同样再找到dubbo-demo-xml-consumer的main方法入口,点击运行启动:

​ 启动成功后,在zookeeper上同样能找到对应的消费者信息:

ls /dubbo/org.apache.dubbo.demo.DemoService/consumers

​ 在Provider的控制台也能看到打印的一行日志,表示和consumer建立连接: ​ Consumer的控制台则一直输出,调用Provider的结果信息: ​ 至此,Dubbo服务就算跑成功了!

结语

我是tin,一个在努力让自己变得更优秀的普通工程师。自己阅历有限、学识浅薄,如有发现文章不妥之处,非常欢迎加我提出,我一定细心推敲并加以修改。

欢迎关注我

附上原文地址:[mp.weixin.qq.com/s?__biz=M……]

总结、提升

做一个快乐的攻城狮

构筑属于自己的一方天地