剖析框架代码的结构的系统方法

剖析框架代码的结构的系统方法

在阅读开源框架时,我们碰到的一大问题在于常常会不由自主的陷入代码的细节而无法把握框架代码的整体结构。市面上主流的、被大家所熟知而广泛应用的代码框架肯定考虑的非常周全,其代码结构不可避免存在一定的复杂性。如何快速把握开源框架的代码结构是我们课程的一大目标,为此我们需要梳理剖析框架代码结构的系统方法。

剖析框架代码结构的思路和方法

剖析框架代码结构的五大主题

本课程将从如下图所示的五个主题对如何剖析框架代码结构的系统方法展开详细讨论。

01.01

基于组件设计原则剖析代码结构

在笔者与很多同学进行沟通和交流时,发现大家在学习开源框架的源码时普遍存在一个问题,即一不小心就扎进细节,没办法找到代码的整体结构。目前市面上能被大家所熟知而广泛应用的代码框架功能强大而完善,代码结构也相对复杂。如果我们没有很好的方法来把握代码的整体结构,在阅读源码时很容易产生一种挫败感。当我们拿到一个框架的源代码时,首先应该问如下一个问题,即:

为什么这个框架的代码结构要这么设计

任何框架之所以能称为框架,能被广大开发人员所认同,在其架构设计上势必遵循了一定的原则和策略。其中,组件设计原则很大程度上是一切软件系统设计的基本原则,需要通过实践加深对其的理解和应用。通过对组件设计原则的理解,也可以将其应用到日常的系统设计过程中。

基于架构演进过程剖析代码结构

有过一定分布式系统开发经历的同学都知道 RPC 架构,RPC 架构是一切分布式系统设计和实现的基础。基于基础的 RPC 架构,业界也衍生除了很多著名的开发框架,例如本课程将详细分析的 Dubbo 框架。Dubbo 是一个典型的 RPC 框架,包含了 RPC 的实现方式。另一方面,我们看到的是一个成熟、稳定且符合设计原则的 Dubbo 框架,但我相信 Dubbo 的开发人员也不是一开始就把 Dubbo 设计成现在这个代码结构。换个角度,如果现在我们自己来设计这样一个框架,我们通常会采用一定的策略来一步一步从简单到复杂、从核心功能到辅助机制逐步实现和完善一个框架,这也是软件开发的一个基本规律。针对这个角度,当我们想要解读 Dubbo 这样的框架而又觉得无从下手时,可以考虑如下所示的一个核心问题,即:

如何从易到难对框架进行逐步拆解?

在设计和实现上,Dubbo 是一个非常典型的从易到难、从底层到高层、从技术内核到业务实现逐步完整的开源框架,具体良好的框架演进性。同时,Dubbo 框架在代码实现上也具备相当的复杂度,需要我们通过这种逐步演进的剖析方法掌握其实现原理。对于其他框架而言,这点同样使用。

基于核心执行流程剖析代码结构

如果想要跳出源码阅读的困境,不想浪费大量时间阅读代码细节,不要始终只能捕捉到对系统的片段化认识,我们就必须转换到另一种观点来看待系统。就“框架和结构”这个主题而言,我们进行源码解读的主要目标是明确代码的结构,前面的课程中我们已经学习了从设计原则、架构演进等不同角度出发实现这个目标。事实上,还有一个比较容易理解和把握的方法可以帮忙我们梳理代码结构,这就是代码的执行流程。任何系统的行为都可以认为是流程的组合,看似复杂的代码结构通过分析一般都能梳理出一条贯穿全局的主流程。当我们拿到一个框架的源代码时,不妨先来问自己一个问题:

如何抓住主流程对框架进行分层剖析?

提出一个问题,我们就要解决一个问题,而解决一个问题的方法通常是继续抛出其他问题。那么,对于一个框架而言,什么才是它的主流程呢?这个问题看上去很难回答,但实时上并非如此。当我们已经着手去分析一个框架的代码结构时,意味着至少我们已经使用过这个框架。基于这个这点,采自上而下的方式,通常都能明确所谓的主流程。举例来说,对于前面提到的 Dubbo 框架,一次 RPC 请求就是它的主流程。

基于基础架构组成剖析代码结构

诚然,我们处在一个行业快速变化、技术发展日新月异,新的工具框架也层出不穷。但是,今天笔者想分享的一个观点是:就算新的工具框架不断出现,但这些工具框架背后的很多基础性的架构实际上已经存在了十几年、甚至几十年。我们只要掌握了这些基础性架构,不管面对新框架还是老框架,都应该能够快速掌握其基础的代码结构,从而在学习效率上达到事半功倍的效果。围绕“框架和结构”主题,今天我们要讨论的一个问题是:

如何掌握从基础架构扩展到具体实现框架的方法?

这里所谓的基础性架构有很多,比方说上文中提到的 RPC 架构已经足足存在和发展了 40 余年,其原型可追溯至 1974 年发布的 RFC 674 草案——“过程调用协议文档第 2 版”。RPC 架构也是构建一切分布式系统的基础性架构,而我们今天继续要讨论的 Dubbo 也只不过是 RPC 架构的一款典型实现框架而已,在阅读 Dubbo 等 RPC 实现框架的源码时,我们同样可以基于 RPC 架构来梳理代码结构。

基于可扩展性设计剖析代码结构

