
1.3 软件架构设计的原则与模式
与软件需要进行设计一样,软件架构也需要进行设计。软件架构设计是开发者对一个软件内部元素及其关系的主观映射,是一系列相关的抽象模式,用于指导大型软件各个方面的设计。在进行软件架构设计时,空间体系结构设计通常是核心,时间流程决策是关键。软件架构的设计通常遵循空间体系结构的设计原则,并与时间流程上的决策相结合。
1.3.1 软件架构设计的原则
面向对象的编程和软件设计模式通常会遵循6个原则,其中,前5个组合到一起就是我们常说的SOLID设计原则。这些原则也可以扩展到软件架构设计领域。
1.单一职责原则
所谓单一职责原则(Single Responsibility Principle,SRP),是指对一个类、模块或子系统而言,应该仅有一个引起它变化的原因。在软件空间体系结构中,元素的划分需要保持职责的清晰,最好不要满足多种不同的需求,否则会导致耦合过强,不利于后期的扩展和维护。划分职责的困难在于缺乏一个标准,最终需要从实际需求出发去考虑。领域驱动的软件架构设计在很多情况下是一种行之有效的方法。
2.开闭原则
软件空间体系结构中的类、函数、模块乃至子系统等元素应该对扩展开放,对修改封闭。也就是说,这些元素应该易于扩展,在需要根据需求变化时不需要去修改基础的逻辑代码。换句话说,一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现改变,这是高内聚的另一种体现,这就是所谓的开闭原则(Open Close Principle,OCP)。
3.里氏替换原则
在面向对象的编程设计中,里氏替换原则(Liskov Substitution Principle,LSP)指的是在基类出现的任何地方,其子类也可以出现,并且不会引发错误。换句话说,凡是基类适用的地方,子类一定也适用。在扩展的软件架构设计领域中,里氏替换指的是软件空间体系结构中类、函数、模块甚至子系统的可替代性。里氏替换原则是软件容错和灾备的指导原则,也是松耦合的一种体现。
4.接口隔离原则
软件空间体系中的不同元素,一般通过接口实现交互。但是我们必须避免建立臃肿庞大的接口,尽量建立功能单一的接口。换句话说,接口应该尽可能细化,同时方法的数量应该尽量少。单一职责原则的重点在于职责的划分,通常根据业务逻辑进行划分;而接口隔离原则(Interface Segregation Principle,ISP)则要求尽量减少接口中的方法,不依赖不需要的接口,这样更便于进行重构、变更和重新部署。接口是对外的承诺,我们应该提高接口和类的处理能力,减少对外的交互。简而言之,单一职责原则的目的是松耦合,接口隔离原则的目的是高内聚。
5.依赖倒置原则
依赖倒置原则(Dependence Inversion Principle,DIP)指的是高层次的软件空间体系结构元素不依赖于低层次的软件空间体系结构元素的实现细节,而是依赖于抽象,换句话说就是面向接口编程。在分布式软件中,通信方式和协议的实现是依赖倒置原则的具体体现。
6.迪米特原则
迪米特原则(Least Knowledge Principle,LKP)又称最少知识原则,指的是软件空间体系结构中类、函数、模块乃至子系统等元素应该对其他元素了解最少,也就是说,一个软件实体对自己的依赖感知最少,只关心那些必需的接口。它是对接口隔离原则的有益补充,是松耦合的另一种体现。
总而言之,在面向空间体系结构的软件架构设计中,可通过上述设计原则来实现松耦合和高内聚。
1.3.2 软件架构设计的模式
有交互就代表会涉及时序,软件架构中的空间体系结构必然会与时间流程决策相结合,而且随着软件工程的不断发展产生了一系列架构模式。
1.分层架构模式
分层架构模式是最常见的架构模式,也被称为N层架构模式。它是单一职责原则的宏观体现,强调分离。通过将组件划分到不同的层次,组件能够轻松实现各自的角色和职责。每个层次中的组件仅负责该层次的逻辑,这样更容易进行开发、测试、管理和维护。分层隔离有助于降低整个软件的复杂性。某些功能并不需要经过每一层,因此需要根据开闭原则来简化实现。
2.微内核架构模式
微内核架构模式也被称为插件架构模式,可用于实现基于产品的应用,如Eclipse。在微内核的基础上添加插件,可以提供不同的产品。微内核架构主要包含两个组件——核心系统和插件模块。应用逻辑通过分成核心系统和插件模块对外提供可扩展、高灵活和特性隔离的功能。
实际上,许多架构模式都可以作为整个系统的插件。换句话说,微内核架构模式可以嵌入其他架构模式中,通过插件还可以提供演化和增量开发的功能。
3.事件驱动架构模式
事件驱动架构模式是一种流行的分布式异步架构模式,用于创建可伸缩的软件。这种模式适用于各种规模的软件,并具有自适应性。它由高度解耦的、单一目的的事件处理组件组成,可以异步接收和处理事件。
一般来说,事件驱动架构模式主要包含4个组件:事件队列、调停者、事件通道和事件处理器。客户端创建事件并将其发送到事件队列,调停者接收事件并将其传递给事件通道,事件通道将事件传递给事件处理器,最终由事件处理器完成事件处理。调停者类似于集中调度中心。一种常见的事件驱动架构模式变体是使用分布式调度中心,将事件通道直接置于消息队列中。
4.微服务架构模式
微服务架构模式是SOLID设计原则的集中体现,其核心概念是具备高可伸缩性、易于部署和交付的独立部署单元,包含业务逻辑和处理流程的服务组件。内部服务组件之间的通信方式有两种:基于HTTP的同步机制(REST API和RPC[1])和基于消息队列的异步消息处理机制。
从空间上来说,服务组件可以是单一的模块或者一个大的软件,这两者都代表单一功能。
5.云服务架构模式
云服务架构模式是XaaS的综合体,基于云的架构可以使应用规模对服务的影响最小化。云服务架构模式起源于分布式共享内存的想法,典型代表是无服务架构。
要打破规模化,就要移除中心数据库,使用可复制的内存网格。应用的数据保存在所有活动的处理单元的内存中。可以根据应用规模加入和移除处理单元。小型软件可以使用一个处理单元,大型软件可以分隔成多个处理单元。处理单元还包括数据网格。虚拟化中间件负责管理和通信,并处理数据的同步和请求。这就是云服务架构模式的工作原理。
各种架构模式都或多或少地体现了逻辑架构、数据架构、物理拓扑架构、开发架构和运行架构,所以说它们是软件架构时空视角的结合体。