性能文章>想看Dubbo源码?一定要先看一看这一篇!>

想看Dubbo源码?一定要先看一看这一篇!原创

3315023

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

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

 

 

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

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

 

 

Dubbo是什么?从何来?

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

 

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

 

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

源码地址:https://github.com/apache/dubbo

 

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的步骤可以参考这篇文章:

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

欢迎扫码关注我呀

总结、提升

做一个快乐的攻城狮

构筑属于自己的一方天地

分类:标签:
请先登录,感受更多精彩内容
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

字符串字面量长度是有限制的
前言 偶然在一次单元测试中写了一个非常长的字符串字面量。 正文 在一次单元测试中,我写了一个很长的字符串字面量,大概10万个字符左右,编译时,编译器给出了异常告警 `java: constant
多次字符串相加一定要用StringBuilder而不用-吗?
今天在写一个读取Java class File并进行分析的Demo时,偶然发现了下面这个场景(基于oracle jdk 1.8.0_144): ``` package test; public c
如何通过反射获得方法的真实参数名(以及扩展研究)
前段时间,在做一个小的工程时,遇到了需要通过反射获得方法真实参数名的场景,在这里我遇到了一些小小的问题,后来在部门老大的指导下,我解决了这个问题。通过解决这个问题,附带着我了解到了很多新的知识,我觉得
高吞吐、低延迟 Java 应用的 GC 优化实践
本篇原文作者是 LinkedIn 的 Swapnil Ghike,这篇文章讲述了 LinkedIn 的 Feed 产品的 GC 优化过程,虽然文章写作于 April 8, 2014,但其中的很多内容和
「每日五分钟,玩转 JVM」:久识你名,初居我心
聊聊 JVMJVM,一个熟悉又陌生的名词,从认识Java的第一天起,我们就会听到这个名字,在参加工作的前一两年,面试的时候还会经常被问到JDK,JRE,JVM这三者的区别。JVM可以说和我们是老朋友了
据说99.99%的人都会答错的类加载的问题
概述首先还是把问题抛给大家,这个问题也是我厂同学在做一个性能分析产品的时候碰到的一个问题。 同一个类加载器对象是否可以加载同一个类文件多次并且得到多个Class对象而都可以被java层使用吗请仔细注意
Java多线程——并发测试
编写并发程序时候,可以采取和串行程序相同的编程方式。唯一的难点在于,并发程序存在不确定性,这种不确定性会令程序出错的地方远比串行程序多,出现的方式也没有固定规则。那么如何在测试中,尽可能的暴露出这些问
Java多线程知识小抄集(一)
本文主要整理笔者遇到的Java多线程的相关知识点,适合速记,故命名为“小抄集”。本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆。 1.interr