大家好。今天总结一下系统架构设计的最后一部分知识点。
一、软件系统的质量属性
软件系统的质量属性
软件系统的质量属性可分为开发期质量属性和运行期质量属性2个部分。
1、开发期质量属性主要指在软件开发阶段所关注的质量属性,主要包含6个方面:
(1)易理解性:指设计被开发人员理解的难易程度。
(2)可扩展性:软件因适应新需求或需求变化而增加新功能的能力,也称为灵活性。
(3)可重用性:指重用软件系统或某一部分的难易程度。
(4)可测试性:对软件测试以证明其满足需求规范的难易程度。
(5)可维护性:当需要修改缺陷、增加功能、提高质量属性时,识别修改点并实施修改的难易程度。
(6)可移植性:将软件系统从一个运行环境转移到另一个不同的运行环境的难易程度。
2、运行期质量属性主要指在软件运行阶段所关注的质量属性,主要包含7个方面:
(1)性能:性能是指软件系统及时提供相应服务的能力,如速度、吞吐量和容量等的要求。
(2)安全性:指软件系统同时兼顾向合法用户提供服务,以及阻止非授权使用的能力。
(3)可伸缩性:指当用户数和数据量增加时,软件系统维持高服务质量的能力。例如,通过增加服务器来提高能力。
(4)互操作性:指本软件系统与其他系统交换数据和相互调用服务的难易程度。
(5)可靠性:软件系统在一定的时间内持续无故障运行的能力。
(6)可用性:指系统在一定时间内正常工作的时间所占的比例。可用性会受到系统错误,恶意攻击,高负载等问题的影响。
(7)鲁棒性:是指软件系统在非正常情况(如用户进行了非法操作、相关的软硬件系统发生了故障等)下仍能够正常运行的能力,也称健壮性或容错性。
质量属性场景
质量属性场景是一种面向特定质量属性的需求。它由6 部分组成:
刺激源(Source):这是某个生成该刺激的实体(人、计算机系统或者任何其他刺激器)。
刺激(Stimulus):该刺激是当刺激到达系统时需要考虑的条件。
环境(Environment):该刺激在某些条件内发生。当激励发生时,系统可能处于过载、运行或者其他情况。
制品(Artifact):某个制品被激励。这可能是整个系统,也可能是系统的一部分。
响应(Response):该响应是在激励到达后所采取的行动。
响应度量(Measurement):当响应发生时,应当能够以某种方式对其进行度量,以对需求进行测试可修改性质量属性场景描述实例。
二、软件架构评估
架构评估质量属性
性能:指系统的响应能力,即要经过多长时间才能对某个事件做出响应,或者在某段时间内系统所能处理的事件的个数。如响应时间、吞吐量。设计策略:优先级队列、增加计算资源、减少计算开销、引入并发机制、采用资源调度等。
可靠性:是软件系统在应用或系统错误面前,在意外或错误使用的情况下维持软件系统的功能特性的基本能力。如MTTF、MTBF、MTTR。设计策略:心跳、Ping/Echo、冗余、选举。
可用性:是系统能够正常运行的时间比例,经常用两次故障之间的时间长度或在出现故障时系统能够恢复正常的速度来表示。如故障间隔时间设计策略:心跳、Ping/Echo、冗余、选举。
安全性:是指系统在向合法用户提供服务的同时能够阻止非授权用户使用的企图或拒绝服务的能力。如保密性、完整性、不可抵赖性、可控性。设计策略:入侵检测、用户认证、用户授权、追踪审计。
可修改性:指能够快速的以较高的性能价格比对系统进行变更的能力。通常以某些具体的变更为基准,通过考察这些变更的代价衡量。设计策略:接口-实现分类、抽象、信息隐藏。
功能性:是系统所能完成所期望的工作的能力。一项任务的完成需要系统中许多或大多数构件的相互协作。
可变性:指体系结构经扩充或变更而成为新体系结构的能力。这种新体系结构应该符合预先定义的规则,在某些具体方面不同于原有的体系结构。当要将某个体系结构作为一系列相关产品的基础时,可变性是很重要的。
互操作性:作为系统组成部分的软件不是独立存在的,经常与其他系统或自身环境相互作用。为了支持互操作性,软件体系结构必须为外部可视的功能特性和数据结构提供精心设计的软件入口。程序和用其他编程语言编写的软件系统的交互作用就是互操作性的问题,也影响应用的软件体系结构。
架构评估概述
敏感点:是指为了实现某种特定的质量属性,一个或多个构件所具有的特性。
权衡点:是影响多个质量属性的特性,是多个质量属性的敏感点。
风险点与非风险点:不是以标准专业术语形式出现的,只是一个常规概念,即可能引起风险的因素,可称为风险点。某个做法如果有隐患,有可能导致一些问题,则为风险点;而如果某件事是可行的可接受的,则为非风险点。
软件架构评估在架构设计之后,系统设计之前,因此与设计、实现、测试都没有关系。评估的目的是为了评估所采用的架构是否能解决软件系统需求,但不是单纯的确定是否满足需求。
三种常见评估方式
基于调查问卷(检查表)的方式:类似于需求获取中的问卷调查方式,只不过是架构方面的问卷,要求评估人员对领域熟悉。
基于度量的方式:制定一些定量指标来度量架构,如代码行数等。要制定质量属性和度量结果之间的映射,要求评估人员对架构熟悉。
基于场景的方式:主要方法。首先要确定应用领域的功能和软件架构的结构之间的映射,然后要设计用于体现待评估质量属性的场景(即4+1视图中的场景),最后分析软件架构对场景的支持程度。要求评估人员既对领域熟悉,也对架构熟悉。从三个方面对场景进行设计:刺激(事件);环境(事件发生的环境);响应(架构响应刺激的过程)。
三种主要架构评估方法
基于场景的架构分析方法SAAM:是一种非功能质量属性的架构分析方法,是最早形成文档并得到广泛应用的软件架构分析方法。
特定目标:SAAM的目标是对描述应用程序属性的文档,验证基本的架构假设和原则。
质量属性:这一方法的基本特点是把任何形式的质量属性都具体化为场景,但可修改性是SAAM分析的主要质量属性。
架构描述:SAAM 用于架构的最后版本,但早于详细设计。架构的描述形式应当被所有参与者理解。
功能、结构和分配被定义为描述架构的3个主要方面。
方法活动:SAAM的主要输入是问题描述、需求声明和架构描述。下图描绘了SAAM分析活动的相关输入及评估过程。包括5个步骤,即场景开发、架构描述、单个场景评估、场景交互和总体评估。
架构权衡分析法ATAM:让架构师明确如何权衡多个质量目标,参与者有评估小组、项目决策者和其他项目相关人。
ATAM被分为四个主要的活动领域分别是场景和需求收集、体系结构视图和场景实现、属性模型构造和分析、折中。整个评估过程强调以属性作为架构评估的核心概念。主要针对性能可用性、安全性和可修改性,在系统开发之前,对这些质量属性进行评价和折中。
成本效益分析法CBAM:用来对架构建立的成本来进行设计和建,让决策者根据投资收益率来选择合适的架构,可以看做对ATAM的补充,在ATAM确定质量合理的基础上,再对效益进行分析。有下列步骤:
1、整理场景(确定场景,并确定优先级,选择三分之一优先级最高的场景进行分析)。
2、对场景进行细化(对每个场景详细分析,确定最好、最坏的情况)。
3、确定场景的优先级(项目干系人对场景投票,根据投票结果确定优先级)。
4、分配效用(对场景响应级别确定效用表,建立策略、场景、响应级别的表格)。
5、形成“策略-场景-响应级别的对应关系”。
6、确定期望的质量属性响应级别的效用(根据效用表确定所对应的具体场景的效用表)。
7、计算各架构策略的总收益。
8、根据受成本限制影响的投资报酬率选择架构策略(估算成本,用上一步的收益减去成本,得出收益,并选择收益最高的架构策略)。
例题:
答案:B、D、C、C、B、A
答案:C、A、C、D、A、D、C
其他架构评估方法(了解)
SAEM方法:将软件架构看作一个最终产品以及设计过程中的一个中间产品,从外部质量属性和内部质量属性两个角度来阐述它的评估模型,旨在为软件架构的质量评估创建一个基础框架。
外部属性指用户定义的质量属性,而内部属性指开发者决定的质量属性。该软件架构评估模型包含以下几个流程:
(1)对待评估的质量届性进行规约建模。
(2)为外部和内部的质量属性创建度量准则,先从评估目的(如软件架构比较、最终产品的质量预测),评估角度(如开发者、用户、维护者),评估环境(架构作为最终产品或设计中间产品)出发来定义架构评估的目标,再根据目标相关的属性来提出问题,然后回答每个问题并提出相应的度量准则。
(3)评估质量属性,包括数据收集、度量和结果分析3个活动。
SAABNet方法:是一种用来表达和使用定性知识以辅助架构的定性评估。该方法来源于人工智能允许不确定、不完整知识的推理。该方法使用BBN来表示和使用开发过程中的知识,包含定性和定量的描述,其中定性的描述是所有结点的图,定量的描述是每个结点状态相关的条件概率。其中的变量可分为3类,即架构质量属性变量(如可维护性、灵活性等)、质量属性的度量准则变量(如容错性、响应性等)和架构特征变量(如继承深度、编程语言等),高层抽象的质量属性变量分解为低层抽象的度量准则变量,度量准则变量则分解为更低层抽象的架构特征变量。
SACMM方法:是一种软件架构修改的度量方法。
SASAM方法:通过对预期架构(架构设计阶段的相关描述材料)和实际架构J(源代码中执行的架构)进行映射和比较来静态地评估软件架构。
ALRRA方法:是一种软件架构可靠性风险评估方法,该方法使用动态复杂度准则和动态耦合度准则来定义组件和连接件的复杂性因素,其中,动态复杂度准则在某个场景的执行中分析组件的动态行为来度量组件的复杂性,动态耦合度准则在某个场景的执行中分析连接件的消息传递协议来度量连接件的复杂性。利用失效模式和影响分析(FMEA)技术。
AHP(层次分析法)方法:是对定性问题进行定量分析的一种简便、灵活而又实用的多准则决策方法。AHP方法的特点是把复杂问题中的各种因素通过划分为相联系的有席层次使之条理化,并在一般情况下通过两两对比,根据一定客观现实的主观判断结构,把专家意见和分析者的客观判断结果直接、有效地结合起来,将一定层次上元素的某些重要性进行定量描述,之后利用数学方法计算反映每一层次元素的相对重要性次序的权值,并最后通过所有层次之间的总排序计算所有元素的相对权重及对权重进行排序。
COSMIC+UML方法:基于度量模型来评估软件架构可维护性的方法。针对不同表达方式的软件架构,采用统一的软件度量COSMIC方法来进行度量和评估。该方法主要是为了辅助分析软件架构的演化方案是否可行,并在开源软件DCMMS的软件架构UML组件图上得以验证。
三、中间件技术
中间件:在一个分布式系统环境中处于操作系统和应用程序之间的软件,可以在不同的技术之间共享资源,将不同的操作系统、数据库、异构的网络环境以及若干应用结合成一个有机的协同工作整体。
中间件位于客户机/服务器的操作系统之上,管理计算机资源和网络通信,有如下特点:
(1)中间件是一类软件,而非一种软件。
(2)中间件不仅仅实现互连,还要实现应用之间的互操作。
(3)中间件是基于分布式处理的软件,最突出的特点是其网络通信功能。
中间件的任务是使应用程序开发变得更容易通过提供统一的程序抽象,隐藏异构系统和分布式系统下低级别编程的复杂度。
主要的中间件有五类:
数据库访问中间件:通过一个抽象层访问数据库,从而允许使用相同或相似的代码访问不同的数据库资源。典型的技术如windows平台的ODBC和Java平台的JDBC等。
远程过程调用(RPC):是一种广泛使用的分布式应用程序处理方法。一个应用程序使用RPC来“远程”执行一个位于不同地址空间内的过程,从效果上看和执行本地调用相同。
面向消息中间件(MOM):利用高效可靠的消息传递机制进行平台无关的数据交流,并可基于数据通信进行分布系统的集成。通过提供消息传递和消息排队模型,可在分布环境下扩展进程间的通信,并支持多种通信协议、语言、应用程序、硬件和软件平台。典型的产品如IBM的MQSeries。
分布式对象中间件:随着对象技术与分布式计算技术的发展,两者相互结合形成了分布式对象技术,并发展成为当今软件技术的主流方向。典型的产品如OMG的CORBA.Sun的RMI/EJB、Microsoft的DCOM等。
事务中间件:也称事务处理监控器(TPM)最早出现在大型机上。事务处理监控程序位于客户和服务器之间,完成事务管理与协调、负载平衡、失效恢复等任务,提高系统的整体性能。
四、典型应用架构
J2EE核心技术
J2EE平台采用了多层分布式应用程序模型,实现不同逻辑功能的应用程序被封装到不同的构件中,处于不同层次的构件被分别部署到不同的机器中。四层结构:
客户层组件:J2EE应用程序可以是基于web方式的也可以是基于传统方式的静态的HTML(标准通用标记语言下的一个应用)页面和Applets是客户层组件。
web 层组件:J2EEweb层组件可以是JSP 页面或Servlet。
业务层组件:业务层代码的逻辑用来满足特定领域的业务逻辑处理。
信息系统层:企业信息系统层处理企业信息系统软件包括企业基础建设系统例如企业资源计划(ERP),大型机事务处理,数据库系统,和其它的遗留信息系统。例如,J2EE 应用组件可能为了数据库连接需要访问企业信息系统。
JSP+Servlet+JavaBean+DAO
**JSP:**用于显示、收集数据的部分。作为MVC中的视图V。
Servlet:作为业务逻辑层,用于处理复杂的业务逻辑,如验证数据、实例化JavaBean、调用DAO连接数据库等。作为MVC中的控制器C,在其中会调用Service方法处理服务。
JavaBean:用于数据的封装,方便将查询结果在servlet与jsp页面之间进行传递等。
DAO:用于连接数据库及进行数据库的操作如:查询、删除、更改等。DAO与JavaBean合在一起为MVC中的模型M。
基本流程:JSP发一个数据到servlet,serviet收到后做下解析再根据数据调用相应的service去服务,service如果有要调用数据库就通过DA0跟数据库交互,使用javaBean完成封装,返回结果给servlet,servlet再返回给JSP。
重量级与轻量级之争
重量级框架占用资源过多,在开发的过程中效率很低,大部分时间花在配置、运行的过程上修改复杂;单元测试也比较麻烦。但在大量运行过程中会表现出优异的效果,也即开发麻烦,运行性能高。轻量级框架提高了开发的速度,立即可以看到结果;做单元测试非常简单,大量线程可供参考的开源代码。开发简单,但运行性能低。
.NET平台
.NET框架处于操作系统和.NET应用语言之间,只适用于微软系统,而J2EE支持跨平台,任何安装了JVM的平台。
.NET和J2EE之争
1、JM(将所有JAVA代码都编译为字节码,由IM解释执行)和CLR(.NET核心技术,类似于JM生成中间代码CLR,编译执行)。
2、对多层分布式应用的支持,二者都支持多层分布式应用程序的开发:在表示层的平台支持上J2EE客户端支持多个平台,.NET只能在微软系统上运行,也正是因此,.NET会对微软系统上的应用进行优化,在业务层,J2EE占优势,因为有许多开源的项目和代码供参考,开发就变得简单;在数据层,二者都支持多种数据库,都非常优秀。
3、安全性,由于JAVA在,NET之后出来,借鉴了.NET优点,JAVA在运行时动态验证,.NET是静态全面验证,二者都非常优秀,不分上下。
4、应用程序的部署,J2EE的部署相对来说较复杂,针对不同的系统要特别布置。可移植性,显然J2EE占优势,一次开发,到处运行。
5、外部支持:J2EE占优势,得到了很多厂家的支持,.NET只是微软一家。
好了,今天就总结到这里了。大家一定要多准备准备这块内容。
追光的人,终将光芒万丈。加油!
最后依旧是请希望大家能给作者点个关注,谢谢大家!各位老板有钱的捧个人场,没钱的也捧个人场,谢谢各位老板!