系统架构设计师【第10章】: 软件架构的演化和维护 (核心总结)

文章目录

    • 10.1 软件架构演化和定义的关系
      • 10.1.1 演化的重要性
      • 10.1.2 演化和定义的关系
    • 10.2 面向对象软件架构演化过程
      • 10.2.1 对象演化
      • 10.2.2 消息演化
      • 10.2.3 复合片段演化
      • 10.2.4 约束演化
    • 10.3 软件架构演化方式的分类
      • 10.3.1 软件架构演化时期
      • 10.3.2 软件架构静态演化
      • 10.3.3 软件架构动态演化
    • 10.4 软件架构演化原则
    • 10.5 软件架构演化评估方法
      • 10.5.1 演化过程已知的评估
      • 10.5.2 演化过程未知的评估
    • 10.6 大型网站系统架构演化实例
      • 10.6.1 第一阶段:单体架构
      • 10.6.2 第二阶段:垂直架构
      • 10.6.3 第三阶段:使用缓存改善网站性能
      • 10.6.4 第四阶段:使用服务集群改善网站并发处理能力
      • 10.6.5 第五阶段:数据库读写分离
      • 10.6.6 第六阶段:使用反向代理和CDN 加速网站响应
      • 10.6.7 第七阶段:使用分布式文件系统和分布式数据库系统
      • 10.6.8 第八阶段:使用NoSQL和搜索引擎
      • 10.6.9 第九阶段:业务拆分
      • 10.6.10 第十阶段:分布式服务
    • 10.7 软件架构维护
      • 10.7.1 软件架构知识管理
      • 10.7.2 软件架构修改管理
      • 10.7.3 软件架构版本管理
      • 10.7.4 软件架构可维护性度量实践

10.1 软件架构演化和定义的关系

10.1.1 演化的重要性

人们通常说软件架构是演化来的,而不是设计来的。
(1) 保障软件系统具备诸多好的特性。
(2) 有效管控软件系统的整体复杂性和变化性,降低软件检修和修改成本。
(3) 保证软件系统演化的一致性和正确性,增加便捷性。

10.1.2 演化和定义的关系

软件架构包括 组件、连接件和约束 三大要素,此软件架构演化主要关注组件、连接件和约束的
添加、修改和删除。

10.2 面向对象软件架构演化过程

10.2.1 对象演化

对架构设计的动态行为产生影响的演化包括 Add Object(AO)Delete Object(DO)

  • (1) AO 是在系统需要添加新的对象来实现某种新的功能,或需将现有对象的某个功能独立
    以增加架构灵活性时发生。
  • (2) DO 是在系统需要移除某个现有的功能,或需合并某些对象及其功能来降低架构的复杂
    度的时候发生。

10.2.2 消息演化

消息演化包括 Add Message(AM)Delete Message(DM)Swap Message Order(SMO)Overturn Message(OM)Change Message Module(CMM)

  • (1)AM: 增添一条新的消息,产生在对象之间需要增加新的交互行为的时候。
  • (2)DM: 删除当前的一条消息,产生在需要移除某交互行为的时候。
  • (3)SMO: 交换两条消息的时间顺序,发生在需要改变两个交互行为之间的时候。
  • (4)OM: 反转消息的发送对象与接收对象,发生在需要修改某个交互行为本身的时候。
  • (5)CMM: 改变消息的发送或接收对象,发生在需要修改某个交互行为本身的时候。

10.2.3 复合片段演化

复合片断的演化包括 Add Fragment(AF)Delete Fragment(DF)Fragment Type Change (FTC)Fragment Condition Change(FCC)

  • (1) AF: 在某几条消息上新增复合片段,发生在需要增添新的控制流时。
  • (2) DF: 删除某个现有的复合片段,发生在需要移除当前某段控制流时。
  • (3) FTC: 改变复合片段的类型,发生在需要改变某段控制流时。
  • (4) FCC: 改变复合片段内部执行的条件,发生在改变当前控制流的执行条件时。

10.2.4 约束演化

约束演化包括 Add Constraint(AC)Delete Constraint(DC)

  • (1) AC: 直接添加新的约束信息,需判断当前设计是否满足新添加的约束要求。
  • (2) DC: 直接移除某条约束信息,发生在去除某些不必要条件的时候。

10.3 软件架构演化方式的分类

三种比较典型的软件架构演化方式的分类,如图 :
在这里插入图片描述

10.3.1 软件架构演化时期

