系统架构主题之七:基于架构的软件设计方法及应用

1 基于架构的软件设计方法概念

关键词:ABSD、自顶向下、递归迭代、与需求同步、设计元素、视角与视图、用例和质量场景、预期和非预期等。

总的来讲,ABSD方法分为如下六个大的阶段:

1)体系结构需求阶段

相比传统软件系统设计,架构设计在需求获取、分析之后展开不同,基于体系结构的软件架构设计,将架构设计工作提前到与需求同步,在需求阶段即开始展开体系架构设计,可以更好的完成设计工作,更好的支持软件复用。

ABSD方法在需求阶段的工作包括需求获取、标识构件、架构需求评审。需求获取用于提取系统相关的功能、质量属性,目标为服务商业和用户及开发人员目标。之后需要对需求进行分析,生成类图,对类进行分组,将类打包为构件,从而完成标识构件的工作。这个过程是不断迭代的过程。完成标识后,还需要组织相关人员(分析、用户、设计、测试等)对体系结构需求和构件进行评审,确定类是否合理,划分是否合理,构件合并是否合理等。

2)体系结构设计阶段

设计阶段的工作包括选择体系结构风格、映射构件、分析构件作用、产生体系结构、设计评审等步骤。选择合理的架构风格是首要工作。这可以统一大家对系统的基础理解。注意,这个步骤的结果并不一定是完美的,可能在后续完善迭代过程中完善。有了组织结构风格的理解后,就需要将标识的构建映射到体系结构中,产生一个中间结构。因为构件并不是独立的,之间有交互,有联系,所以还要分析他们的作用关系,在理清作用关系的基础上就可以精化体系结构,产生一个初步的体系结构,用于评审。这个评审需要邀请独立于系统开发人员的外部人员进行。

3)体系结构文档化

因为体系结构是抽象的,概念上的,所以要与开发人员、实现人员达成一致理解,还需要进行文档化工作。这个阶段输出体系结构规格说明文档和测试体系结构需求的质量设计说明书。文档需要从使用者的角度出发进行编写,需要是形式化的,有比较严格约束的。

4)体系结构复审

在开始编码实现之前,还需要对体系结构文档进行复审,用于识别缺陷和风险。这主要由外部专家和领域专家甚至用户代表来参加。设计人员可以大家一个最小化可运行系统来评估和测试体系架构,最终确定是否满足功能、质量需求,层次是否清晰,构建是否合理,表达是否明确等。

5)体系结构实现

实现阶段的工作主要包括构件分析和设计、构件实现、构件组装、系统测试等。构件的设计和实现要满足体系结构文档中有关构件的约束要求。测试不仅要进行功能测试,还需要进行性能测试,以满足整体要求。

6)体系结构演化

需求可能发生变化,体系结构要进行演化。演化过程包括需求归类、制定演化计划、构件变动、更新构件的相互作用、构件组装与测试、技术评审。整个过程还是比较容易理解的。评审后如果修改测试不符合需求,还需要迭代优化。

对上述过程主要是理解。在理解的基础上应用于实际系统开发中。从上面的介绍中我们可以看到,整个过程还是比较严谨细致的,关键问题是实际中执行的情况如何。

2 实际系统构建过程中的应用

仍然以前述某电力系统项目为例。

体系结构需求分析阶段的工作包括获取需求,生成类图,对类进行分组,打包成构件,对需求进行评审,产生领域模型。针对上述项目,从业务角度来看,包括了会议管理(包括传统网络会议和电话会议),通信管理(包括异构网络互联互通、多通信手段的无缝衔接,以打破信息孤岛),数据管理(各类数据的融合,共同服务业务流程,包括线路数据、定位数据、设备数据等),设备管理(各类设备的接入支持,采样支持)等。从技术上看,综合了多媒体音视频技术,网络技术,通信技术,大数据技术、云计算技术等。这些主要服务功能性需求。在需求阶段,需要对各种技术需求进行梳理,并根据耦合内聚的情况,对设计的相关类进行分组。除了功能性需求外,非功能性需求更是需要投入精力仔细研究,对本项目来讲,可靠性、安全性都是重要的特性要求,而且还涉及一定的性能要求,这些在需求阶段都需要进行边界约束,从而为后续设计和测试阶段提供依据。

