软件架构的组件设计与实践
1. 架构设计的重要性与组件划分
在软件开发中,良好的设计至关重要。对于代码而言,对象应具有单一明确的职责,相互隔离、正交且易于维护。同样的标准也适用于软件架构的组件。
大型系统若仅为一个组件,如单体应用,它将成为系统中所有事务的唯一真相源,会带来诸多不利后果,如难以隔离和识别变更、难以有效测试等。若不谨慎地将所有内容置于一处,代码将难以维护,应用组件若未得到同等关注,也会面临类似问题。
系统中创建内聚组件的方式有多种,取决于所需的抽象级别:
-创建 Python 包:识别可能多次复用的通用逻辑,并将其置于 Python 包中。
-微服务架构:将应用拆分为多个较小的服务,每个组件具有单一明确的职责,通过服务间的协作和信息交换实现与单体应用相同的功能。
2. 抽象与依赖倒置
2.1 抽象的概念
封装再次发挥作用,我们希望从系统层面以领域问题的角度进行表述,尽可能隐藏实现细节。代码应具有表达力,具备合适的抽象以揭示核心问题的解决方案,架构也应清晰展示系统的功能。诸如数据持久化方案、所选的 Web 框架、连接外部代理的库以及系统间的交互等细节并不重要,关键是系统的功能。例如,尖叫架构(SCREAM)就体现了这一理念。
2.2 依赖倒置原则(DIP)
依赖倒置原则在此方面有很大帮助,我们应依赖抽象而非具体实现。在代码中,将抽象(或接口)置于边界、依赖处,即应用中我们无法控制且未来可能变化的部分。这样做是为了倒置依赖,让外部依赖适应我们的代码。