软件架构设计
一、软件架构的概念⭐⭐⭐
1、软件架构的概念
需求分析-----------架构------------软件设计
(鸿沟)
体系结构==架构
架构设计就是需求分配,即是将满足需求的职责分配到组件上。
2、软件架构建模
- 结构模型:以架构的构件、连接件和其他概念来刻画结构
- 框架模型:不太侧重描述结构的细节而更侧重于整体的结构
- 动态模型:系统的“大颗粒”的行为性质
- 过程模型:构建系统的步骤和过程
- 功能模型:由一组功能构件按层次组成,下层向上层提供服务
二、软件架构风格⭐⭐⭐⭐⭐
- 架构设计的一个核心问题是能否达到架构级的软件复用
- 架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个构件有效地组织成一个完整的系统
- 架构风格定义了用于描述系统的术语表和一组指导构建系统的规则
- 数据流风格:批处理序列、管道-过滤器
- 调用/返回风格:主程序/子程序、面向对象、层次结构
- 独立构件风格:进程通信、事件驱动系统(隐式调用)
- 虚拟机风格:解释器、基于规则的系统
- 仓库风格:数据库系统、超文本系统、黑板系统
1、数据流风格
批处理序列
- 构件为一系列固定顺序的计算单元,构件之间只通过数据传递交互。每个处理步骤是一个独立的程序,每一步必须在其前一步结束后才能开始,数据必须是完整的,以整体的方式传递。
管道--过滤器
- 每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。这个过程通常是通过对输入数据流的变换或计算来完成的,包括通过计算和增加信息以丰富数据,通过浓缩和删除以精简数据、通过改变记录方式以转化数据和递增地转化数据等。这里的构件称为过滤器,连接件就是数据流传输的管道,将一个过滤器的输出传到另一个过滤器的输入。
早期编译器就是采用的这种架构。要一步一步处理的,均可考虑采用此架构风格。
2、调用/返回风格
主程序/子程序
- 单线程控制,把问题划分为若干个处理步骤,构件即为主程序和子程序,子程序通常可合成为模块。过程调用作为交互机制,即充当连接件的角色。调用关系具有层次性,其语义逻辑表现为主程序的正确性取决于它调用的子程序的正确性。
面向对象
- 构件是对象,对象是抽象数据类型的实例。在抽象数据类型中,数据的表示和它们的相应操作被封装起来,对象的行为体现在其接受和请求的动作。连接件即是对象间交互的方式,对象是通过函数和过程的调用来交互的
层次结构
- 构件组织成一个层次结构,连接件通过决定层间如何交互的协议来定义。每层为上一层提供服务,使用下一层的服务,只能见到与自己邻接的层。通过层次结构,可以将大的问题分解为若干个渐进的小问题逐步解决,可以影藏问题的复杂度。修改某一层,最多影响其相邻的两层(通常只能影响上层)
3、独立构件风格
进程通信
- 构件是独立的过程,连接件是消息传递。构件通常是命名过程,消息传递的方式。可以是点对点、异步或同步方式,以远程过程(方法)调用等。
事件驱动系统(隐式调用)
- 构件不直接调用一个过程,而是触发或广播一个或多个事件。构件中的过程在一个或多个事件中注册,当某个事件被触发时,系统自动调用在这个事件中注册的所有过程。一个事件的触发就导致了另个一模块中的过程调用。这种风格中的构件是匿名的过程,它们之间交互的连接件往往是以过程之间的隐式调用来实现的。主要优点是为了软件复用提供了强大的支持,为构件的维护和演化带来了方便;其缺点是构件放弃了对系统计算的控制。
4、仓库风格(以数据为中心的风格)
仓库风格中构件分两种:一种是中央数据结构,保存系统的当前状态;另一种是独立构件,对中央数据存储进行操作。
数据库系统
黑板系统
- 包括知识源、黑板和控制三部分。知识源包括若干独立计算的不同单元,提供解决问题的知识。知识源响应黑板的变化,也只修改黑板:黑板是一个全局数据库,包含问题域解空间的全部状态,是知识源相互作用的唯一媒介;知识源响应是通过黑板状态的变化来控制的。黑板系统通常应用在对于解决问题没有确定性算法的软件中(信号处理、问题规划和编译器优化等)
超文本系统
- 构件以网状链接方式相互连接,用户可以在构件之间进行按照人类的联想思维方式任意跳转到相关构件。超文本是一种非线性的网状信息组织方法,它以结点为基本单位,链作为结点之间的联想式关联。超文本系统通常应用在互联网领域。
- 现代集成编译环境一般采用这种架构风格。
5、闭环控制架构(过程控制)
当软件被用来操作一个物理系统时,软件与硬件之间可以粗略地表示为一个反馈循环,这个反馈循环通过接受一定的输入,确定一系列的输出,最终使环境达到一个新的状态。适合于嵌入式系统,涉及连续的动作与状态。
6、C2风格
C2是一种并行构件网络。如下所示:
C2架构的基本规则:
- 构件和连接件都有一个顶部和一个底部。
- 构件的顶部要连接到连接件的底部,构件的底部要连接到连接件的顶部,构件之间不允许直连。
- 一个连接件可以和任意数量的其他构件和连接件连接
- 当两个连接件进行直连时,必须由其中一个的底部到另一个的顶部。
7、层次架构风格
- 两层C/S架构
- 三层C/S架构
- 三层B/S架构
- 层次架构风格
8、MVC架构风格
Model(模型)是应用程序中用于处理数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
J2EE体系结构中:
视图(View):JSP
控制(Controller):Servlet
模型(Model):Entity Bean、Session Bean
9、MVVM架构风格
10、富互联网应用(RIA)
- RIA结合了C/S架构,反应速度快、交互性强的优点,以及B/S架构传播范围广及容易传播的特性
- RIA简化并改进了B/S架构的用户交互
- 数据能够被缓存在客户端,从而可以实现一个比基于HTML的响应速度更快且数据往返于服务器的次数更少的用户界面
11、基于服务的架构(SOA)
服务是一种为了满足某项业务需求的操作、规则等的逻辑组合,它包含一系列有序活动的交互,为实现用户目标提供支持
SOA的实现方式
- Web Service
- ESB
- REST
SOA关键技术
SOAP,Simple Object Access Protocol,简单对象访问协议,简单的说就是用于访问网络服务的协议:它是基于XML的简易协议,可以使应用程序在HTTP之上进行信息交换。
SOAP是一种网络通信协议,用于网络上、不同平台、不同语言的应用程序间的通讯。
SOAP协议=HTTP协议+XML数据格式
11 、 微服务
微服务的优势
- 技术异构性
- 弹性
- 扩展
- 简化部署
- 与组织结构相匹配
- 可组合性
- 对可替代性的优化
微服务面临的挑战
- 分布式系统的复杂度
- 运维成本
- 部署自动化
- DevOps与组织结构
- 服务间依赖测试
- 服务间依赖管理
微服务与SOA
12、MDA
三、架构描述语言ADL⭐⭐⭐
ADL是一种形式化语言,它在底层语义模型的支持下,为软件系统的概念体系结构建模提供了具体语法和概念框架。基于底层语义的工具为体系结构的表示、分析、演化、设计过程等提供支持。
ADL的三个基本元素
- 构件:计算或数据存储单元
- 连接件:用于构件之间交互建模的体系结构构造块及其支配这些交互的规则
- 架构配件:描述体系结构的构件与连接件的连接图
主要的架构描述语言
- Aesop:支持体系结构风格的应用
- MetaH:为设计者提供了关于实时电子控制软件系统的设计指导
- C2:支持基于消息传递风格的用户界面系统的描述
- Rapide:支持体系结构设计的模拟并提供了分析模拟结果的工具
- SADL:提供了关于体系结构加细的形式化基础
- Unicon:支持异构的构件和连接类型并提供了关于体系结构的高层编译器
- Wright:支持体系结构构件之间交互的说明和分析
四、特定领域软件架构⭐⭐⭐
基本活动
领域分析机制
建立过程
五、基于架构的软件开发⭐⭐⭐⭐
基于架构的软件设计
ABSD方法是架构驱动,即强调由业务、质量和功能需求的组合驱动架构设计。
使用ABSD方法,设计活动可以从项目总体功能框架明确就开始,这意味着需求获取和分析还没有完成(甚至远远没有完成),就开始了软件设计
ABSD方法有三个基础
- 功能的分解,ABSD方法使用已有的基于模块的内聚和耦合技术
- 选择架构风格来实现质量和业务需求
- 软件模板的使用,软件模板利用了一些软件系统的结构
ABSD方法是递归的,且迭代的每一个步骤都是清晰地定义的,因此,不管设计是否完成,架构总是清晰的,这有助于降低架构设计的随机性。
视角与视图:从不同的视角来检查所以会有不同的视图
用例用来捕获功能需求、特定场景来捕获质量需求
开发过程
六、软件质量属性⭐⭐⭐⭐⭐
质量属性
1、性能
性能(performance)是指系统的响应能力,即要经过多长时间才能对某个事件做出响应,或者在某段时间内系统所能处理的事件的个数。
代表参数:响应时间、吞吐量 设计策略:优先级队列、资源调度
2、可用性
可用性(availability)是系统能够正常运行的时间比例。经常用两次故障之间的时间长度或者在出现故障时系统能够恢复正常的速度来表示。
代表参数:故障间隔时间 设计策略:冗余、心跳线
3、安全性
安全性(security)是指系统在向合法用户提供服务的同时能够阻止非授权用户使用的企图或拒绝服务的能力。安全性又可以划分为机密性、完整性、不可否认性及可控性等特征。
设计策略:追踪审计
4、可修改性
可修改性(modifiability)是指能够快速地以较高的性能价格比对系统进行变更的能力。通常以某些具体的变更为基准,通过考察这些变更的代价衡量可修改性。
主要策略:信息隐藏
5、可靠性
可靠性(reliability)是软件系统在应用或系统错误面前,在意外或者错误使用的情况下维持软件系统的功能特性的基本能力。主要考虑两个方面:容错、健壮性。
代表参数:MTTF、MTBF 设计策略:冗余、心跳线
6、功能性
功能性(functionality)是系统所能完成所期望的工作的能力。一项任务的完成需要系统中许多或大多数构件的相互协作。
7、可变性
可变性(changeability)是指体系结构经扩充或变更而成为新体系结构的能力。这种新体系结构应该符合预先定义的规则,在某些具体方面不同于原有的体系结构。当要将某个体系结构作为一系列相关产品(列如,软件产品线)的基础时,可变性是很重要的。
8、互操作性
作为系统组成部分的软件不是独立存在的,经常与其他系统或自身环境相互作用。为了支持互操作性(interoperation),软件体系结构必须为外部可视的功能特性和数据结构提供精心设计的软件入口。程序和用其他编程语言编写的软件系统的交互作用就是互操作性的问题,这种互操作性也影响应用的软件体系结构。
七、软件架构评估⭐⭐⭐⭐⭐
基于场景的方式
- 确定应用领域的功能和软件架构的结构之间的映射
- 设计用于体现待评估质量属性的场景
- 分析软件架构对场景的支持程度
软件架构分析方法(SAAM)
架构权衡分析法(ATAM)
成本效益分析法(CBAM)
质量效用树
典型应用架构
J2EE-分布式多层应用程序
J2EE核心组成
容器:
Applet Container、Application Container、Web Container、EJB Container
组件:
Applet、Application、JSP/Servlet、EJB
服务:
HTTP(Hypertext Transfer Protocol):超文本传输协议
RMI-IIOP(remote method invocation ober the internet inter-ORB protocol):远程方法调用,融合了java RMI 和CORBA,在使用Application或Web端访问EJB端组件时使用
CORBA(Common object request broker architecture):公共对象请求代理体系结构
Java IDL(java interface definition language):java接口定义语言,用于访问外部的CORBA服务
JTA(java transaction API):用于进行事务处理操作的API
JDBC(Java Database Connectivity):为数据库操作提供的一组API
JMS(Java Massage Service):用于发送点对点消息的服务
JavaMail:用于发送邮件
JAF(Java Activation Framework):用于封装传递的邮件数据
JND(Java Naming and Directory Interface)
JAXP(Java API for XML Parsing):解析XML的API
JCA(J2EE Connector Architecture):Java 连接器构架
JAAS(Java Autherticati on and AUthorization Service)
JSF(Java Server Faces)
JSTL(JSP Standard Tag Library)
SAAJ(SOAP with Attachments API for JAVA)
JAXR(Java Api for XML Registries)
八、软件产品线⭐⭐⭐
九、构件与中间件技术⭐⭐⭐⭐
构件系统架构特性
、
构件的复用
中间件
中间件是一种独立的系统软件或服务程序,可以帮助分布式应用软件在不同的技术之间共享资源
中间件技术的优点:
- 面向需求
- 业务的分隔和包容性
- 设计与实现隔离
- 隔离复杂的系统资源
- 符合标准的交互模型
- 软件复用
- 提供对应用构件的管理
十、Web架构设计⭐⭐⭐⭐
架构:MVC MVP MVVM REST WEBSERVICE 微服务
缓存: MemCache Redis Squid
并发:集群(负载均衡) CDN
数据库:主从复制 内存数据库 反规范化技术 NoSQL 分区分表 视图与物化视图
持久化:Hibernate Mybatis
分布存储:Hadoop FastDFS 区块链
数据编码:XML JSON
WEB应用服务器:Apache WebSphere WebLogic Tomcat JBOSS IIS
其他:静态化 ,有状态与无状态 响应式web设计
负载均衡
基于特定软件的负责均衡(HTTP重定向)(应用层)
反向代理负载均衡(应用层)
基于DNS的负载均衡(传输层)
基于NAT的负载均衡(传输层)
混合型负载均衡
静态算法:轮转算法、加权轮转算法、源地址哈希散列算法、目标地址哈希散列算法、随机算法
动态算法:最小连接数算法、加权最小连接数算法、加权百分比算法
硬件负载均衡:F5
软件负载均衡:LVS nginx haproxy
负载均衡技术
应用负载均衡
1、http重定向,http重定向就是应用层的请求转发。用户的请求其实已经到了HTTP重定向负载均衡服务器,服务器根据算法要求用户重定向,用户收到重定向请求后,再次请求真正的集群。
特点:实现简单,但性能较差
2、反向代理服务器,在用户的请求到达反向代理服务器时(已经到达网站机房),由反向代理服务器根据算法转发到具体的服务器。常用的apache,nginx都可以充当反向代理服务器。
特点:部署简单,但代理服务器可能成为性能的瓶颈
传输层负载均衡
1、DNS域名解析负载均衡,DNS域名解析负载均衡就是在用户请求DNS服务器,获取域名对应的IP地址时,DNS服务器直接给出负载均衡后的服务器IP
特点:效率比HTTP重定向高,减少维护负载均衡服务器成本。但一个应用服务器故障,不能及时通知DNS,而且DNS负载均衡的控制权在域名服务器商那里,网站无法做更多的改善和更强大的管理
2、基于NAT的负载均衡,基于NAT的负载均衡将一个外部IP地址映射为多个IP地址,对每次连接请求动态地转换为一个内部节点的地址
特点:技术较为成熟,一般在网关位置,可以通过硬件实现。像四层交换机一般就采用了这种技术。
有状态和无状态
无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以冲外部获取到(比如说数据库),服务器本身不存储任何信息。
由状态服务(stateful service)则相反,它会在自身保存一些数据,先后的请求是有关联的。
数据库读写分离
用缓存缓解读库的压力
CDN(内容分发网络)
CDN的全称是Content Delivery Network, 即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快,更稳定。
WEB应用服务器
Apache:Web服务器,市场占有率达60%左右,它可以运行在几乎所有的UNIX,Windows, Linux系统平台上
IIS:早期web服务器,目前小规模站点仍有应用。
Tomcat:开源、运行servlet和JSP web应用软件的基于JAVA的web应用软件容器。
JBOSS:JBOSS是基于J2EE的开源的应用服务器。一般与Tomca或Jetty绑定使用。
Weblogic: BEA weblogic server 是一种多功能,基于标准的web应用服务器,为企业构建自己的应用提供了坚实的基础。
Jetty:Jetty是一个开源的servlet容器,它为基于Java的web容器。