【架构基础】架构概念

news2024/11/23 2:58:37

软件架构产生的背景

1972年图灵奖获得者、荷兰计算机科学家Edsger Wybe Dijkstra早在20世纪60年代就开始涉及软件架构概念了。

20世纪60年代第一次软件危机引出了结构化编程,创造了模块的概念。

20世纪80年代第二次软件危机引出了面向对象编程,创造了对象的概念。

到了20世纪90年代软件架构开始流行,创造了组件的概念。

由此可见,模块、对象、组件本质上都是对达到一定规模的软件进行拆分,区别仅仅是随着软件复杂度不断增加,拆分的粒度越来越粗,拆分的层次越来越高。

架构定义

目前软件架构没有统一的定义,下面列举几个比较具有代表性的架构定义:

  • 卡内基梅隆大学SEI--计算系统的软件架构是解释该系统所需的结构体的集合,其中包括软件元素、元素之间的相互关系,以及二者各自的属性。
  • ISO42010.2011--架构是一个系统的基本组织,体现为其组成部件、部件之间、环境之间的关系,以及支配其设计和演进的原则。
  • 《系统架构》--架构是对系统中实体与实体之间关系所进行的抽象描述,在人类构建的系统中,它可以表述为一系列的决策。

架构设计

架构设计是一门分与合的艺术。

关注点分离(Separation of concerns, SoC)原则主要目的就是为了解决复杂系统如何“分”的问题。将复杂系统根据不同的角度(也即关注点)分解为多个相对独立的部分,再对每个独立部分单独处理,这就是关注点分离。

从不同维度,可以有不同的分离方案。温昱老师的《软件架构设计》一书中的【 2.1.1 关注点分离之道 】章节分别从功能职责、通用专用性、大小粒度等不同维度进行分离。

架构的“合”,下面从功能职责划分视角说明,从高层到低层依次为展现层、业务层、数据层。

架构设计需要明确依赖关系规则。一是源码的依赖关系必须只能由高层指向低层,即展现层依赖于业务层或数据层。二是上层模块发生的任何变更,都不应影响到下层模块的实现,如展现层变更,不应影响到业务层或数据层。

对于大型长生命周期的项目,为了保持核心业务层架构的稳定性,避免数据层的变化对业务层影响,业务层不能直接调用数据层的接口读写数据。通常采用依赖倒置原则(DIP)解决源码中控制流与依赖方向的相反性问题,即由高层定义接口,由低层实现接口。此处,由业务层定义接口,由数据层实现接口。

架构设计-RUP 4+1视图方法

1995年,Philippe Kruchten在《IEEE Software》上发表了题为《The 4+1 View Model of Architecture》的论文,引起了业界的极大关注。后来,他加入Rational,演变出著名的“RUP 4+1视图方法”。

  • 逻辑视图(Logical View),设计的对象模型。

逻辑视图关注功能,不仅包括用户可见的功能,还包括为实现用户功能而必须提供的 “辅助功能模块”。它们可能是逻辑层、功能模块、类等。

  • 进程视图(Process View),捕捉设计的并发和同步特征。

进程视图关注进程、线程、对象等运行时概念,以及相关的并发、同步、通信等问题。进程视图和实现视图的关系:进程视图一般偏重程序包在编译时期的静态依赖关系,而这些程序运行起来之后会表现为对象、线程、进程,进程视图比较关注的是这些运行时单元的交互问题。

  • 部署视图(Deployment View),描述了软件到硬件的映射,反映了分布式特性。

部署视图关注 “目标程序及其依赖的运行库和系统软件” 最终如何安装或部署到物理机器,以及如何部署机器和网络来配合软件系统的可靠性、可伸缩性等要求。部署视图和进程视图的关系:进程视图特别关注目标程序的动态执行情况,而部署视图重视目标程序的静态位置问题;部署视图还要考虑软件系统和包括硬件在内的整个 IT 系统之间是如何相互影响的。

  • 实现视图(Implementation View),描述了在开发环境中软件的静态组织结构。

实现视图关注程序包,不仅包括要编写的源程序,还包括可以直接使用的第三方 SDK 和现成框架、类库,以及开发的系统将运行于其上的系统软件或中间件。实现视图和逻辑视图之间可能存在一定的映射关系:比如逻辑视图中的逻辑层一般会映射到实现视图中的多个程序包;再比如实现视图中的源码文件可以包含逻辑视图中的一到多个类。

  • 用例视图(Use-Case View),该视图对应于“+1”,代表用户需求。它关联了其他所有视图,实际上也代表了所有设计都必须围绕用户需求展开。

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

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

相关文章

Flask的send file和send_from_directory的区别

可以自行查看flask 文档。 send file高效; send from directory安全,且适用于静态资源交互。 都是实现相同的功能的。 send_file send_from_directory

所有docker命令无效,解决办法

目录 ■前言 今天使用docker时,所有命令无效 ■解决办法如下 1.停止docker服务 2.查看状态 3.删除之前的docker相关的文件 4.再次查看状态 5.使用相关命令 (好用了) 6.重新下载镜像 ■前言 今天使用docker时,所有命令无…

MySQL 8.0 OCP (1Z0-908) 考点精析-备份与恢复考点1:MySQL Enterprise Backup概要

文章目录 MySQL 8.0 OCP (1Z0-908) 考点精析-备份与恢复考点1:MySQL Enterprise Backup概要MySQL Enterprise Backup下载与安装MySQL Enterprise Backup的备份过程MySQL Enterprise Backup的优势mysqlbackup 客户端例题例题1 : MySQL Enterprise Backup概…