可扩展性(Extensibility)和可伸缩性(Scalability)构成了架构设计的核心话题。从笔者的经历而言,一个系统在面临可伸缩性问题之前,首先要面对的往往是可扩展性问题。在经历了一段时间的系统开发之后,最让人头痛的事情莫过于面对一堆新的需求,我们如何以最小的代价和最快的速度将其添加到目前的系统中去,这就需要我们在设计系统的过程中充分考虑预留可扩展点。那么问题就来了,即:

如何在框架中预留可扩展点?

在软件架构模式中,存在一条开闭原则(Open Closed Principle,OCP),即指软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。扩展点是这一模式的一种有效的实现方式,在本课程将要介绍的 Spring Boot、Dubbo、Mybatis 等开发框架中,到处可以看到可扩展点的身影,这些扩展点的实现方法各有特色。掌握这些扩展点是理解这些框架原理的一条捷径。

每个主题的行文思路

对于上述的每个主题,我们的行文思路都将遵循下图所示的递进结构。

01.02

  • 抛出源码阅读过程中碰到的问题

在阅读开源框架的源码过程中,我们势必会遇到很多问题。以下一节课中将要介绍的“基于组件设计原则剖析代码结构”为例,当我们拿到 Dubbo 或 Mybatis 时,看到了纷繁复杂的代码结构时,可能首先要问的问题就是“为什么代码结构要这么设计?”。

  • 给出问题的解决思路和方法

对于具体的某个问题,我们需要梳理应对的思路和方法。从这个角度讲,我们在面试或日常工作中碰到问题时同样需要经历这一步骤。显然,每个问题的解决方法都可能有所不同,对于前面抛出的“为什么代码结构要这么设计?”这个问题,我们应该明白这些框架代码结构背后实际上都是遵循了一定的组件设计原则,这些设计原则会引导我们解决问题。

  • 阐述解决问题所需要的知识体系

有了思路和方法之后,我们就需要具备背后的知识体系。这是本课程能够给到大家的最核心的内容。对于“为什么代码结构要这么设计?”这个问题,“组件设计原则”是我们需要掌握的知识体系,因此我们需要掌握与之相关的各方面理论和原理。

  • 基于框架源码分析所提出的方法

即使我们掌握了所需的知识体系,但如何将这些理论知识应用于实际又是一个很有挑战的事情。因此,对于“组件设计原则”这个主题,我们需要基于 Dubbo、Mybatis 等主流框架来展开讨论,详细阐述组件设计原则在其中的应用,从而能够更好的指导我们的日常开发工作。

剖析框架代码结构作为剖析分布式系统开发核心机制剖析的一大模块,关注的是对开发框架整体结构的把握,帮助大家梳理对框架代码结构的正确认识,这些认识对本课程后续内容也有指导作用。

技术原理类面试题分析

在不断学习技术的过程中,很多处于初级的开发人员都有自己的目标和方向,但是在纷繁复杂的技术知识体系和各种层出不穷的工具框架面前就显的无从下手。而有些同学已经跨越了初级阶段,并按照自己的方法正在系统的梳理各种技术知识体系,但很多时候会发现效果不是很好,自身提升的速度比较缓慢。本课程关注于“源码解读”这一切入点,其目标就在于为这两类人提供一个简单的方法促使其能够快速成长。

学习开源框架的代码是一种过程,而不是结果。在本课程中,基于源码解读的学习过程的目标是帮助大家能够找到一份理想而能够胜任的工作。因此,在我们讨论关于分布式系统核心实现机制时,会结合各个主题给出面试题的分析以及解答的技巧。这些面试题来自笔者在日常开发过程中的持续总结,也来自于阿里、京东、网易等国内一线互联网公司的真实案例。

对于每道技术原理类面试题而言,我们认为每个面试者都应该有自己的解题思路。同一个知识点、同一个工具或框架在不同公司的问法可能是不一样的,但把握其中的基本原理都是回答问题的切入点。当我们对问题的原理有了明确的认识,这是第一点。本课程的目的就是帮助大家梳理分布式系统开发过程中的各种技术原理,我们在《开篇词汇:论技术原理的相通性》中已经知道技术原理从很大程度上讲是相通的,可以做到触类旁通。

另一方面,光有思路还不够,我们还需要不断的练习。因此,我们在每个主题的结语部分同样会结合这个主题的内容给出相关练习题供大家进行分析和解答,从而达到练习的效果。

从源码分析到日常开发

通过课程帮忙大家完成技术原理类面试是本课程的一大目标,但也不是唯一目标。作为扩展,我们希望通过对 Dubbo、Spring Cloud 等优秀开源框架的学习,掌握系统架构设计和实现过程中的方法和技巧,并指导日常的开发工作。例如,在下一节介绍组件设计原则时,我们还将重点描述“循环依赖”这一特定的组件设计原则,并给出能够指导日常开发工作的案例分析。

这是一个从源码分析到日常开发的过程,而且是一个不断演进的过程。所谓理论指导实践,我们一定要从纷繁复杂的技术知识体系和各种层出不穷的工具框架中抓住其背后的原理,然后做到用自己的语言和方法对这些原理进行阐述,也就是能够构建属于你自己的技术知识体系。事实上,现在很多大型互联网公司的面试风格上就是偏向与考察面试者的原理分析能力和以及应用能力,这点会贯穿我们这个课程。

小结与预告

本文梳理了剖析框架代码的结构的系统方法,一共分成五大主题,并给出了每个主题的行文思路。同时,本文对课程的学习目标也做了进一步明确,一方面用于面试,一方面则用于指导日常开发。

从下一篇开始,我们将正式进入第一个主题的介绍,即基于基于组件设计原则剖析代码结构。

上一篇
下一篇