作者 | 崔皓
审校 | 孙淑娟文章源自玩技e族-https://www.playezu.com/231694.html
做过软件架构设计的同学都清楚,软件架构要解决的核心问题就是对不同的软件应用使用重复的软件架构模式,说白了就是达到架构级别的重用。也就是说,在不同的软件系统中,使用不同类型的软件架构,将软件架构的使用进行抽象,再对其分类,用这些历经时间打磨的软件架构套用不同的应用场景,也就是架构师常说的架构套路。这个套路就是今天我们要说的软件架构风格。文章源自玩技e族-https://www.playezu.com/231694.html
一、软件架构风格
软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式( idiomatic paradigm)。文章源自玩技e族-https://www.playezu.com/231694.html
架构风格包括四个要素:文章源自玩技e族-https://www.playezu.com/231694.html
- 一个词汇表。其中包含构件和连接件类型。
- 一套配置规则。描述了如何将构件和连接件进行组合。
- 一套语义解释原则。用来解释系统中的构件和连接关系。
- 定义对基于风格的系统的分析。针对不同类型软件系统,如何进行分析。
二、最终目的:软件架构的复用
对软件架构风格的研究和实践促进了对设计的重用,一些经过实践证实的解决方案也可以可靠地用于解决新的问题。架构风格不变的部分使不同的系统可以共享同一个实现代码。文章源自玩技e族-https://www.playezu.com/231694.html
软件架构风格的分类文章源自玩技e族-https://www.playezu.com/231694.html
说完了软件架构风格的定义,接下来看看它的分类。由于软件的应用场景众多,对其软件架构的抽象也不在少数。我们需要对软件架构进行分类,甚至在分类的基础上建立子类。文章源自玩技e族-https://www.playezu.com/231694.html
如下是对软件架构风格的基本分类:文章源自玩技e族-https://www.playezu.com/231694.html
- 数据流风格:它是对数据流进行处理的软件架构风格,分为批处理序列和管道-过滤器两类,前者侧重大批量的数据处理,后者更关注数据处理过程。
- 返回调用风格:应用程序会调用对应的模块并且返回需要的值。它包括主程序/子程序风格、面向对象风格和层次结构风格。
- 独立构件风格:假设系统中的模块或者服务都是独立存在,通过事件和通信完成相互调用。包括进程通信和事件驱动两种风格。
- 虚拟机风格:包括解释器风格和基于规则的系统风格。前者在虚拟机中应用广泛,后者会在人工智能领域出现。
- 仓库风格:包括数据库架构、黑板系统和超文本系统三种风格。
- 控制环路风格:让组建之间形成反馈循环,通过接受一定的输入,确定一系列的输出,最终使环境达到一个新的状态。
虽然架构风格多种多样,在不同的应用场景我们会选择不同的架构风格与之对应,接下来我们会举一个实际的例子,通过对例子的分析引出架构风格的应用。文章源自玩技e族-https://www.playezu.com/231694.html
三、软件架构风格应用举例
前面描述了软件架构风格的分类,多是定义略显枯燥,这里会应用一个车辆定速巡航的例子看看如何应用软件架构的风格。文章源自玩技e族-https://www.playezu.com/231694.html
如下图所示,如果要开发一套定速巡航系统,从而确保车辆能够随时调整其行进的速度。
如上图所示,巡航控制系统有多个输入和一个输出,系统想要达到的目的就是通过这些输入参数去调整油门这个输出参数,也就是控制油门,最终达到保持车速的目的。说白了,就是不过输入参数如何改变,车辆都保持一定的速度,因此油门就要随之调整。
一起来看看这些输入/输出要素的定义:
- 系统开关:开启/关闭巡航控制系统
- 引擎开关:开启/关闭汽车引擎(引擎开启时,巡航控制系统处于就绪状态)
- 车轮脉冲:车轮每转一次,相应地发出一次脉冲
- 刹车:当刹车被踩下时,定速巡航控制系统会临时恢复到人工控制
- 增/减速:增加或减慢当前车速(仅在定速巡航控制系统处于开启的状态下可用)
- 恢复速度:恢复原来保持的车速(仅在定速巡航控制系统处于开启的状态下可用)
- 时钟:每毫秒定时脉冲
1.架构风格场景分析
既然有了具体的案例,就需要通过具体的使用场景来分析使用哪种架构风格?
适合面向对象架构风格的应用场景:
- 首先需要设置一个汽车行驶的预期速度,然后保持这个速度行驶。司机需要调整计速器来达到预期的速度,此时会触发事件把增加或者减少速度的消息发送给计速器。计速器也会将车子的速度消息传送给油门,告诉车子加速还是减速。
- 同时遇到障碍物需要刹车,也会发送消息给刹车系统,并退出巡航控制系统。
上面描述的正是一个典型的事件驱动场景,适合于面向对象风格。面向对象架构风格的特征是将数据标识和基本操作封装在对象中。这种模式的构件是对象,对象维护自身表示的完整性,对象之间通过消息机制进行通信,对象交互时需要知道彼此的标识,通过对象之间的协作完成计算过程。
再换一个角度,适合面向控制环路架构风格的应用场景:
司机通过调整计速器达到了预期速度之后,系统维持恒定速度行驶,但是在行驶过程中会遇到路面颠簸、拐弯等情况,车辆速度不可能一直保持恒定,在上述情况下车辆速度会降低。降低的车速实际是整个系统的输出,这个输出会作为输入再次返回到系统中,系统会将这个速度与预期的速度进行比较,如果低于预期的速度,会进行加速的操作。同理,如果超过了预期的速度就会执行减速的操作。
这是一个典型的闭环控制的情景,系统需要在外界情况不断发生变化的情况下进行调整,使得系统状态尽可能接近期望状态。
过程控制环路(闭环):是将过程输出的指定属性维护在一个特定的参考值(设定值),将事务处理看成输入、加工、输出、反馈、再输入的一个持续的过程模型。
这里的输入就是车辆的当前速度,加工就是求得预期速度与当前速度的差,反馈就是进行增速还是减速,再将得到数据给到输入,不断循环。
有了对应用场景的分析之后,再从面向对象和控制环路两种风格如何,看如何设计架构。
2.面向对象架构风格分析
对于系统的增减速功能,采用面向对象风格的巡航控制系统首先会定义司机、油门、时钟、速度计和车轮等构件。
整个计算的主要过程如上图所示:
- 司机进行增/减速操作设置期望速度,该期望速度以消息的形式传递给速度计;
- 速度计通过向车轮和时钟发送消息获取车轮转速和时钟值,得到当前速度;
- 速度计计算当前速度和期望速度的速度差值;
- 该差值以消息的形式发送给油门,油门通过速度差值调节自身状态。
整个过程在时钟的控制下定期向速度计发送消息,重复执行2~4。
3.控制环路架构风格分析
控制环路的架构风格以控制器为核心,期望速度、车轮脉冲、时钟和油门等作为构件。
具体的计算过程如上图所示:
- 司机进行增/减速操作设置期望速度值
- 将设定值置为期望速度值,并将其交给比较器
- 比较器会采集车轮脉冲和时钟值,计算出当前速度,连同预期速度都交给控制器;
- 控制器比较期望速度和当前速度,计算速度差值,控制油门,执行加速或者不加速的动作,并将速度这个被控对象反馈给比较器。
反复执行3和4形成速度的反馈闭环。
四、总结
所谓架构风格就是经过时间考验的架构分析的套路,针对不同的应用场景可以利用不同的架构风格,说到底就是对软件架构的复用,让前人设计的架构能够被反复使用。架构风格分为:数据流、返回调用、独立构件、虚拟机、仓库、控制环路等多种。
文中我们通过汽车定速巡航的例子,引出了面向对象和控制环路的两种架构风格,告诉大家如何从应用场景的定义选择适合的架构风格。并且,针对两种不同的架构风格,给出了架构分析的具体方法。
作者介绍
崔皓,51CTO社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。曾任惠普技术专家。乐于分享,撰写了很多热门技术文章,阅读量超过60万。《分布式架构原理与实践》作者。
评论