软件架构设计
概念
本质
- 对软件系统的关于结构、行为和属性的高级抽象
- 软件架构风格是特定领域的惯用模式,软件架构定义了一个词汇表和一组约束
作用
- 方便项目干系人的交流,将满足需求的职责分配到组件上
- 引入可传递和可复用的模型,使软件的质量具备可预见性
- 服务于循序渐进的原型设计,简化推理和控制的更改过程
架构的4+1视图
架构的发展历程
- 无架构阶段–汇编语言
- 萌芽阶段–程序结构设计
- 初级阶段–统一建模语言
- 高级阶段–4+1视图
五大架构风格
1.数据流风格
- 批处理、管道-过滤器
2.调用/返回风格
- 主程序/子程序、面向对象、层次结构
3.独立构件风格
- 进程通信、事件驱动系统(隐式调用)
4.虚拟机风格
- 解释器、规则系统
5.仓库风格
- 数据库系统、黑板系统、超文本系统
数据流风格
数据驱动–前一步处理的结果是后一步的输入内容
优点
- 松耦合
- 良好的重用性、可维护性
- 良好的可扩展性(标准接口适配)
- 良好的隐蔽性
- 支持并行
缺点
- 交互性差
- 复杂性较高
- 性能较差(每个过滤器都需要解析与合成数据)
典型实例:传统编译器、网络报文处理
子风格
批处理序列:大量整体数据,将数据看成整体,无需用户交互
- 关键字:整体
管道-过滤器:流式数据,将数据看成一个流,弱用户交互
- 关键字:流式
调用/返回风格
特点:主函数(系统)调用子函数(系统),子函数(系统)返回执行结果
子风格
主程序/子程序:面向过程
面向对象:对象的方法调用
分层:层与层之间的方法调用
优点
- 良好的重用性
- 良好的可维护性
- 良好的可扩展性,支持递增设计
缺点
- 并不是所有系统都适合分层
- 很难找到一个合适且正确的层次抽象方法
- 不同层次之间耦合度高的系统很难实现
- 层次多了会影响效率,层次少了各层职责不明确
独立构件风格
构件之间不直接交互,一般采用消息队列的方式就是一种独立构件风格
优点
- 松耦合,良好的可重用性、可修改性、可扩展性
缺点
- 不能确认是否会得到相应,不能保证调用的顺序,正确性的推理存在问题,数据交换存在某些问题
虚拟机风格
概念
- 虚拟机根据字节码文件和既定语义,翻译得到对应的系统指令
子风格
解释器
- 适用于需要“自定义规则”的场景
规则为中心
- 在解释器的基础上增加经验规则,适用于专家系统
优点
- 可以灵活应对自定义场景
缺点
- 复杂度较高
仓库风格
特点:形成数据仓库,所有构件都是基于这个数据仓库进行业务处理,
子风格
数据库系统
- 以数据为中心
黑板系统(例如:语音识别、知识推理)
在以数据为中心的基础上,使用中心数据出发业务逻辑部件
优点
- 可修改性和可维护性,可重用的知识源,容错性和健壮性
缺点
- 测试困难,不能保证有好的解决方案,难以建立好的控制策略,低效,开发困难,缺乏并行机制
应用场景:语音识别、场景识别、图像处理、知识推理等
超文本系统
闭环风格
过程控制,常见于嵌入式系统中,用于解决简单闭环控制问题
应用:空调温控,定速巡航
C2风格
基本规则
- 构件和连接件都有一个顶部和一个底部
- 构件的顶部要连接连接件的底部,构件的底部要连接到连接件的顶部,构件之间不允许直连
- 一个连接件可以和任意数量的其他构件和连接件相连
- 当两个连接件进行直接连接时,必须由其中一个的底部到另一个的顶部
CS与BS架构风格
CS:APP,BS:浏览器访问网站
两层CS架构
- server(数据层) + client(表示层)构成
- 开发成本较高,程序设计复杂,信息内容和形式单一,用户界面风格不一致,软件移植、维护、升级困难,对新技术的应用不友好
三层CS架构
- 数据层 + 表示层 + 功能层(可以放在server,也可以放在client)
- 相对两层CS更加灵活,逻辑不写在表示层,而是放在功能层进行处理
三层BS架构
数据层 + 表示层(浏览器) + 功能层
当前很多系统的主流架构
MVC、MVP、MVVM
MVC = Model + View + Controller
- 对应的几项技术:
View~JSP
Controller~Servlet
Model~EJB
- 对应的几项技术:
MVP = Model + View + Presenter
- 是MVC的变种,实现了V和M之间的解耦,更加符合分层的思想,更好支持单元测试,V需要处理界面时间,P处理业务逻辑
MVVM = Model + View + ViewModel
V和VM做双向的数据绑定
- 对应技术:
View~HTML、CSS
ViewModel~JS、compiler
Model~EJB等
- 对应技术:
混合架构
企业内外有区别的场景,内部采用CS,外部采用BS
数据查改需求有区别的场景,查询用BS,修改用CS
RIA架构风格
- 了解几项技术:HTML5、Ajax
- 结合了CS反应速度快、交互性强的特点,以及BS传播范围广的特点,简化并改进BS的用户交互
- 典型场景:网页小游戏
SOA
基于服务的架构,服务的标准化程度更高,经典场景:历史遗留系统的集成
特点:松散耦合、粗粒度、标准接口、语言无关、WSDL接口
典型技术
Web Service
- 服务注册中心 + 服务提供者 + 服务请求者,Web Service 构建服务提供者和服务请求者之间的联系
ESB(企业服务总线)
- 把各个服务通过ESB连接起来
微服务
微服务架构提倡将单一应用程序划分成一组更小的服务,服务之间相互协调、配合,可以独立部署,松散耦合
优势:技术异构性,弹性可扩展,简化部署,与组织结果相匹配,可组合性强,对部件的替代性优化
劣势:复杂性高,运维成本高,服务间依赖测试复杂,服务间依赖管理较难
与SOA的对比:
MDA
模型驱动架构(Model Driven Architecture)
主要目标:可移植性、互通性、可重用性
使用模型完成软件的分析、设计、构件、部署、维护等开发活动,是一种形式化的开发方法,基于数学公理,不需要测试,正确性比较高,可移植性强
三个部分
平台无关模型(PIM)
- 独立于技术实现的,焗油膏抽象层次的模型
平台相关模型(PSM)
- 技术实现上用来描述系统的模型,由PSM映射而来
源代码(Code)
- 对系统的代码描述
ADL(架构描述语言)
三个基本要素
- 构件:计算或数据存储单元
- 连接件:用于构件之间交互建模的体系结构构造块及其支配这些交互的规则
- 架构配置:描述构件与连接件关系的连接图
DSSA(特定领域软件架构)
- 所谓的领域就是行业相关通用的东西,包括需求、设计、实现等
几个角色
领域专家
- 提供关于领域中系统的需求规约和实现的知识,可以是有经验的用户、工程师等
领域分析人员
- 有相关领域经验的分析员
领域设计人员
- 有经验的软件设计人员
领域实现人员
- 有经验的程序设计人员