我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?
写在前面
上周,在【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的原理和源码的(纯干货)?的更多相关文章
- Dubbo原理和源码解析之服务暴露
github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...
- Dubbo原理和源码解析之服务引用
一.框架设计 在官方<Dubbo 开发指南>框架设计部分,给出了引用服务时序图: 另外,在官方<Dubbo 用户指南>集群容错部分,给出了服务引用的各功能组件关系图: 本文将根 ...
- Dubbo原理和源码解析之标签解析
一.Dubbo 配置方式 Dubbo 支持多种配置方式: XML 配置:基于 Spring 的 Schema 和 XML 扩展机制实现 属性配置:加载 classpath 根目录下的 dubbo.pr ...
- Dubbo原理和源码解析之“微内核+插件”机制
github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...
- 【开源】开发者新闻聚合APP 1.0.3发布(第一个稳定版本,短期内不再发布新版本)
聚合了博客园新闻.infoq新闻.36kr新闻.oschina新闻.51cto新闻.csdn新闻: 争取做到随时刷随时有开发者的新闻! 目前还只支持安卓APP 最新版本的下载地址:https://gi ...
- (转)10 分钟内快速构建能够承载海量数据的 nginx 日志分析与报警平台
10 分钟内快速构建能够承载海量数据的 nginx 日志分析与报警平台 原文:https://blog.qiniu.com/archives/8713
- 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群
本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...
- Deno会在短期内取代Node吗?
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/what-is-deno-and-will-it-r ...
- # 8 快速入门 dubbo
8 快速入门 dubbo 所需资料 注册中心 Zookeeper 安装 zookeeper 官方推荐使用 zookeeper 注册中心: 注册中心负责服务地址的注册与查找,相当于目录服务: 服务提供者 ...
随机推荐
- java后端开发学习路线
思维导图(欢迎克隆):https://www.processon.com/mindmap/5f563cd31e08531762c4e32b 主要包括:编程基础.研发工具.应用框架.运维知识(主要学会配 ...
- Hangfire&Autofac与ASP.NET CORE注入失败
Hangfire.Autofac与ASP.NET CORE注入失败 项目里面使用了Hangfire,因为之前没用过吧,遇到了个问题,就是使用了ico容器后,再用Hangfire总是注入不上对象,总是后 ...
- MySQL入门看这一篇就够了
MySQL JavaEE:企业级Java开发 web阶段 分为1.前端(页面,展示数据库中的数据) 2.后台(连接点:链接数据库JDBC.Mybatis,链接前端(控制视图跳转,给前端传递数据)) 3 ...
- 20201205-3 HTML环境搭建与文件基本结构
HTML环境搭建与文件基本结构 HTML的基础 HTML环境搭建 Pycharm 包含全部环境 编写(代码) → 运行浏览器 → 代码检查 Sublime 只是用来编写 HTML 代码: ...
- postgresql修改postgres用户密码
[postgres@pg01 ~]$ psql -Upostgres -dpostgres postgres=# alter user postgres with password 'postgres ...
- JavaSE21-网络编程
1.网络编程入门 1.1 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共 ...
- ambari 修改kafka日志目录后,写入数据无法消费
## 起因:ambari 修改kafka日志目录后,写入数据无法消费 - 使用下面的客户端消费命令可以消费到数据 ./kafka-console-consumer.sh --zookeeper 192 ...
- react第十八单元(redux中间件redux-thunk,redux工程目录的样板代码,规范目录结构)
第十八单元(redux中间件redux-thunk,redux工程目录的样板代码,规范目录结构) #课程目标 中间件:中间件增强redux的可扩展性,实现功能复用的目的. redux-thunk异步逻 ...
- 保姆级教程,带你认识大数据,从0到1搭建 Hadoop 集群
大数据简介,概念部分 概念部分,建议之前没有任何大数据相关知识的朋友阅读 大数据概论 什么是大数据 大数据(Big Data)是指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需 ...
- 关于AES-CBC模式字节翻转攻击(python3)
# coding:utf-8 from Crypto.Cipher import AES import base64 def encrypt(iv, plaintext): if len(plaint ...