索隆带你手撕Dubbo源码,源码阅读其实并不难

Posted 打工人索隆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索隆带你手撕Dubbo源码,源码阅读其实并不难相关的知识,希望对你有一定的参考价值。


索隆带你手撕Dubbo源码,源码阅读其实并不难
索隆带你手撕Dubbo源码,源码阅读其实并不难




上篇文章索隆给大家介绍了源码阅读的6个实用技巧,相信大家应该有所收获,但不太清楚具体怎么用。今天的文章索隆以Dubbo为例,通过实战来带大家掌握源码阅读的这几个技巧。读完这篇文章,相信大家都能学会自己阅读源码,为后面给知名项目提交PR打好基础。

索隆带你手撕Dubbo源码,源码阅读其实并不难



01、开始之前,先准备好资料

开始之前,我们要做好以下准备:
1. 下载Dubbo最新源码,注意要下载最新版本的代码,两年Dubbo版本迭代的非常快,不同版本之间的代码差别比较大。可以从Github官网下载https://github.com/laddcn/dubbo
2. 下载Nacos,和Zookeeper相比,使用Nacos作为注册中心,有线程的管理平台可以查看服务状态,更加方便。可以通过源码进行编译,也可以从直接下载可执行jar文件,具体可参见官网介绍 https://arthas.aliyun.com/doc/download.html
3. 下载Arthas,上文说过,Arthas是个在线调试神器,我们在阅读源码中也会经常用到。下载方式同样参见官网 https://arthas.aliyun.com/doc/download.html

当然,由于Github在国内龟速的下载效率,本文所需的资料,索隆都帮大家准备好了,关注“打工人索隆”,回复“666”获取全部文件。


02、先把项目跑起来

阅读源码的第一步就是先学会用,先把项目跑起来。我们已经拿到了Dubbo的最新源码,这是一个Maven项目,把项目导入Idea。运行下面的指令进行编译

mvn clean install -Dmaven.test.skip=true

编译完成后,项目代码就会正常显示,像下面这种样子。dubbo-demo子项目就是我们要执行的。

索隆带你手撕Dubbo源码,源码阅读其实并不难

Dubbo执行需要有注册中心,为了方便,推荐使用Nacos。所以,我们要先把Nacos启动起来,在Nacos的bin目录执行下面命令

sh startup.sh -m standalone

启动成功后,打开http://localhost:8848/nacos/可以进行登录,看到下面的界面说明启动成功了,用户名和密码都是nacos,

索隆带你手撕Dubbo源码,源码阅读其实并不难

由于dubbo-demo中默认的注册中心是zookeeper,我们需要修改下配置,首先修改provider的配置文件

索隆带你手撕Dubbo源码,源码阅读其实并不难

复制下面的内容修改3处配置,之所以需要修改三处,是因为Dubbo2.7将注册中心、配置中心和元数据中心进行了分离,主要是解决这些数据放在一起,注册中心压力过大的问题。具体后面的文章会详细讲解。

    <dubbo:config-center address="nacos://127.0.0.1:8848"/>
    <dubbo:metadata-report address="nacos://127.0.0.1:8848"/>
    <dubbo:registry id="registry1" address="nacos://127.0.0.1:8848"/>

Consumer端的配置也需要修改,只要改下面一处即可

索隆带你手撕Dubbo源码,源码阅读其实并不难

修改下面代码,将注册中心改为nacos

    <dubbo:registry address="nacos://127.0.0.1:8848"/>

接下来我们启动Provider端服务

索隆带你手撕Dubbo源码,源码阅读其实并不难

稍等片刻,等服务启动好,去Nacos查看服务列表,服务列表中出现providers:org.apache.dubbo.demo.DemoService::和providers:org.apache.dubbo.demo.GreetingService:1.0.0:greeting这两个服务说明服务已经注册好了。



索隆带你手撕Dubbo源码,源码阅读其实并不难

然后去启动Consumer端服务

索隆带你手撕Dubbo源码,源码阅读其实并不难