idea的插件FastRequest,比postman更好用

1.安装插件Restful Fast Request 在插件plugin中直接搜索Restful Fast Request,然后点击install安装 2.使用插件 插件位置在右面,点开后呈现以下页面 配置项目名和环境 选择配置好的项目名和环境 启动项目后可以看到接口的小火箭,点击小火箭 3.…

【配置环境】Windows下 VS Code 远程连接虚拟机Ubuntu

一,环境 Windows 11 家庭中文版VMware Workstation 16 Pro (版本:16.1.2 build-17966106)ubuntu-22.04.2-desktop-amd64 二,关键步骤 Windows下安装OpenSSHVS Code安装Remote - SSH插件 三,详细步骤 在Ubun…

sentinel深入讲解流量控制/熔断降级

文章目录 sentinelsentinel介绍重要的核心概念引入依赖限流的规则熔断规则yaml 项目配置使用注解 SentinelResource讲解类的静态方法 sentinel sentinel介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构…

STM32中PWM概述

STM32F103C8T6 PWM资源&#xff1a; 高级定时器(TIM1):7路 通用定时器(TIM2~TIM4):各4路 PWM输出模式&#xff1a; *PWM模式1&#xff1a;在向上计数时&#xff0c;一旦CNT<CCRx时输出为有效电平&#xff0c;否则为无效电平 *PWM模式2&#xff1a;在向上计数时&#xf…

vue实现仿手写稿样式,可导出成png图片

文章目录 环境实现效果代码 环境 安装html2canvas&#xff0c;用于将指定标签下的全部子节点转换为图片 npm install html2canvas实现 <template><div class"handwrite"><div id"left" class"left"><div id"backImg…

【Mycat2】关于序列功能的一个 Bug

创建序列前 Mycat 的 sequences/ 目录情况&#xff1a; 创建一个 MySQL 生成方式的序列。 /* mycat:setSequence{"name":"sharding_db_not_tb111","clazz":"io.mycat.plug.sequence.SequenceMySQLGenerator"} */;因为没有官方文档支…

字符函数和字符串函数下篇(详解)

❤️ 作者简介 &#xff1a;RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 字符函数和字符串函数2 1…

DevOps自动化平台开发之 Shell脚本执行的封装

基础知识 基于如下技术栈开发DevOps平台 Spring Boot Shell Ansible Git Gitlab Docker K8S Vue 1、spring boot starter的封装使用 2、Shell脚本的编写 3、Ansible 脚本的编写 4、Docker 的使用与封装设计 本篇介绍如何使用Java封装Linux命令和Shell脚本的使用 将其设计成…

【Datawhale夏令营】任务一学习笔记

目录 一&#xff1a;anaconda的环境配置 二&#xff1a;赛题任务解读 2.1 任务要求 2.2 数据集介绍 2.3 评估指标 三&#xff1a;机器学习之 LightGBM 一&#xff1a;anaconda的环境配置 下载Anaconda&#xff1a;访问Anaconda官方网站&#xff08;https://www.anaconda.…

SQL篇-04_SQL进阶挑战-01_增删改操作

插入记录 SQL110 插入记录&#xff08;一&#xff09; 描述 牛客后台会记录每个用户的试卷作答记录到exam_record表&#xff0c;现在有两个用户的作答记录详情如下&#xff1a;用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001&#xff0c;并在50分钟后提交&#xff…

【算法基础:数学知识】4.3 欧拉函数

文章目录 欧拉函数定义性质 例题列表873. 欧拉函数&#xff08;使用质因数分解求一个数的欧拉函数&#xff09;原理讲解&#xff08;公式推导&#xff09;⭐解法代码 874. 筛法求欧拉函数&#xff08;求 1 ~ n 中所有数字的欧拉函数&#xff09;⭐ 欧拉函数 https://oi-wiki.o…

安装及配置zabbix_agent代理端(监控FTP服务器)

监控agent的linux主机我们在之前的文章里已经做好了 现在直接安装ftp服务即可 [rootagent ~]# yum install -y vsftpd[rootagent ~]# systemctl start vsftpd #启动ftp服务[rootagent ~]# systemctl enable vsftpd #设置ftp服务开机自启 Created symlink fro…

codec2play流程总结

Codec2.0(C2)是android系统为vendor提供的用于实现video/audio/filter模块的的HAL层接口API&#xff0c;vendor可用这个API实现他们自己的HAL层&#xff0c;Codec2.0是用于替换现有的OMX-IL。 数据流程 C2LinearBlock创建share ptr类型block&#xff0c;fetchLinearBlock对blo…

【每日一题Day274】LC42接雨水 | 单调栈

接雨水【LC42】[面试常见] 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 按列求贡献&#xff1a;枚举 首先确定按行计算雨水&#xff0c;还是按列确定雨水 按行计算&#xff1a; 按列计算&#xff1…

SpringBoot之jackson之复杂XML和Object互转、泛型、传参/接参

引入依赖 <!-- lombok插件 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- jackson xml 转换工具 --><dependency><…

自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程。本文主要介绍关键词抽取样例数据、GRU模型模型构建与训练、命名实体识别(NER)、模型评估与应用&#xff0c;项目的目标是通过训练一个GRU模型…

crmeb部署

安装宝塔 教程 安装所需要的软件 php mysql5.7 redis fileinfo nginx 安装crmeb 重启mysql 前台http://192.168.216.128/ 后台http://192.168.216.128/admin admin admin888登录 访问前台