设计阶段,需要选择风格,映射构件,分析构件的相互作用,对设计评审,产生体系结构。在需求工作做的足够充分的基础上,才能合理的设计架构。风格的选择是至关重要的第一步,影响后续工作的大方向。在本系统中,考虑到业务涉及的面比较广,底层支撑技术较为全面,有一定深度要求,因此总体采用分层风格,以便更好的对系统进行抽象建模。而且,层次结构兼具灵活性和统筹性,既能方便大家都系统达成一致的理解,也能方便扩展和变通具体的实现方案,在领域内被广泛的使用,所以这一选择得到了团队的一致认可。

具体来讲,将系统划分为硬件、操作系统(驱动)、平台、网络+数据、业务、展示等几个层次,每一层依赖下层,对上层提供需要的支撑能力。比如,操作系统层面提供硬件资源管理,提供对容器和虚拟化的支持。平台层,可以构建对业务层其关键支撑的技术框架,包括多媒体的采集渲染,数据的编解码支持,网络通信的支持,异步事件的支持,开发框架的支持等。总的来讲,这部分既是独立技术的排列,扩展系统的支撑能力,也是技术模型的聚合,关注点分离,方向的约束,是在对需求进行全面分析基础上做出的。而数据和网络层则更加聚焦面向业务,等到业务层面,其需要的各类技术支撑,在底层都能够得到确认,也基本证明了底层构建的正确性。

体系结构的设计,不仅仅要考虑功能需求,还要考虑非功能需求,要体现对非功能需求的支持。划分网络层就是为了满足异构网络下对可靠性的高要求,通过支持通道绑定和切换,配合数据冗余技术,来满足对高可靠性的要求。而且安全性的需求也要求网络的安全性,因此将这些需求的支持融合到网络层,可以更好的便利业务层的开发。

软件系统的复杂性,涉及技术点的多样性,使得只采用一种风格并不合理也不现实。在层内构件之间和层间的构件之间也有其他风格的应用。比如展示层和业务逻辑层为了更好的实现隔离和内聚,采用了进程通信体系结构风格。还有其他一些风格,在软件架构风格文章中已经进行了详细的描述,这里就不再展开了。

确定风格、确定风格对应的构件,设计出体系结构后,邀请多方代表参与评审,最终明确了体系结构设计。有了高层抽象的概念化的体系结构后,就需要将其文档化,使用语言具体的便于开发和实现人员理解的方式进行形式化约束描述。比如对于前述可靠性要求,在网络构件中就有多环路的设计要求,自动切换的要求,对于前述安全的要求,就有加密的设计,分组分级的设计,业务层构件就有安全规范操作手册相关内容的设计,明确业务流程的合规要求。

在完成文档化工作后,还需要组织一次复审,以检查描述是否全面、完整,表述是否准确严谨,结构层次是否分明清晰。这次复审也是一次查缺补漏的机会,因为关系到后面的实现,也因为邀请了外部领域专家,因此也是一次非常严肃的评审。在评审前,一方面将技术验证的原型进行了汇总展示,另一方面将相关内容分发到参会人员进行准备,收集意见,包括对自己所属领域进行严格审查,对其他模块的依赖和接口要求进行仔细核对,并最终给出初步的意见。这大大提高了会议的效率和深度,取得了很好的效果。起初,专家对多客户端抽象的性能满足与否持有怀疑态度,对数据带宽问题的实现复杂度过于悲观,安全性方面接入限制也持有保留的态度,但在看到原型的展示后,还是高度仍可了大家的分析设计工作。

因为设计阶段的充分工作,评审的严谨,实现阶段大家的积极性很高,没有明显的抵触情绪,彼此的低效沟通减少了很多,很多小节点都得到了保证。许多构件的设计实现工作是比较顺利的。因为完整的单元和集成测试准备工作,系统整体开发进展较为顺利。

