软件体系结构期末总结

第一章 软件体系结构的起源与背景

1、软件危机

软件危机(software Crisis)是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致计算机软件的开发和维护过程中遇到的一系列严重的问题。其主要表现为软件成本日益增长、开发进度难以控制、软件质量差、软件维护困难等。

2、软件工程一般包括以下三要素:

  • 方法:为软件开发提供了“如何做”的技术,是完成软件工程项目的技术手段
  • 工具:是人类在开发软件的活动中智力和体力的扩展和延伸,为软件工程方法提供了自动的或半自动的软件支撑环境
  • 过程:是将软件工程的方法和工具综合起来以达到合理、及时地进行软件开发的目的。

3、RUP的三大特点

  • 软件开发是一个迭代的过程
  • 软件开发是有Use Case驱动的
  • 软件开发是以架构设计为中心的

4、软件体系结构

  • 软件体系结构是软件工程的一个分支,主要解决如何架构软件并保障软件质量的一门学科
  • 软件工程>软件体系结构

5、现存软件复用的层次

  • API 级别的复用,数据库的复用
  • 软件构件的复用
  • 服务的复用
  • 框架的复用
  • 体系结构的复用
复用层次代码实例
API 级别的复用API级别是最细粒度,也是最常见、通用的方式。事实上构件、服务从调用形式上也属于API调用
System.out.println();
Thread thr = new Thread(){new …};
软件构件的复用此组件是一些基础功能API的集合,该组件具备一定领域的内涵,在一定领域内通用。
Comp comp = getComp() comp.dosomthing1() comp.dosomthing2()
软件构件可以体现为可视化形态,可在软件中拖拽使用
服务的复用服务可以理解为具有一定完整软件功能的构件,例如天气预报服务。一般该服务是远程服务,典型的可利用SOAP/RESTful进行调用
Service s = GetService()
Service.function()
框架的复用框架为应用开发提供了强制的规范,并在该规范下保障应用正常运行。典型框架如J2EE框架、Spring框架、复合的SSH框架等。
以SSH框架为例,用户在使用框架进行复用时,框架规范了存储使用hibernate,在表示层可以使用Structs,并区分了Model、Controller、View的实现。用户只需按照相关框架进行开发即可达到快速开发的效果
体系结构的复用体系结构的复用则比框架的复用更为上层及抽象,一般体系结构的复用考虑了整个系统的设计包含功能、非功能因素,试图借鉴历史的架构,从架构层面进行复用,从而达到系统层面的设计理念复用,以及代码层面的高质量复用。
从典型的例子上来看,软件产品线的诞生是体系结构复用的一个很好的例子

第二章 软件体系结构建模

1、建模的目的

软件体系结构的建模不仅存在于复杂的软件系统,在简单的软件中也存在着软件体系结构建模

2、两种类型的建模方式

  • 图形化的方式进行描述
  • 形式化描述

3、软件体系结构“4+1”视图

  • 逻辑视图
  • 开发视图
  • 进程视图
  • 物理视图
  • 场景
视图类型描述形式
逻辑视图类图、用例图等
开发视图框架图、系统架构图
物理视图部署图
进程视图进程关系图、序列图、并发图
场景场景示意图或者文字

第三章 软件体系结构风格

1、软件体系结构风格

  • 经典风格
  • 现代风格

2、经典体系结构包括:

  • 管道过滤风格
  • 调用返回风格
  • 正交与分层风格
  • 共享数据风格

3、Java实现一个管道的例子

import java.io.*;
import java.nio.charset.StandardCharsets;

public class TestPiped {
    public static void main(String[] args) {
        Sender sender = new Sender();
        Recive recive = new Recive();
        PipedInputStream pi = recive.getPipedInputStream();
        PipedOutputStream po = sender.getPipedOutputStream();
        try{
            pi.connect(po);
        }catch (IOException e){
            System.out.println(e.getMessage());
        }
        sender.start();
        recive.start();
    }
}
class Sender extends Thread{
    PipedOutputStream out = null;
    public PipedOutputStream getPipedOutputStream(){
        out = new PipedOutputStream();
        return out;
    }