(1)设计时演化 (Design-Time Evolution): 发生在体系结构模型与之相关的代码编译之前。
(2)运行前演化 (Pre-Execution Evolution) : 发生在执行之前、编译之后。
(3)有限制运行时演化(Constrained Runtime Evolution): 只发生在某些特定约束满足时。
(4)运行时演化 (Runtime Evolution): 发生在运行时不能满足要求时。

10.3.2 软件架构静态演化

(1)静态演化需求: 设计时演化需求、运行前演化需求。

(2)静态演化的一般过程: 软件理解→需求变更分析→演化计划→系统重构→系统测试

(3)静态演化的原子演化操作。

  • 1)与可维护性相关的架构演化操作: AMD(Add Module Dependence)RMD(Remove Module Dependence)AMI(Add Module Interface)RMI(Remove Module Inferface)AM(Add Module)RM(Remove Module)SM(Split Module)AGM(Aggregate Modules)
  • 2)与可靠性相关的架构演化操作: AMS(Add Message)RMS(Remove Message)AO(Add Object)RO(Remove Object)AF(Add Fragment)RF(Remove Fragment)CF(Change Fragment)AU(Add Use Case)RU(Remove Use Case)AA(Add Actor)RA(Remove Actor)

10.3.3 软件架构动态演化

(1) 动态演化需求:
软件内部执行所导致的体系结构改变、软件系统外部的请求对软件进行 的重配置。

(2) 动态演化的类型

  • 1)软件动态性的等级:交互动态性、结构动态性、架构动态性。
  • 2)动态演化的内容:属性改名、行为变化、拓扑结构改变、风格变化。

(3) 动态软件架构(DSA)

  • 1)基于 DSA 实现动态演化的基本原理是运行时刻体系结构相关信息的改变可用来触发、驱动
    系统自身的动态调整。
  • 2)DSA 描述语言: 基于行为视角的 π-ADL、基于反射视角的 Pilar、基于协调视角的 LIME。
  • 3)DSA 演化工具: 使用反射机制、基于组件操作、基于 π 演算、利用外部的体系结构演化管
    理器

(4) 动态软件架构应用实例— PKUAS:
包括 容器系统、公共服务、工具和微内核 4 种类型。

(5)动态重配置

  • 1 ) 动态重配置模式:主从模式、中央控制模式、客户端/服务器模式、分布式控制模式。
  • 2 ) 例子:可重用、可配置的产品线架构。
  • 3 ) 动态配置难点:约束定义困难、性能约束难以静态衡量、难以管理所有方面、需同时保证组件系统完整性和重配置策略的正确和安全性。

10.4 软件架构演化原则

软件结构包括18 种可持续演化原则:

  • (1) 演化成本控制原则: 演化成本要控制在预期的范围之内。
  • (2) 进度可控原则: 架构演化要在预期的时间内完成。
  • (3) 风险可控原则: 架构演化中的经济风险、时间风险、人力风险、技术风险和环境风险在可控范围内。
  • (4) 主体维持原则: 软件演化的平均增量的增长须保持平稳,保证软件系统主体行为稳定。
  • (5) 系统总体结构优化原则: 使演化后的软件系统整体结构(布局)更加合理。
  • (6) 平滑演化原则: 软件的演化速率趋于稳定。
  • (7) 目标一致原则: 架构演化的阶段目标和最终目标要一致。
  • (8) 模块独立演化原则: 软件中各模块自身的演化最好相互独立。
  • (9) 影响可控原则: 如果一个模块发生变更,给其他模块带来的影响在可控范围内。
  • (10) 复杂性可控原则: 必须控制架构的复杂性,保障软件的复杂性在可控范围内。
  • (11) 有利于重构原则: 使演化后软件架构便于重构。
  • (12) 有利于重用原则: 演化最好能维持,甚至提高整体架构的可重用性。
  • (13) 设计原则遵循性原则: 架构演化最好不能与架构设计原则冲突。
  • (14) 适应新技术原则: 软件要独立于特定的技术手段,可运行于不同平台。
  • (15) 环境适应性原则: 架构演化后的软件版本比较容易适应新的硬件环境和软件环境。
  • (16) 标准依从性原则: 演化不违背相关质量标准(国际标准、国家标准、行业标准等)。
  • (17) 质量向好原则: 使所关注的某个质量指标或质量指标的综合效果变更好。
  • (18) 适应新需求原则: 很容易适应新的需求变更。

10.5 软件架构演化评估方法

10.5.1 演化过程已知的评估

评估流程: 将架构度量应用到演化过程中,通过对演化前后的不同版本的架构分别进行度量, 得到度量结果的差值及其变化趋势,并计算架构间质量属性距离,进而对相关质量属性进行评估。

