系统架构设计师【第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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第二十五章新增H5基础(以及视频~兼容)

1.HTML5中新增布局标签 HTML5新增了页眉&#xff0c;页脚&#xff0c;内容块等文档结构相关标签&#xff0c;可以使文档结构更加清晰明了。 1.新增的结构标签 1、<header>标签 定义文档或者文档中内容块的页眉。通常可以包含整个页面或一个内容区域的标题&#xff0c…

【Java】刚刚!突然!紧急通知!垃圾回收!

【Java】刚刚&#xff01;突然&#xff01;紧急通知&#xff01;垃圾回收&#xff01; 文章目录 【Java】刚刚&#xff01;突然&#xff01;紧急通知&#xff01;垃圾回收&#xff01;从C语言的内存管理引入&#xff1a;手动回收Java的垃圾回收机制引用计数器循环引用问题 可达…

支付宝支付-Java基于沙箱环境实现支付宝支付

一、支付宝沙箱环境介绍 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境&#xff0c;开发者在沙箱环境中调用接口无需具备所需的商业资质&#xff0c;无需绑定和开通产品&#xff0c;同时不会对生产环境中的数据造成任何影响。合理使用沙箱环境&#xff0c;可以…

7-Django项目--账号管理

目录 templates/admin_role/admin_list.html ​编辑 templates/admin_role/add_modify.html views/admin_role.py 账号管理----> 账号添加 views.py 身份修改 views.py 重置密码 views.py templates/admin_role/admin_list.html {% extends "index/index.ht…

[有监督学习] 7.详细图解随机森林

随机森林 随机森林&#xff08;random forest&#xff09;是将多个模型综合起来创建更高性能模型的方法&#xff0c;既可用于回归&#xff0c;也可用于分类。同样的算法有梯度提升&#xff08;gradient boosting&#xff09;等在机器学习竞赛中很受欢迎的算法。 通过学习随机森…

SpringBoot整合jasypt加密配置文件敏感信息

SpringBoot整合jasypt加密配置文件敏感信息 在项目中我们需要对配置文件的一些敏感信息进行加密处理&#xff0c;比如数据库账户密码&#xff0c;避免直接暴露出来&#xff0c;这种场景常常用于生产环境&#xff0c;我们不想让开发人员知道生产库的密码&#xff0c;有运维人员…

Ubuntu 安装好虚拟环境后,找不到workon 命令

1、安装虚拟环境 pip3 install virtualenv pip3 install virtualenvwrapper 2、安装完成后 workon 命令。 找不到workon 命令 执行&#xff0c;source virtualenvwrapper.sh 执行后&#xff0c;在使用workon命令&#xff0c;即可完成。

1.1 Mediapipe随手简记(一)

为了后续项目展开&#xff0c;需要Python、C、Linux、OpenCV、Mediapipe、ROS知识。 最后面有手势识别&#xff08;数字&#xff09;精准案例&#xff0c;项目会用到。 Mediapipe学习篇1 Mediapipe 是一个开源的跨平台框架&#xff0c;它提供了大量的解决方案&#xff0c;用…

MySQL十部曲之九:MySQL优化理论

文章目录 前言概述查询优化查询执行计划EXPLAIN获取表结构信息获取执行计划信息 EXPLAIN 输出格式如何使用EXPLAIN进行优化 范围访问优化单列索引的范围访问多列索引的范围访问 索引合并优化索引合并交叉访问算法索引合并联合访问算法索引合并排序联合访问算法 索引下推优化连接…

随身wifi网络卡顿怎么解决?随身WiFi哪个牌子的最好用?排名第一名的随身WiFi!

对于随身wifi靠不靠谱这个问题&#xff0c;网上一直存在争议。很多人的随身wifi网速不稳定&#xff0c;信号看着满格就是上不了网。关于随身wifi卡顿到底该怎么解决呢&#xff1f; 1.如果是设备网络在一个地方上网速度很快&#xff0c;换一个地方网络就不行了&#xff0c;很可能…

爬虫学习2

中国国家地理网 单张图片爬取 import requests url http://img0.dili360.com/ga/M00/02/AB/wKgBzFQ26i2AWujSAA_-xvEYLbU441.jpg!rw9 headers {"User-Agent": Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0…

CC工具箱使用指南:【山西省村规结构调整表(亦求长生亦求你)】

一、简介 群友定制工具。 工具根据输入的用地图层&#xff0c;生成山西村规的结构调整表。 和一般的用地表有些不一样的地方是&#xff0c;现状和规划字段都在同一个图层里。 并且还有一个【村庄名称】的字段&#xff0c;可以将多个村庄放在一个图层中&#xff0c;一次性生…

简介项目管理七步训练与站上山顶

前言 麦肯锡七步成诗法,实际上并非用于创作诗歌,而是一种解决问题的方法,它源自于全球知名的管理咨询公司麦肯锡(McKinsey & Company)。 这种方法强调逻辑清晰、结构化思维,用于解决商业问题非常有效。这种创意思维方法被广泛应用于问题解决和创新过程中。以下是“麦…

【设计模式深度剖析】【7】【结构型】【享元模式】| 以高脚杯重复使用、GUI中的按钮为例说明,并对比Java类库设计加深理解

&#x1f448;️上一篇:外观模式 | 下一篇:结构型设计模式对比&#x1f449;️ 设计模式-专栏&#x1f448;️ 目录 享元模式定义英文原话直译如何理解&#xff1f;字面理解例子&#xff1a;高脚杯的重复使用例子&#xff1a;GUI中的按钮传统方式使用享元模式 4个角色1. …

html期末复习速览

一.基础标签 1.段落标签<p></p> 特点&#xff1a;分段分割 2.标题标签<h1></h1>……<h6></h6> 特点&#xff1a;文字加粗&#xff0c;单独占一行 3.换行标签<br /> 特点&#xff1a;单标签&#xff0c;强制换行 二.文本格式化…

流媒体内网穿透/组网/视频协议转换EasyNTS上云网关如何更改密码?

EasyNTS上云网关的主要作用是解决异地视频共享/组网/上云的需求&#xff0c;网页对域名进行添加映射时&#xff0c;添加成功后会生成一个外网访问地址&#xff0c;在浏览器中输入外网访问地址&#xff0c;即可查看内网应用。无需开放端口&#xff0c;EasyNTS上云网关平台会向Ea…

备忘录--

备忘录 vue新建项目&#xff0c;body 大小占不了全屏 // 解决问题 // public/index.html 更改基础样式 html,body{height: 100%width: 100%&#xff1b;margin: 0;border: 0;padding: 0; }Element Plus 经典布局 参考 Element Plus 官网 <template><div class"…

jmeter性能测试用例提取

性能测试用例提取参考(根据单、混合场景、模块、运行时间、优先级)去考虑 Tips&#xff1a;用例提取和用例设计不一样 后期可以结合性能测试用例设计(设置线程数、时间、循环、同步定时器等等&#xff09;来做性能测试

从零到一建设数据中台 - 关键技术汇总

一、数据中台关键技术汇总 语言框架&#xff1a;Java、Maven、Spring Boot 数据分布式采集&#xff1a;Flume、Sqoop、kettle 数据分布式存储&#xff1a;Hadoop HDFS 离线批处理计算&#xff1a;MapReduce、Spark、Flink 实时流式计算&#xff1a;Storm/Spark Streaming、…

VB.net进行CAD二次开发(四)

netload不能弹出对话框&#xff0c;参考文献2 参考文献1说明了自定义菜单的问题&#xff0c;用的是cad的系统命令 只要加载了dll&#xff0c;自定义的命令与cad的命令同等地位。 这时&#xff0c;可以将自定义菜单的系统命令替换为自定义命令。 <CommandMethod("Add…