个人适当学习了软考系统架构设计师中关于系统架构设计相关的内容,梳理了一下相关信息。
常见架构类型和常见分类
常见的软考中出现的系统架构列举如下:
- 分层架构
- 管道-过滤器架构
- 客户端-服务器架构
- 模型-视图-控制器架构,即MVC架构
- 事件驱动架构
- 微服务架构
- 黑板架构
- 解释器模式
- 数据仓库风格架构
- 面向服务架构
网上查找到的资料一般把架构分为五类架构风格,分别是数据流风格,调用返回风格,独立构建风格,虚拟机风格和仓库风格。并对上述系统进行了归类,归类到这五种架构风格中。
架构分类之个人理解
以下纯属个人角度的理解,和软考本身的考点和预期可能不相符合,请注意甄别。
针对上述分类个人认为,感觉有在把不同维度或者层次的内容强行放在同一层次来进行比较的嫌疑,个人感觉非常别扭,所以我重新按照个人的理解进行了分类。同时也参考了上述的五类架构风格的分类。
上述分类个人感觉是在把不同层次的系统混为一谈,比如说"分层架构",可以是服务器程序,也可以是客户端程序中的一种实践方式,但是客户端-服务器架构,则是在描述一个典型的网络结构模式,当然这也可以是一种广义上的系统架构,但是因为需要从系统架构的角度去分类,混为一谈就会显得很混乱,所以我觉得最重要的是理清楚系统的层次的概念。
个人按照两层一类来对上述架构风格进行划分。
第一层,整体系统 还是 单体系统
第一层是当前描述的系统是否存在和外界的交互,不存在交互则是一个逻辑自洽的整体系统,而存在交互则认为这个系统是一个和外界存在交互的单体系统。
从这个层面来说,客户端-服务器架构个人认为描述的是一个整体系统,事件驱动架构个人认为也是一个整体系统,这里可能会存在疑问,事件驱动往小了说是一种编程框架,往大了说则决定了系统的运行机制,我理解事件驱动架构的核心是决定了包括客户端和服务器在内的整个系统的信息交互方式,也就是客户端和服务器不直接交互,而是通过这个事件驱动框架进行交互,这就是事件驱动架构。
而上述其他的架构,个人认为都是在描述单体系统。
第二类,请求响应系统 还是 输入输出系统
第二类是对单体和外界交互的方式进行分类。我们这里把单体系统都视作服务端(比如手机APP也可以视作服务端,客户端就是我们用户,或者是其他调用这个app的APP)根据客户端在发起请求后,和服务端的输出产物之间的关系,可以分为请求返回响应系统和输入输出系统。
请求返回响应系统中,客户端需要获取系统返回的结果,个人理解为输出结果和输入来源是同一媒介或者说界面,比如都是通过网络链路接收请求和返还结果,或者手机app界面上触发的修改,最终将修改结果呈现在手机app界面上。个人认为上述的分层架构,MVC架构,微服务架构,黑板架构,数据仓库风格架构,面向服务架构都是属于这一类的。
而输入输出系统中,客户端不需要获取到系统返回的结果,客户端只是输入系统,而输出是在其他界面,或者说是其他介质上。比如管道-过滤器系统的典型应用,编译器,输入为源文件,输出产物为可执行文件。或者闭环控制架构,其输入为设定的温度,和从温度传感器接收到的当前温度,但输出是对制冷的化学过程的执行强度的控制。包括上述虚拟机风格中的解释器模式,个人认为也可以归为此类。输入为代码或者字节码,输出为操作系统的执行目标,也就是一个接近流式的处理流程。
第三层,物理上可拆分单体 还是 物理上不可拆分单体
第三层个人认为是单体系统内部是否可拆分为不同的单体。当然分层架构,内部也可以认为是有很多个不同的模块组成的,但其在物理结构上,本质上还是一个物理上不可拆分的单体,只是在逻辑上是可拆分的。
分层架构,数据仓库风格架构,黑板架构个人认为都是物理上不可拆分的单体架构。而模型-视图-控制的MVC架构,个人认为就是分层架构在WEB应用场景下的一种特例。
面向服务架构个人认为就是一种典型的物理上可拆分的单体架构,即内部可以进一步拆成物理上不同的系统,这里应该是特指物理上可拆分的请求响应系统。而微服务架构可以认为是面向服务架构的一种特例,系统架构设计时以细粒度地解耦地拆分服务为要务的一种设计方式。
个人分类Xmind
具体架构的简要说明
架构的组成成分
每一种架构都有各自不同的组成构件。以下列举下几种常见架构的组成构件。
-
分层架构(四层为例:展现层,业务层,持久层,数据层)
-
管道-过滤器架构(过滤器类型:过程起点,数据转换,测试条件,终点)
-
MVC架构(模型,视图,控制器)
-
黑板架构(黑板,知识源,控制组件)
架构的评估维度
每种架构都可以从 使用场景类型,优点,缺点,实际用途各个维度进行理解和评估。这个待后续补充。
参考文档
https://zhuanlan.zhihu.com/p/603201577
https://zhuanlan.zhihu.com/p/564143827