软件系统开发的复杂性很多来自需求的变化,这在本项目中更是深刻的体现了出来。在ABSD方法中,体系结构演化就是用来应对需求变化的,整个过程包括提出演化计划,确定更新构件部分,对构件进行变动,包括增删改等更新操作,最后更新构件相互作用并组装进行系统测试。这个过程说起来简单,做起来难上加难。本项目中,一个重大的需求导入就是对卫星通信的支持。由于前期卫星数据通路未开通,采用的是移动网络模拟,但是等到数据开通后,发现之前的设计可行性几乎为零。链路的不可靠带来大量的丢包,协议设计的重传又加重了这一过程,在实际测试中,过低的成功率严重降低了业务的使用信心。这种需求变更最怕的就是产生多米诺骨牌效应,一处修改,被传导蔓延扩散到整个系统,污染了整个设计,这是最不能接受的。为了应对该需求,团队开始时修改了业务的部分流程,并对网络库进行了适应性的修改,在一定程度上缓解了业务失败概率过大的问题,但是并没有彻底解决技术上的限制,业务体验还是难以达到要求。为此,团队对需求的变动进行了二次系统梳理,对相关变更的必要性进行了仔细的校对,对技术实现的约束限制进行了全面仔细的验证测试,在这些信息的基础上,反推到需求层,对需求进行调整,改变了最初过于苛刻的性能要求和体验目标,在大家达成共识的基础上,进行了二次演进处理,并增加了更为全面的测试,收集了系统化的测试数据,为业务的调整提供了更为合理的边界。

在目标修改后,团队的士气得到了明显提升,改进过程得到了快速收敛,最后在增加部分投入时间的情况下,完成了演进过程。通过这次演进,大家都收获很多,也在推动大家主动挑出技术圈子,全局把握系统和业务本质需求上,上了生动一课。

虽然系统设计和实现的整个过程中团队做了大量工作,自认为还是比较充分的,但是实际开发过程中仍然遇到了不少计划外的障碍,包括安全方面的内外网合规要求,开发语言和工具的改变,部署的特殊要求等,这些在内部工作中都没有被很好的预警,额外增加了很多的市场、技术支持和开发工作,这是后续需要改进的。总的来讲,卫星通路的引进属于技术上的重大变更,而这里所述的很多是对业务理解的不够深,对客户环境的理解和掌握不够导致的,因此整体上看,一个项目的成功,不仅仅技术上要做全面的风险设计,非技术方面也要做足风险分析与预案工作,知己知彼百战百胜,在现代竞争激烈的商业环境中,这一道理仍然是十分正确、十分有用的。

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

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

相关文章

设计模式 06 适配器模式

适配器模式(Adapter Pattern)属于结构型模式 概述 结构型模式关注如何将现有的类或对象组织在一起形成更加强大的结构。 在生活中,我们经常遇到这样的一个问题:轻薄笔记本通常只有 type-c 或者 usb-a 接口,没有网口。…

《Zookeeper》源码分析(二十三)之 客户端的命令处理过程

目录 客户端的命令处理过程1. ZooKeeper.create()2. ClientCnxn.submitRequest()3. SendThread.run()4. ClientCnxnSocket.doTransport()5. SendThread.readResponse() 客户端的命令处理过程 以创建节点命令为例,整个过程流程如下: CliCommand命令在抽…

AcWing 2058. 笨拙的手指(每日一题)

大家好 我是寸铁 如果你觉得这篇题解对你有用,可以动动手点个赞或关注,谢谢~ 题目描述 输入的第一串字母,存在一位错误。 输入的第二串字母,存在一位错误。 答案保证唯一解 我们需要去枚举每一位,找到二进制和三进制…

Linux安装ntp并使用阿里云配置ntp服务器

安装 NTP 客户端: 打开终端,以 root 权限执行以下命令来安装 NTP 客户端: sudo zypper install ntp 编辑 NTP 配置文件: 使用文本编辑器打开 NTP 的配置文件 /etc/ntp.conf,例如使用 nano 编辑器: sudo v…

数据库——MySQL高性能优化规范

文章目录 数据库命令规范数据库基本设计规范1. 所有表必须使用 Innodb 存储引擎2. 数据库和表的字符集统一使用 UTF83. 所有表和字段都需要添加注释4. 尽量控制单表数据量的大小,建议控制在 500 万以内。5. 谨慎使用 MySQL 分区表6.尽量做到冷热数据分离,减小表的宽度7. 禁止在…

Vue 和 JQuery 的区别在哪?为什么 JQuery 会被 Vue 取代?

在 Web 前端开发领域,我们经常会遇到一些不同的工具和框架,其中 Vue 和 JQuery, JQuery 是曾经备受欢迎的选择,而现在 Vue 是大多数人的选择。本文将探讨 Vue 和 JQuery 之间的区别,并讨论为什么越来越多的开发人员放弃 JQuery 而…

