如何从开源项目中汲取架构思维?
极客时间编辑部
讲述:初明明大小:4.23M时长:04:37
如果说技术架构如同中医一样,药材是基础,药方是核心,那么药方就好比技术方案,是技术架构的灵魂。近日,小桔车服营销基础负责人高福来根据自己在系统架构方面的经历,分享了如何从优秀的框架源码中学习架构设计方案。
高福来认为阅读源码有三个层次境界,从低到高依次为:
了解层次:知道整体的流程是怎样的,会使用,这个阶段停留在表面。
深入层次:深入源码内部,对细节实现、原理非常熟悉。
内化层次:从这些框架中汲取设计思维,并能总结出通用方案,又能根据这个通用方案演化成不同的具体方案。这听起来比较虚,下面会用具体的例子来解释。
如果是工作了两三年的人,对 SPI 或许并不陌生,在 META-INF/services 目录下,有一个 java.sql.Driver 文件,然后在 DriverManager 中加载并初始化数据库驱动。
SPI 最常用的场景就是标准定义与实现解耦,运行时加载实现。为什么要在 META-INF/services 目录下建立文件呢,跟踪源码,在 ServiceLoader 类中可以看到有这个前缀定义,到这你可以看出这是一个约定俗成的事情。
至此,可以看到 SPI 的实现原理是什么,说白了,就是运行时在指定的目录下加载对应的文件,读取文件中的内容,然后实例化对应的类。
尽管已经知道了 SPI 的原理、用法、甚至在某些场景下还可以用 SPI 来解决问题,但如果止步于此,似乎隐约有些难以释怀。下面继续问两个问题:
为什么它要定义在 META-INF/services 目录下建立文件,能不能换个目录呢?
目录里的内容为什么只写实现类,能不能换成其它的格式来写呢?
有些人可能会说源码就是这样写的,哪有为什么,其实深入思考一下,这些就是约定的规范,换言之就是标准,这是一个重要的结论。再仔细看整个 SPI 的执行流程:从约定的路径下加载文件并实现化类、放到容器中、需要的时候从容器中取出并执行对应的操作。
从上面的流程中总结它的关键步骤是:标准、识别、注册、运行。标准就是一种约定,你可以定义成文件,也可以完全定义到其它方式。
系统的可扩展性可以遵循“标准、识别、注册、运行”这个法则去演化不同的具体实现,可以根据实际的场景选择合适的方法。阅读源码的时候,除了要看它实现的原理,更重要的是找出通用的规律,演化成不同的解决方案。
现在开源框架太多了,一个人很难有精力看完所有的框架源码,而快速掌握源码是一项关键能力。掌握它,学习新的框架就会事半功倍。听起来很美好,但要做到可并不简单。
那框架到底是什么呢?不同的人对它的定义也不一样,高福来对框架的定义是:有固定的流程,并且对用户开放业务逻辑的半成品,这里有 3 个关键点:
固定的流程:这是框架解决具体问题的关键步骤,强调的是有什么而不是如何做。
开放用户业务:框架的核心是赋能于用户,解决某类问题,能执行用户的业务逻辑。举个例子,Hadoop 在执行 Map-Reduce Job 时,针对不同的用户其业务逻辑是不一样的,Hadoop 能赋能用户,执行用户自己的业务逻辑。
半成品:在没有具体的业务场景下,框架本身运行是没有意义的,所以它是一个半成品。
从这些框架中,可以学到一种架构思维:固定不变的流程,开放变化点。阿里 TMF 框架中的关键思想也有类似的表述。
现在回过头再看上面对框架的定义,即有固定的流程,并且对用户开放业务逻辑的半成品。由此我们可以知道阅读源码的关键是什么。就是找固定的流程,知道了固定流程,再带着疑问去看源码实现,就快得多。
架构思维听起来是一个非常空洞的概念,尤其是对于没有架构经验的人来讲。对于一个刚开始接触架构的人来讲,如何学习呢?高福来认为应该从点滴开始,积累解决方案,抓住问题本质,形成通用架构设计方案。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(5)
- 最新
- 精选
- 盖瑞Chen为啥要拿中医开头🤦🏻♂️1
- 二康优秀开源项目里有好多优秀的设计思想需要学习
- AhianZhang最近因为要做基础框架,看的开源项目比较多,其中每个优秀的项目中都用了大量的设计模式
- 小高往深层次说,是不是就是看框架的实现思维?
- zhou那到底如何从开源项目汲取架构思维呢?
收起评论