dubbo源码解析-spi(五)

之前对dubboSPI 进行了四篇的分享.大家对这个概念有了一些初步的了解.谈到编程水平如何进阶,大家可能都会异口同声的说出三个字, 源码 .但是我却始终认为,编程光 ,是永远学不会的.关键还是要多动手,但是很多时候,连怎么看源码都无从下手,你叫我写仿写源码,这不是开玩笑?

dubbo源码解析-spi(五)

我们可以回忆一下我们在公司是怎么写代码的.首先产品提出需求,接着开需求评审会,再接着代码设计,最后开始编码.

今天我们就仿造这个流程,自己动手实现dubbo的 spi

提出需求

在 dubbo源码解析-spi(二) 中,我们已经分析了dubbo中spi和jdk中spi有什么区别,dubbo相比jdk变化的内容大致如下:

(一) 拓展点增加了缓存,提高了性能 (二) 增加了 spi 的默认值 (三) 增加了通过 key 的形式获取拓展点 (四) 增加了 IocAOP 功能

这里插句题外话,我们不能为了看源码而看源码,最重要的是,在看源码的过程中,学会分析问题的思路.假如有个新的RPC框架,比如肥朝RPC,我问你肥朝RPC中的SPI和JDK的SPI有几点区别呢?我在 dubbo源码解析-spi(二) 这篇中,就把我是如何分析出这四点的整个心路历程展示出来,你可以大胆走进我的内心世界.

需求评审

既然是需求评审,其实说白了,就是和产品砍需求.产品提出的需求就是上面那四个功能.(一)(二)(三)都是基本又比较核心的功能,这些砍了那这个版本就没意思了,(四)这个可以放在下一个版本去迭代开发.

代码设计

只要实现了 key-value 获取拓展点,那么获取默认拓展点就很容易了,因为这个默认拓展点只是 key-value 的一种特殊形式,他的默认值,也就是这个 key ,就在 SPI 注解上.其实思路总起起来就一句话,因为我们在拓展点配置文件里面已经配置了实现类的权限定名.首先我们把这些配置文件全部加载出来,解析出全限定名,缓存起来.然后你要获取具体的拓展点,我就在缓存中把他的权限定名拿出来,反射实例化成一个对象返回回去.也就是1.读取并解析文件内容 2.放入map缓存 3.反射生成对象.这三个知识点,我相信看这篇文章的,没有人不会.

按照上面的分析,把代码写出来不难吧.什么,写不出?那往下看

编码

项目结构如图:

dubbo源码解析-spi(五)

运行结果如图

dubbo源码解析-spi(五)

代码已经上传到码.可以下载跑起来,本来想用时序图,流程图和大家把思路理一下的,但是弄了几个小时,我觉得还不如自己看代码清楚.核心代码代码不到300行.有问题可以留言.

地址: https://gitee.com/HelloToby/tobySPI

克隆/下载 按钮,然后下载 ZIP ,然后导入 eclipse 或者 idea 就可以运行了.

小提示

因为之前部分同学反馈对源码中的思路还不是很清晰.所以这次我就直接把源码中的功能模块抽成一个demo,然后大家先把demo运行起来,接着把demo里面的代码重复写个一两遍.因为demo和源码一比一高仿的(变量名,方法名甚至if换不换行都尽量一致了).所以这个时候,再去看源码就和看自己写的代码应该一样的.这样思路就清晰很多了.希望这个方式对你阅读源码有帮助.

写在最后

这个是停更两个月后,回归的第一篇文章.由于公司的某些原因,接下来可能无法像去年一样,每周一更.但是尽量保证,两周一更.但是即使两周一更,也会每周不断学习提升自己,给大家带来更好的分享.但是鉴于肥朝才疏学浅,文中不足之处还望你不吝斧正.也欢迎关注我的掘金,名称为肥朝.

原文 

https://juejin.im/post/5ad3455bf265da237314e58e

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » dubbo源码解析-spi(五)

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址