腾讯云服务器搭建网站详细教程_2023更新

使用腾讯云服务器搭建网站全流程,包括轻量应用服务器和云服务器CVM建站教程,轻量可以使用应用镜像一键建站,云服务器CVM可以通过安装宝塔面板的方式来搭建网站,腾讯云服务器网分享使用腾讯云服务器建站教程,新手站长搭…

Pyecharts教程(二):使用pyecharts绘制3D散点图——以营养元素为例

Pyecharts教程(二):使用pyecharts绘制3D散点图——以营养元素为例 作者:安静到无声 个人主页 目录 Pyecharts教程(二):使用pyecharts绘制3D散点图——以营养元素为例1. 准备工作2. 读取JSON数据3. 配置图形选项4. 构造数据5. 实验结果推荐专栏在本文中,我们将学习如何使用…

Linux内核学习(九)—— 虚拟文件系统(基于Linux 2.6内核)

虚拟文件系统(VFS)作为内核子系统,为用户空间程序提供了文件和文件系统相关的接口。通过虚拟文件系统,程序可以利用标准的 Unix 系统调用对不同的文件系统(甚至不同介质上的文件系统)进行读写操作。 一、通…

react图片预加载

道阻且长,行而不辍,未来可期 图片预加载的原理:new一个image对象,用这个对象加载图片,等这个对象将这个图片请求完后,再将这个图片放入原本应该放置的位置 代码如下: import React, { useEffe…

Springboot整合minio组件-分布式文件存储

一、快速开始 Minlo说明: Minio是Apcche旗下的一款开源的轻量级文件服务器,基于对象存储,协议是基于Apache License v2.0,开源可用于商务。Minio主要用来存储非结构化的数据,类似文件,图片,照…

洛谷题解 | P1051 谁拿了最多奖学金

目录 题目描述 输入格式 输出格式 输入输出样例 提示 题目思路 AC代码 题目描述 某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同: 1. 院士奖学金,每人 8000 元,期末平均成绩高于 …

go语言中的切片

切片底层 切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。 切片…

Pyecharts教程(四):使用pyecharts绘制3D折线图

Pyecharts教程(四):使用pyecharts绘制3D折线图 作者:安静到无声 个人主页 目录 Pyecharts教程(四):使用pyecharts绘制3D折线图准备工作数据准备绘制3D折线图推荐专栏在这篇文章中,我们将学习如何使用pyecharts库来绘制一个3D折线图。pyecharts是一个用于生成Echarts图表的…

7.elasticsearch同步工具-logstah

1.logstah Logstash 是一个用于数据处理和转换的开源工具,它可以将来自不同源头的数据收集、转换、过滤,并将其发送到不同的目标。Logstash 是 ELK(Elasticsearch、Logstash 和 Kibana)技术栈的一部分,通常与 Elastics…

VUE笔记(四)vue的组件

一、组件的介绍 1、组件的作用 整个项目都是由组件组成 可以让代码复用:相似结构代码可以做成一个组件,直接进行调用就可以使用,提高代码复用性 可以让代码具有可维护性(只要改一处,整个引用的部分全部都变&#xf…

构建与应用大数据环境:从搭建到开发与组件使用的全面指南

文章目录 环境搭建开发与组件使用性能优化与监控安全与隐私总结 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:大数据系列 ✨文章内容: 🤝希望作者…

求解整数规划问题的割平面法和分支定界法

文章目录 整数规划割平面法分支定界法代码实现 整数规划 整数规划问题是优化变量必须取整数值的线性或非线性规划问题,不过,在大多数情况下,整数规划问题指的是整数线性规划问题。 其数学模型为 m i n f ( x ) c T x s.t A x b x ≥ 0 x…

【Gitee提交pr】

Gitee提交pr 什么是pr怎样提交一个pr嘞? 什么是pr pr:指的是将自己的修改从自己的账号仓库dev下提交到官方账号仓库master下; 通俗来讲就是Gitee线上有属于自己的分支,然后本地在自己地分支修改完代码之后,提交到自己的线上分支&a…

多线程和并发(1)—等待/通知模型

一、进程通信和进程同步 1.进程通信的方法 同一台计算机的进程通信称为IPC(Inter-process communication),不同计 算机之间的进程通信被称为 RPC(Romote process communication),需要通过网络,并遵守共同的协议。**进…