框架源码阅读经验分享

137 阅读5分钟

阅读框架代码的好处多多,不仅可以从框架中学习到其架构风格,也能从框架代码中学习到编程技巧,提高自己的代码功力,还可以在平时的工作中遇到线上问题能快速定位问题并解决问题。

1、首先要了解框架是干什么的,可以百度搜索下,建议阅读官方文档,写一个最简单的Demo,也就是传说中的Hello World ;

2、写完Demo后千万不要一头扎进代码的海洋中,一开始就陷入代码的细节中,很容易在代码的海洋中分不清方向了。阅读源码的顺序一定要自上而下,这一步什么都不要做,抑制住一头扎进去的冲动就行了;

3、我们平时做项目时第一步就是收集需求和分析需求,阅读框架代码也一样,框架也是要解决我们开发中的某一方面的问题,也有自己的需求,所以我们也要整理出这个框架的需求,把框架主要解决的功能列出清单来(只列出主要的大的功能点,太过细节的不要纠缠,可以留到以后再去完善。框架源码第一版本出来时也不是这么负责,也是在不断的迭代和历史的沉淀中才会导致现在的复杂,所以一定要学会化繁为简);

举个例子,我们现在阅读SpringCloud的配置中心Config的源码,首先我们要明白配置中心要解决的主要问题是各微服务的配置放到一个专门的服务中进行统一配置,那么必然就涉及到Client端和Server端,对于Server端:

a、统一的配置一定要有个地方进行存储,存储的方式有多种,比如数据库存储、Git和SVN存储、文件存储等等,因此存储方式就不能写死,需要定义一个存储层的接口出来,然后多种存储方式的实现类分别实现这个接口,但是我们同一时间只能使用一种存储方式,因此需要通过一个配置属性指定需要将哪个Bean注入到Spring容器中;

b、各微服务需要从配置中心拉取到配置,肯定是不能直接去访问Config Server的数据库的,因此Server端就必须提供一系列的接口方便Client端查询和读取配置信息;

对于Client端:

a、服务启动加载时需要调用接口读取配置中心的配置信息;

b、我们知道SpringBoot项目启动后,会将配置文件application.properties、bootstrap.properties等文件中的key-value属性加载到Environment中的,对于项目中需要读取属性值的地方,再使用PropertySourceLocator接口的locate方法从Environment中读取到,因此从 Server端加载到的配置属性需要保存到Environment中,然后再新增一个PropertySourceLocator的实现类专门用来从Environment读取从Server加载到的配置属性的值;

c、Server端的配置有可能会修改,如果修改后要如何同步到Client端了,对于这种问题,一般有两种解决方式,一种是拉,一种是推,对于Client端缓存的Key-Value属性的更新也有两种方式,一种是全量更新,好处是实现简单,但缺点是会造成大量的冗余和不必要的更新,另一种是增量更新,好处是只更新修改了那部分key-value属性,减少了冗余和避免了不必要的更新,提高了性能,但缺点是实现较为复杂;

4、主要功能点列出来之后,如果时间和精力的允许的情况下,可以重复造轮子,自己尝试着把这些核心的功能点实现一遍,这样对于阅读代码和充分理解代码是非常有帮助的,记忆也更深刻,不会出现代码读完几天后就忘了的情况;

5、上面列的功能点其实就相当于是问题列表了,只要你有一定的编程经验,对于这些问题其实你心里已经有实现方案了。这个时候可以带着这些问题去读代码,这个时候依然不要太过于去纠缠代码细节了,只需要研究下针对这些问题点框架代码是如何实现的。可以关注下框架中定义的一些接口,因为很多框架有一个共同点,就是一些对于一些功能点定义一个接口,然后有多个实现类,通过配置注入不同的bean,了解这些接口有助于对代码整体结构的理解。做完这一步后,你对这个框架代码算是基本掌握了,这个时候可以画出框架的架构图、流程图、时序图等等;

6、对于框架中设计比较精辟和核心的部分可以细读,因为这部分往往是这个框架的灵魂,比如Netty框架的React线程模式;

7、到这一步后可以尝试去读一些功能点的实现细节,带着问题去读,因为这个时候读细节不会导致迷失方向,而且还可以从框架代码细节中学习到一些编程技巧;