    public void run(){
        try {
            out.write("Hello,Reciver!".getBytes());
        }catch (IOException e){
            System.out.println(e.getMessage());
        }
    }
}

class Recive extends Thread{
    PipedInputStream in = null;

    public PipedInputStream getPipedInputStream() {
        in = new PipedInputStream();
        return in;
    }
    public void run(){
        byte[] bys = new byte[1024];
        try {
            in.read(bys);
            System.out.println("读取到的信息:" + new String(bys).trim());
            in.close();
        }catch (IOException e){
            System.out.println(e.getMessage());
        }
    }
    
}

4、正交与分层风格

正交软件体系结构包括层和线索两个部分

  • 层是由一组具有相同抽象级别的构件构成的。在同一层中的构件之间不存在相互调用关系的,即正交指的是同一个层次内部的正交
  • 线索是某个功能的调用链,也可以说是子系统的特例。

第四章 质量属性

1、质量属性

  • 可用性公式:A= MTTF/(MTTF+MTTR)*100%,MTTF+MTTR=MTBF(Mean Time Between Failure)
  • 可靠性
    可靠性的量化指标是周期内系统平均无故障运行时间
  • 性能
  • 安全性
  • 可修改性
  • 易用性

2、性能举例

1、事务
2、请求响应时间
(1)在3秒钟之内,页面给予用户响应并有所显示,可认为是“很不错的”
(2)在3~5秒钟内,页面给予用户响应并有所显示,可认为是“好的”
(3)在5~10秒内,页面给予用户响应并有所显示,可认为是“勉强接受的”
(4)超过10秒以上让人有点不耐烦了,用户很可能不会继续等待下去

3、事务响应时间
4、并发用户数:所有的用户在同一时刻做同一件事情或者操作,这种操作一般指做同一类型的业务

  • 两种错误观点:
    (1)错误观点是并发用户数量理解为使用系统的全部用户数量,理由是这些用户同时使用系统
    (2)还有一种比较接近正确观点是把在线用户数量理解为并发用户数量,实际上在线用户也不一定会和其他用户发生并发。
  • 在线用户数量是计算并发用户数量的主要依据之一。
    5、吞吐量
    6、TPS
    7、点击率
    8、资源利用率

第五章 质量属性场景及性能战术

1、质量属性场景的定义

  • 质量属性场景,采用场景的方法将质量属性涉及、关注的内容进行分析和挖掘。
  • 经典的质量属性场景包括刺激源(Source)、刺激(Stimulus)、环境(Environment)、制品(Artifact)、响应(Response)、响应度量(Response Measure)

在这里插入图片描述

2、质量属性战术

  • 一般的性能战术可以分为资源需求类战术、资源管理类战术、资源仲裁类战术

3、资源需求类战术

  • 降低事件频度
  • 降低单个事件的处理资源的方法
  • 控制资源使用的方法

4、资源管理类战术

单线程处理伪代码
while(true){
   通过serverSocket监听连接,获取socket
   使用socket来进行接收数据、发送数据...
}
不采用并行的实例代码
public class socketServer {
    public static int PORT = 8080 ;

    public static void main(String[] args) {
        ServerSocket s = new ServerSocket(PORT);
        //阻塞,直到客户端请求
        Socket socket = s.accept();
        /*
        * 与客户端进行交互
        * */
        s.close();
        socket.close();
    }
}
多线程的一般处理机制
while(true){
  通过serverSocket监听连接,获取socket
  建立线程,将socket传递给线程,在线程中进行数据的传输
  }  
采用并行处理的示例代码
public class socketServer {
    public static int PORT = 8080;

    public static void main(String[] args) {
        ServerSocket s = new ServerSocket(PORT);
        while(true){
            Socket socket = s.accept();
            //若接收到客户端请求,则新建线程
            new Thread(new DealingSocket(socket)).start();
        }
    }
    
    /*处理socket线程*/
    static class DealingSocket implements Runnable{
        private Socket socket;
        public DealingSocket(Socket socket){
            this.socket = socket;
        }
        