10.5.2 演化过程未知的评估

演化过程未知时的架构演化评估过程示意图如下:
在这里插入图片描述

10.6 大型网站系统架构演化实例

10.6.1 第一阶段:单体架构

应用程序、数据库、文件等所有资源都在一台服务器上。

10.6.2 第二阶段:垂直架构

将应用和数据分离,整个网站使用 3 台服务器:应用服务器、文件服务器、数据服务器。

10.6.3 第三阶段:使用缓存改善网站性能

包括在应用服务器上的本地缓存和在专门的分布式缓存服务器上的远程缓存。

10.6.4 第四阶段:使用服务集群改善网站并发处理能力

通过负载均衡调度服务器,将来自用户浏览器的访问请求分发到应用服务器集群中的任何一台
服务器上,解决高并发、海量数据问题。

10.6.5 第五阶段:数据库读写分离

应用服务器在写数据时,访问主数据库,主服务器通过主从复制机制将数据更新同步到从服务
器。在应用服务器读数据时,访问从数据库。

10.6.6 第六阶段:使用反向代理和CDN 加速网站响应

CDN 和反向代理的基本原理都是 缓存

  • (1)CDN 部署在网络提供商的机房,用户在请求网站服务时,可在距离最近的网络提供商机
    房获取数据。
  • (2)反向代理部署在网站的中心机房,用户请求到达中心机房后,先访问反向代理服务器。

10.6.7 第七阶段:使用分布式文件系统和分布式数据库系统

进行业务分库,将不同业务的数据部署在不同的物理服务器上。

10.6.8 第八阶段:使用NoSQL和搜索引擎

使用 NoSQL 和搜索引擎。

10.6.9 第九阶段:业务拆分

将一个网站拆分成许多不同的应用,每个应用独立部署。

10.6.10 第十阶段:分布式服务

分布式服务。

10.7 软件架构维护

软件架构维护过程包括 软件架构知识管理、软件架构修改管理、软件架构版本管理 等。

10.7.1 软件架构知识管理

架构知识的定义: 架构知识=架构设计+架构设计决策

架构知识管理的含义: 侧重于软件开发和实现过程所涉及的架构静态演化,在架构文档等信息来源中捕捉架构知识,提供架构的质量属性及其设计依据进行记录和评价。

架构知识管理的需求: 防止关键的设计知识“沉没”在软件架构中。

10.7.2 软件架构修改管理

主要是建立一个隔离区域,保障该区域中任何修改对其他部分影响最小。

10.7.3 软件架构版本管理

为软件架构演化的版本演化控制、使用和评价提供可靠依据。

10.7.4 软件架构可维护性度量实践

架构可维护性的 6 个度量指标: 圈复杂度(CNN)、扇入扇出度(FFC)、模块间耦合度(CBO)、 模块的响应(RFC)、紧内聚度(TCC)、松内聚度(LCC)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eNSP学习——连接RIP与OSPF网络

目录 相关主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建RIP和OSPF网络 3、配置双向路由引入 4、手工配置引入时的开销值 相关主要命令 [R1-ospf-1]import-route rip 1 //引入RIP路由 [R1-rip-1]import-route ospf 1 …

【计算机毕业设计】353微信小程序零食批发交易管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

微信小程序毕业设计-校园服务平台系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

RabbitMQ二、RabbitMQ的六种模式

一、RabbitMQ的六种模式 RabbitMQ共有六种工作模式: 简单模式(Simple)工作队列模式(Work Queue)发布订阅模式(Publish/Subscribe)路由模式(Routing)通配符模式&#xff…

代码随想录算法训练营第四十六天 | 完全背包理论基础、518. 零钱兑换 II、377. 组合总和 Ⅳ

完全背包理论基础 视频讲解: https://www.bilibili.com/video/BV1uK411o7c9 https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.html 完全和01背包的区别: …

通俗易懂->哈希表详解

目录 一、什么是哈希表? 1.1哈希表长什么样? 1.2为什么会有哈希表? 1.3哈希表的特点 1.3.1 取余法、线性探测 1.3.2 映射 1.3.3负载因子 1.4哈希桶 1.5闲散列与开散列 1.6总结 二、设计hash表 1、哈希表的设计 1)插入…

Nginx实战:日志打印自定义请求头

nginx的日志可以打印很多内容,但是有时候自定义的请求头该怎么打印呢?像下面这种场景: 其实很简单,设置日志打印格式log_format的时候,自定义的请求头用 【$http_自定义请求头名】 的格式就可以打印出来 例如你的自定义…

