写在前面

上周,在【Dubbo系列专题】中更新了两篇文章《冰河开始对Dubbo下手了!》和《俯瞰Dubbo全局,阅读源码前必须掌握这些!!》,收到了很多小伙伴的微信私聊消息,大部分都是在询问如何快速的掌握Dubbo的原理和源码。针对这个问题,我也在思考如何以更简单、易懂的方式让小伙伴们更好的掌握Dubbo的原理和源码。今天,我就为小伙伴们分享下我是如何快速掌握Dubbo的原理和源码的。

文章已收录到:

https://github.com/sunshinelyz/technology-binghe

https://gitee.com/binghe001/technology-binghe

阅读源码的前提

阅读某一项技术框架,或者说开源项目的源码前,你必须了解这个框架是干啥用的,说白了,就是你至少了解这个框架该怎么用,在什么场景下用,使用的过程中会遇到哪些坑,如何解决。而学习一个框架,最简单有效的方式就是它的官方文档。Dubbo也不例外,我在学习Dubbo的时候,也是首先看的Dubbo的官方文档,基本没看其他的文章或者资料。为啥?因为Dubbo的官方文档是最权威的,是最可信的。

即使你在项目中没有使用过Dubbo框架,你也可以按照Dubbo的官方文档基于Dubbo写一个简单的示例程序,通过示例能够让自己快速的了解Dubbo。

为何要阅读源码

阅读源码前,你要清楚的知道自己为何要阅读源码,带着问题去看源码。 想要看框架的源码,无外乎两种情况:一种就是在项目中遇到了无法通过文档或者其他技术资料解决的问题,想通过源码来找解决方案;另一种就是对框架的底层实现好奇,这么牛逼的技术是如何实现的? 而我,基本属于后者。在我经历的用户上亿的高并发电商系统中,部分核心子系统使用了Dubbo,经过性能调优,Dubbo的表现良好。我就很好奇:Dubbo是如何抗住这么高的并发的?它内部是如何实现的?

其次,阅读源码前,你要为自己提几个问题,比如我在看Dubbo源码前,就明确了很多问题,比如:Dubbo是如何实现RPC服务的?服务提供者和调用者之间是如何交互的?Dubbo是如何封装网络调用使其看起来和调用本地方法一样?Dubbo又是如何实现服务治理的?等等一系列的问题,我记得我当时看源码前,足足给自己提了上百个问题。带着问题看源码,能够让你事半功倍,不仅仅是Dubbo,对于其他的框架,也是如此。

还有就是,不要为了看源码而看源码,很多小伙伴看了不少框架的源码,可没过多久就忘记了,跟没看一样,还浪费了很多时间。这种就是典型的为了看源码而看源码,并没有去深究这个框架的实现原理和细节,遇到看不懂的,可以先跳过,记录下,等把相关联的代码看懂后,再反过头来重新梳理没有看懂的源码。

框架使用了哪些技术

阅读源码前,还有一项重要的工作就是,要了解框架中使用了哪些技术。对所用的技术要有个大体的了解。比如:在Dubbo中使用了SPI、时间轮定时任务、服务注册与发现、Netty、序列化、自定义协议等等技术。所以,在阅读源码前,先要对这些技术有个大体的了解。

比如,在看Dubbo源码前,我就已经了解到Dubbo的网路交互底层使用的Netty,正好在我工作不久的时候,我又深入研究过Netty的源码,这就有助于我在看Dubbo源码时,能够更好的理解Dubbo的网络编程部分。

所以说,台上一分钟,台下十年功,在看Dubbo源码前,我也是做了充分的准备。

阅读源码时注意什么

任何一项技术框架,或者说开源项目,肯定是为了解决某些场景而生的,就比如Dubbo,相信小伙伴们都知道,Dubbo作为一个分布式服务治理框架,一个典型的使用场景就是分布式系统。

其次,一个优秀的技术框架或开源项目背后肯定蕴含着众多其他技术的原理与实现。我们同样是以Dubbo为例,在Dubbo中,为了实现在分布式场景下,调用远程RPC服务就像调用本地服务一样,其至少需要实现如下功能:

  • 服务之间功性能的通信。
  • 服务调用需要做到负载均衡、高可用、限流。
  • 服务治理。
  • 高可靠、容错。
  • 服务能够自动注册和发现。

而实现这些功能时,Dubbo借助了哪些优秀的开源框架?这些开源框架Dubbo是如何集成起来的?是硬编码方式集成?还是其他更好的方式?这些都是需要我们在阅读源码的时候,去源码中找到答案。

阅读源码的方式

我把阅读源码的方式总结为:先整体再局部,先宏观再微观,先粗略再细节。

什么意思呢?就是在看源码的是时候,先从整体上把握源码的设计原理和设计理念,先整体上大概了解源码是如何实现的。比如在Dubbo中,网络编程是基于Netty实现的,你就可以先做个了解,知道这么回事。从整体上把握基本的框架源码后,再从细节中死磕具体的实现,比如,在Dubbo中是如何使用Netty实现网络交互的?

记住,阅读源码时切忌在还没有搞懂整体的设计原理和整体源码设计前,就开始死扣源码的细节。否则,你会在源码里面迷失自己。

如何验证自己掌握了源码?

阅读源码光看源码还不行,还要自己去动手实践,正所谓“实践是掌握整理的唯一标准”。你不实践,怎么知道自己是不是掌握了。

我把实践部分分为两个组成部分:在看源码的过程中动手实践;在看源码后动手实践。