        public void run(){
            try {
                /*
                * 处理客户端请求
                * */
                socket.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
一个标准轮询算法
 j = i ;
 do{
    j = ( j + 1 ) mod n ;
    if(W(Sj) > 0 ){
          i = j ;
          return Si ;
   }
 }while( j != i );
 return NULL;
加权轮询算法
while(true){
   i = ( i + 1 ) mod n ;
   if( cw <= 0 ){
      cw = max(S);
      if( cw == 0 )
         return NULL;
      }
   }if( W(Si) >= cw )
      return Si;
}

第六章 可用性的质量属性场景及战术

1、可用性的关注点

代码由于人为因素写错了或者考虑不周全,成为了错误。有错误的软件存在一定缺陷,该缺陷在某种情况下可以转化为故障。
错误是最原始的驱动力,一个错误不一定导致故障,因此错误不见得被人们察觉。但是,一旦错误变为故障,人们是可以通过软件的外在表现而察觉。故障是系统出错后导致系统不正常工作的结果,故障从某种意义上来说属于现象。即通过故障这种现象,人们可以知道软件存在BUG,最终找到相关错误点,并对错误代码进行修复。
错误<故障<BUG

2、可用性的场景

在这里插入图片描述

3、可用性战术

  • 可用性战术的目的是为了提升系统可用性,通过战术阻止错误发展为故障,或者至少可以将故障控制在可管理的范畴之内,并使恢复成为可能。

4、可用性战术根据目的分类:

  • 错误检测(Fault Detection)
  • 错误恢复(Fault Recovery)
  • 错误预防(Fault Prevention)

5、主动冗余的优缺点

  • 优点体现为切换时间非常短,数据和计算都热备份
  • 缺点是资源消耗成倍增加

第七章 可修改性的质量属性场景及战术

1、可修改性的概念

可修改性就是保障系统进行快速、可靠的变化

2、可修改性关注点

  • 可修改性主要衡量变更需求对系统代价的影响。修改代价越大可修改性越差,反之可修改性越好。

3、可修改性的一般场景

在这里插入图片描述

4、可修改性战术分类

  • 局部化修改(Localize modifications):在设计期间为模块分配责任,用以把预期的变更限制在一定的范围之内
  • 防止连锁反应(Prevent ripple effects):防止对某一个模块的修改间接地影响到其他模块
  • 推迟绑定时间(Defer binding time):推迟决策时间,用于在系统编译、加载和运行过程中进行修改

5、工厂模式

简单工厂、工厂方法、抽象工厂
简单工厂

简单工厂



工厂方法类图

工厂方法类图

抽象工厂类图

抽象工厂类图

推迟绑定时间战术

本类战术用于降低在编译、运行和加载时更改所影响的模块数目

  • 运行时注册(Runtime registration)
  • 配置文件(Configuration files)
  • 多态(Polymorphism)
  • 依赖反转(IoC)
  • 组件更换(Component replacement)
  • 遵守已定义的协议(Adherence to defined protocols)
  • 面向切面编程(AOP)

第八章 分析与设计软件体系结构

1、软件分析方法

  • 白盒分析方法:白盒分析方法,即在获得软件相关文档的前提下进行分析
  • 黑盒分析方法:黑盒分析方法,则是在没有任何文档的支持下进行软件分析,黑盒的最高境界是逆向工程

第九章 软件体系结构描述语言

1、ACME

  • ACME作为一种来描述系统体系结构的语言,目标是提供了一些方法、模型用于描述系统级结构和大粒度成分的行为,其描述的层次甚至可以抽象到“实现级别”的细节
  • ACME提供了一种正式或半正式的结构描述方法,通过增加相应额外的语义注释,更好地描述体系结构内部的特征。
  • 它不仅描述相关的静态结构,它也可以描述相关的动态行为。

2、Wright

  • Wright语言提供了针对软件体系的描述功能,同样Wright也是基于组件-连接器等形式对系统进行描述
  • Wright直接基于CPS的描述语言
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值