作者|崔浩审稿人|孙淑娟做过软件架构设计的同学都知道,软件架构要解决的核心问题是针对不同的软件应用使用重复的软件架构模式。说白了就是实现架构层面的复用。也就是说,在不同的软件系统中,采用不同类型的软件架构,对软件架构的用途进行抽象,然后进行分类,将这些老字号的软件架构应用到不同的应用场景中,也就是架构师往往表示架构套路。这个套路就是我们今天要讲的软件架构风格。1.软件架构风格软件架构风格是一种惯用范式,描述了系统在特定应用领域的组织方式。架构风格由四个元素组成:词汇表。它包含成员和连接器类型。一组配置规则。描述如何组合组件和连接器。一组语义解释原则。用于说明系统中的元件和连接。定义基于样式的系统的分析。如何分析不同类型的软件系统。2.最终目标:软件架构的复用软件架构风格的研究和实践促进了设计的复用,一些经过验证的解决方案也可以可靠地用于解决新问题。架构风格不变的部分使得不同的系统可以共享相同的实现代码。软件架构风格的分类说完了软件架构风格的定义,我们来看看它的分类。由于软件的应用场景很多,其软件架构也有很多抽象。我们需要对软件架构进行分类,甚至根据分类创建子类。软件架构风格的基本分类如下:数据流风格:是一种处理数据流的软件架构风格,可分为批处理序列和流水线过滤器两类。前者侧重于大批量数据处理,而后者更关注数据处理过程。返回调用方式:应用程序将调用相应的模块并返回所需的值。它包括主程序/子程序风格、面向对象风格和层次结构风格。独立组件式:假设系统中的模块或服务独立存在,通过事件和通信相互调用。包括流程通信和事件驱动两种风格。虚拟机风格:包括解释器风格和基于规则的系统风格。前者广泛应用于虚拟机,后者将出现在人工智能领域。仓库式:包括数据库体系结构、黑板系统和超文本系统。控制循环方式:让组件形成一个反馈循环,通过接受一定的输入,确定一系列的输出,最终使环境达到一个新的状态。虽然架构风格多种多样,但是我们会选择不同的架构风格来对应不同的应用场景。下面给出一个实际的例子,通过例子的分析来分析架构风格的应用。3.软件架构风格的应用实例以上描述了软件架构风格的分类。大多数定义都有点无聊。这里我们将以车辆巡航控制为例,看看如何应用软件架构风格。如下图所示,如果要开发巡航控制系统,保证车辆可以随时调整速度。如上图所示,巡航控制系统有多个输入和一个输出。系统的目的就是通过这些输入参数来调节油门的输出参数,即控制油门,最终达到保持车速的目的。说白了,无论输入参数如何变化,车辆都保持一定的速度,所以油门必须相应调整。我们来看看这些输入/输出元件的定义:系统开关:打开/关闭巡航控制系统发动机开关:打开/关闭汽车发动机(当发动机打开时,巡航控制系统处于就绪状态状态)车轮脉冲:车轮每转动一圈,对应一次一个脉冲刹车:当踩下刹车时,巡航控制系统将暂时恢复为手动控制加速/减速:增加或减少当前车速(仅适用当巡航控制系统打开时)ResumeSpeed:恢复原始车速(仅在巡航控制系统打开时可用)clock:每毫秒计时脉冲使用哪种架构风格?适合面向对象架构风格的适用场景:首先需要设置汽车的期望速度,然后保持这个速度行驶。驾驶员需要调整速度表以达到所需速度,事件将被触发以向速度表发送消息以增加或减少速度。车速表还将有关汽车速度的信息发送到加速器,告诉汽车加速或减速。同时,当遇到障碍物需要刹车时,会向刹车系统发送信息,并退出巡航控制系统。以上描述的是典型的事件驱动场景,适合面向对象风格。面向对象架构风格的特点是将数据标识和基本操作封装在对象中。该模型的组件是对象。对象保持其自身表示的完整性。对象通过消息机制进行通信。对象在交互时需要知道彼此的身份,计算过程是通过对象之间的协作来完成的。从另一个角度来看,它适用于面向控制环架构风格的应用场景:驾驶员通过调节车速表达到预期速度后,系统保持恒定速度,但在行驶过程中,会出现颠簸、弯道等情况。等等,车辆不可能一直保持速度恒定,在上述情况下车速会下降。降低的车速实际上是整个系统的输出。此输出将作为输入返回到系统。系统会将此速度与预期速度进行比较。如果低于预期速度,它将执行加速操作。同理,如果超过预期速度,则进行减速操作。这是一个典型的闭环控制场景,系统需要在不断变化的外部条件下进行调整,使系统状态尽可能接近理想状态。过程控制环(闭环):是一种连续的过程模型,将过程输出的指定属性保持在特定的参考值(设定值),将事务处理视为输入、处理、输出、反馈、再输入.这里的输入是车辆当前的速度,处理是获取期望速度和当前速度的差值,反馈是加速或减速,然后将得到的数据给输入,循环继续。在分析完应用场景后,如何从面向对象和控制循环两种风格来设计架构。2.面向对象的架构风格分析对于系统的加速和减速功能,采用面向对象风格的巡航控制系统首先会定义驱动器、油门、时钟、速度计和车轮等组件。整个计算的主要过程如上图所示:驾驶员进行加/减速操作,设定期望车速,期望车速以报文的形式传给车速表;车速表通过向车轮和时钟发送消息获取车轮转速和时钟值,得到当前车速。速度;速度计计算当前速度与预期速度之间的速度差;差值以消息的形式发送给油门,油门通过速度差调整自身状态。整个过程是在时钟的控制下周期性地向速度计发送消息,重复步骤2~4。3.控制环架构风格分析控制环的架构风格以控制器为核心,期望速度,车轮脉冲、时钟和油门等作为一个组成部分。具体计算过程如上图所示:驱动器进行加/减速操作,设置期望速度值,将设置值设置为期望速度值,送入比较器。比较器会收集车轮脉冲和时钟值,并计算当前速度,连同预期速度,被交给控制器;控制器将期望速度与当前速度进行比较,计算出速度差值,控制油门,进行加速或非加速动作,并将被控对象的速度反馈给比较器。重复步骤3和4以形成速度反馈回路。4.总结所谓架构风格,就是经过时间考验的架构分析套路。不同的应用场景可以采用不同的架构风格。说到底就是软件架构的复用,让前人设计的架构可以重复使用。架构风格分为:数据流、返回调用、独立组件、虚拟机、仓库、控制循环等。本文以汽车巡航控制为例,介绍两种架构风格,面向对象和控制循环,并告诉你如何从应用场景的定义中选择合适的架构风格。并且根据两种不同的架构风格,给出了具体的架构分析方法。作者介绍崔浩,社区编辑,资深架构师。他拥有18年的软件开发和架构经验,以及10年的分布式架构经验。他曾经是惠普的技术专家。乐于分享,撰写了多篇阅读量超过60万的热门技术文章。《分布式架构原理与实践》作者。