看到console打出下面的日志,说明consumer端已经能够正常调用provider端注册的服务了,恭喜你,不出几分钟已经把Dubbo服务跑起来了。

Greetings! from separated thread.
Greetings! from separated thread.
Greetings! from separated thread.
Greetings! from separated thread.
result: async result
result: Greetings!
Greetings! from separated thread.
Greetings! from separated thread.
Greetings! from separated thread.



03、通过Debug工具和Arthas高效阅读源码

通过上一章我们已经把Dubbo项目跑起来了,是不是很有成就感。

接下来,我们进行源码阅读。听说Dubbo源码很难懂?不要怕,索隆带你手撕Dubbo源码。我们以Consumer端调用过程为例阅读源码。上文我们说过阅读源码一定要让程序跑起来,配合Debug工具,阅读效率能提升好几倍。具体的,为了方便,我们针对一次同步调用进行调试,在Consumer端的Application类第53行打上断点进行调试

索隆带你手撕Dubbo源码,源码阅读其实并不难


具体调试方法不再赘述,这里需要注意的一点是,Dubbo中有些类是动态生成的,利用Idea调试看不到这些源码,会影响对逻辑的理解。比如我们调试的第一步,就发现greetingService的具体实现类名为org.apache.dubbo.common.bytecode.proxy0,通过Idea找不到这个类的源码。这也太奇怪了,好多同学源码阅读也就到此为止了。这时候,我们要搬出来神器Arthas来解决问题了。启动Arthas,连接到Consumer端的Application程序。

索隆带你手撕Dubbo源码,源码阅读其实并不难

    通过Arthas的jad命令就能看到org.apache.dubbo.common.bytecode.proxy0的源码了。大家在阅读源码的过程中需要注意这些名字比较奇怪的类,比如bytecode包下面,类名以数字结尾的一般都是动态生成的类。对于这些类,在阅读代码的时候,都可以通过Arthas查看具体源码。


jad --source-only org.apache.dubbo.common.bytecode.proxy0


索隆带你手撕Dubbo源码,源码阅读其实并不难



04、通过脑图及时保存源码阅读的胜利果实

通过Debug工具和Artha可以很方便的阅读源码,但是看完很容易忘,并且项目过于庞大,前后代码容易关联不起来。这时候一定要借助脑图把阅读的成果保存下来,边看边画脑图。一开始可以把主要的代码脉络画出来,后面再次阅读的时候不断补充。读上几遍,脑图就很清晰了,再回顾一遍,代码逻辑一目了然。通过脑图,一方面可以更加快速的熟悉代码,另外一方面,后面解Bug的时候查找问题非常方便。今天的代码阅读中,索隆就画了如下的脑图,把代码的详细逻辑都记录了下来。详细的脑图可以关注“打工人索隆”回复“666”获取。

索隆带你手撕Dubbo源码,源码阅读其实并不难





今天的文章就到这里,感觉有帮助的话帮着点个“在看”支持下索隆,这个对索隆非常重要。文章中的源码和其他资料可以回复“666”获取。

下一篇文章会带大家手撕Dubbo一个比较严重的Bug。



同时,为了方便大家更快的上手和交流,索隆创建了一个开源项目讨论群,索隆会带大家一起刷开源项目,目前已经有30多位同学加入,感兴趣的同学可以扫下面的二维码。看了本文,源码阅读还是有些疑问,也可以加索隆微信进行讨论。

索隆带你手撕Dubbo源码,源码阅读其实并不难



扫码加索隆微信加入

“开源大航海讨论群”

打工人索隆

索隆带你手撕Dubbo源码,源码阅读其实并不难


点个在看你最好看



以上是关于索隆带你手撕Dubbo源码,源码阅读其实并不难的主要内容,如果未能解决你的问题,请参考以下文章

硬核来袭 | 2 万字 + 10 图带你手撕 STL 关联式容器源码

字节大牛教你手撕Android学习,原理+实战+视频+源码

5 千字长文+ 30 张图解 | 陪你手撕 STL 空间配置器源码

风哥带你手撕算法之吃透二叉树(初版)

十道题带你手撕二叉树

来,带你手撕一个AOP