如何掌握Spring事件发布和监听机制?

在软件设计和开发过程中,事件驱动是一种非常主流的架构模式,它的基本组成见下图,可以看到存在一个事件中心,而各个服务可以执行事件发布、订阅和消费等基本过程。 事件驱动架构代表的是一种架构设计风格,实现方法和工具…

[图解]企业应用架构模式2024新译本讲解05-表模块2

1 00:00:00,970 --> 00:00:03,440 接下来,我们就来看案例了 2 00:00:03,690 --> 00:00:09,260 案例跟上一次事务脚本案例是一样的 3 00:00:11,210 --> 00:00:13,130 也是收入确认这个案例 4 00:00:14,460 --> 00:00:15,580 这是表结构 5 00:00:15,7…

【Android】手动下载gradle插件包,解决gradle插件包下载不全问题。

问题描述 拉取别人的项目时,因为网络问题gradle插件包一直下载不全,一直build。 解决方案: 打开gradle>wrapper文件下gradle-wrapper.properties,查看需要下载gradle-7.2-bin.zip。 distributionBaseGRADLE_USER_HOME distr…

cmd窗口输出内容乱码问题

出现这样的问题是因为编码格式和解码格式不一样导致的,cmd窗口的默认解码格式为GBK,如想修改cmd默认编码格式可以按照下面步骤操作:打开cmd窗口输入:chcp 65001 65001指的是utf-8编码如果不清楚编码对应的 页面编码是是多少&#…

访问github加速方法续集dev-sidecar

访问github加速方法续集dev-sidecar dev-sidecar 重要提醒 ------------------------------重要提醒1--------------------------------- 注意:由于electron无法监听windows的关机事件,开着ds情况下直接重启电脑,会导致无法上网&#xff0c…

【网络层】IP地址基础 与 子网掩码

文章目录 IP地址基础IP地址概念IP地址分类公网地址和私网地址 子网掩码子网掩码作用默认子网掩码网络地址、主机地址、广播地址 IP地址基础 IP地址概念 IP地址:IP Address 在网络中,通信节点都需要有一个IP地址 IP地址以点分十进制表示,有…

建设人工智能平台,主流GPU卡选型分析

国内外主流GPU卡性能分析!2024! 大模型兴起助推算力需求激增 2024年,深度学习与人工智能技术飞速跃进,Transformer、GPT-3等大模型在自然语言处理、图像识别、语音合成等领域大放异彩,开启AI新纪元。其庞大的参数与数…

Matlab操作Excel筛选指定数据的对应数据

Matlab中在表格中寻找指定汉字,并返回其所在行数, 将该行数的另一列提取出来。 目录 一、前言 二、直接在命令行输出 三、保存筛选数据excel 一、前言 源数据excel: 指定汉子:买,得到下面数据: 二、直接…

微信小程序埋点监听方案

场景:运营小程序,需要根据系统访问情况来做决策时。 后台:开发可配置监听页面路径,参数,事件名称等,类似以下格式,进行json保存。 组装数据接口返回给前端缓存到本地,然后进行校验编…

MyBatis延迟加载缓存分页逆向工程

文章目录 延迟加载概述步骤 缓存一级缓存介绍原理 二级缓存介绍 设置缓存对象策略原理开启步骤属性解释是否使用一级缓存 分页插件使用步骤 逆向工程介绍搭建使用增删修改查 延迟加载 概述 延迟加载本身是依赖于多表查询的 延迟加载中返回值要选择resultMap返回的结果一定是D…

数学建模 —— 插值与拟合(1)

一、matlab画图 1.1 plot(二维图形) plot(x) —— 缺省自变量绘图格式 plot(x,y) —— 基本格式,以y(x)的函数关系作出直角坐标图,如果y为nm的矩阵,则以x为自变量,作出m条曲线 plot(x1,y1,x2,y2,…,xn,…

神经网络算法详解与前沿探索

神经网络算法详解与前沿探索 随着人工智能技术的迅猛发展,神经网络成为机器学习领域的重要组成部分,广泛应用于图像识别、自然语言处理和推荐系统等。本文将详细探讨神经网络的基本原理、结构、训练过程及其应用实例,并扩展至更多相关领域和…

基于标准库的STM32的外部中断EXTI

毕设已经告一段落了,接下来准备开始整理一下毕设中用到的知识与技术细节,今天整理的是STM32从编码器获取数据的方式-----外部中断(EXTI): 外部中断分为四个硬件相关外设,GPIO/AFIO/EXTI/NVIC(E…