在看源码的过程中动手实践就是说:在看源码的过程中,将自己不明白的地方记录下来,查阅官网文档或者其他资料,如果是由于自己的技术能力有欠缺,看不懂的,就要及时为自己充电来补充相关的知识点了。如果是遇到自己认为比较好的实现方式时,可以在框架的代码上以注释的方式标记自己的理解。比如,我在看Dubbo源码的时候,就标注了大量的注释。

在看源码后,一定要动手实操。看过Dubbo的整体源码后,如果你认为自己掌握了Dubbo,就不妨自己动手实现一个RPC框架,看看自己实现的框架与Dubbo框架有哪些区别,为啥Dubbo框架是这样实现的。再反过头来带着问题看Dubbo的源码,你肯定会理解的更加深入。而我,在看完Dubbo框架的源码后,也是这样做的。

阅读源码的总结

最后,跟小伙伴们透露下:我从开始看Dubbo源码,到掌握Dubbo的原理和源码,前前后后只用了不到两个月。记住,阅读源码前,一定要明确为何读源码,带着问题读源码,对于源码中所涉及的其他技术或框架,一定要有所了解。阅读源码的过程中,要遵循:先整体再局部,先宏观再微观,先粗略再细节的原则。最重要的一点是:在阅读源码的过程中和阅读源码后都要动手实践。

好了,今天就到这儿吧,我是冰河,大家有啥问题可以在下方留言,也可以加我微信,一起交流技术,一起进阶,一起牛逼~~

我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?的更多相关文章

  1. Dubbo原理和源码解析之服务暴露

    github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...

  2. Dubbo原理和源码解析之服务引用

    一.框架设计 在官方<Dubbo 开发指南>框架设计部分,给出了引用服务时序图: 另外,在官方<Dubbo 用户指南>集群容错部分,给出了服务引用的各功能组件关系图: 本文将根 ...

  3. Dubbo原理和源码解析之标签解析

    一.Dubbo 配置方式 Dubbo 支持多种配置方式: XML 配置:基于 Spring 的 Schema 和 XML 扩展机制实现 属性配置:加载 classpath 根目录下的 dubbo.pr ...

  4. Dubbo原理和源码解析之“微内核+插件”机制

    github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...

  5. 【开源】开发者新闻聚合APP 1.0.3发布(第一个稳定版本,短期内不再发布新版本)

    聚合了博客园新闻.infoq新闻.36kr新闻.oschina新闻.51cto新闻.csdn新闻: 争取做到随时刷随时有开发者的新闻! 目前还只支持安卓APP 最新版本的下载地址:https://gi ...

  6. (转)10 分钟内快速构建能够承载海量数据的 nginx 日志分析与报警平台

    10 分钟内快速构建能够承载海量数据的 nginx 日志分析与报警平台 原文:https://blog.qiniu.com/archives/8713

  7. 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...

  8. Deno会在短期内取代Node吗?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/what-is-deno-and-will-it-r ...

  9. # 8 快速入门 dubbo

    8 快速入门 dubbo 所需资料 注册中心 Zookeeper 安装 zookeeper 官方推荐使用 zookeeper 注册中心: 注册中心负责服务地址的注册与查找,相当于目录服务: 服务提供者 ...

随机推荐

  1. 【软件测试部署基础】npm的认识

    1. npm简介 先来看下官方介绍: npm makes it easy for JavaScript developers to share and reuse code, and it makes ...

  2. Scrum 冲刺 第七篇

    Scrum 冲刺 第七篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 初步完成app首页模块的搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成部分个人界面接口 钟俊豪 完成部 ...

  3. 基于jaccard相似度的LSH

    使用Python通过LSH建立推荐引擎 LSH:一个可以用来处理成百上千行的算法 前提: Python 基础 Pandas 学完本教程之后,解锁成就: 通过建立shingles 为LSH准备训练集和测 ...

  4. CF1000F One Occurrence

    本题解用于记录一下一个优秀的东西--懒标记. 题解 可以很轻易的想到莫队的做法,但是题目让你输出的是满足条件的一个数,而不是满足条件的数的个数,似乎很难去 \(O(1)\) 转移.这个时候我们的懒标记 ...

  5. 【ubuntu-18.04】ubuntu18.04进行Nvidia显卡配置

    转自https://blog.csdn.net/qq_37935670/article/details/80377196 2.显卡驱动配置 网上有些攻略非常非常复杂,又要禁用nouveau驱动,又要进 ...

  6. 小兔子有颗玻璃心A版【转】

    作者:诸君平身链接:https://www.zhihu.com/question/49179166/answer/116926446来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  7. Flink批处理读写Hive

    import org.apache.flink.table.api.*; import org.apache.flink.table.catalog.hive.HiveCatalog; /** * @ ...

  8. Unity射击实例讲解—子弹创建

    前言: 这一篇章会介绍如何创建最基本的射击用子弹,示例用工程进度也往后推了许多,有时间会都整理了发出来,学艺尚浅有一些东西不能讲明白,后续学习深入会慢慢补足.另外自己魔改过的版本也是花钱买了一些模型, ...

  9. CVE-2019-0708——RDP漏洞利用

    影响系统:windows2003.windows2008.windows2008 R2.windows xp .win7环境:攻击机:kali ip:192.168.40.128靶机:windows ...

  10. PHP 直接使用html输出excel

    1 <?php 2 header("Cache-Control:public"); 3 header("Pragma:public"); 4 5 head ...