认识什么是架构

目录

​编辑 

一、架构是什么

 1.1 系统与子系统

 1.1.1 系统

1.1.1.1 关联

 1.1.1.2 规则

 1.1.1.3 能力

1.1.2 子系统

 1.2 模块与组件

 1.2.1 模块

 1.2.2 组件

 1.3 框架与架构

 1.3.1 框架

 1.3.2 架构

 1.3.2.1 架构定义

 1.3.2.2 架构组成

 1.3.2.2.1 要素

 1.3.2.2.2 结构

1.3.2.2.3 连接

 1.3.2.3 总结

 1.3.2.4 我对架构的理解

 1.3.2.4.1 系统性思考的合理决策

 1.3.2.4.2 结构

1.3.2.4.3 连接

1.3.2.4.4 规范

 二、架构设计的目的

 2.1 无架构设计带来的问题

 2.1.1 应用服务的边界不是很清晰

 2.1.2 应用服务层次不清晰,系统耦合严重

 2.1.3 系统应用服务跟踪问题

 2.1.4 系统服务监控问题

2.1.5 技术体系失控问题

 2.2 架构设计的作用

 2.2.1 系统性思考的合理决策

 2.2.2 明确的系统骨架

 2.2.3 系统协作关系

 2.2.4 约束规范和指导原则

 2.3 架构设计的目的

 2.3.1 管理复杂性

 2.3.2 提高效率

 2.4 架构设计的前提条件

 2.4.1 需求相对复杂

 2.4.2 非功能性需求在整个系统占据重要位置

 2.4.3 系统生命周期长,有扩展性需求

 2.4.4 系统基于组件或者集成的需要

 2.4.5 业务流程再造的需要


一、架构是什么

在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。在不同的书籍上, 不同的作者, 对于架构的定义也不统一, 角度不同, 定义不同。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义, 因为概念是人认识这个世界的基础和用来沟通的手段,如果对架构概念理解不一样,那沟通起来自然不顺畅。

Linux 有架构,MySQL 有架构,JVM 也有架构,使用 Java 开发、MySQL 存储、跑在 Linux 上的业务系统也有架构,应该关注哪一个?想要清楚以上问题需要梳理几个有关系又相似的概念:系统与子系统、模块与组建、框架与架构。

 1.1 系统与子系统

 1.1.1 系统

泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能独立完成的工作能力的群体。

关键词:关联、规则、能力

1.1.1.1 关联

系统是由一群有关联的个体组成的,没有关联的个体堆在一起不能成为一个系统。例如,把一个发动机和一台 PC 放在一起不能称之为一个系统,把发动机、底盘、轮胎、车架组合起来才能成为一台汽车。

 1.1.1.2 规则

系统内的个体需要按照指定的规则运作,而不是单个个体各自为政。规则规定了系统内个体分工和协作的方式。例如,汽车发动机负责产生动力,然后通过变速器和传动轴, 将动力输出到车轮上,从而驱动汽车前进。

 1.1.1.3 能力

系统能力与个体能力有本质的差别,系统能力不是是个体能力之和,而是产生了新的能力。例如,汽车能够载重前进,而发动机、变速器、传动轴、车轮本身都不具备这样的能力。

1.1.2 子系统

也是由一群关联的个体组成的系统,多半是在更大的系统中的一部分。

 1.2 模块与组件

都是系统的组成部分,从不同角度拆分系统而已。模块是逻辑单元,组件是物理单元。

 1.2.1 模块

模块就是从逻辑上将系统分解, 即分而治之, 将复杂问题简单化。模块的粒度可大可小, 可以是系统,几个子系统、某个服务,函数, 类,方法、 功能块等等。划分模块的主要目的是职责分离。

 1.2.2 组件

组件可以包括应用服务、数据库、网络、物理机、还可以包括 MQ、容器、Nginx 等技术组件。划分组件的主要目的的是单元复用。"组件"的英文单词 Component,对应中文的"零件"一词,"零件"更容易理解一些。"零件"是一个物理的概念, 并且具备"独立且可替换"的特点。

 1.3 框架与架构

 1.3.1 框架

框架通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范, 也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。

框架是组件实现的规范,例如:MVC、MVP、MVVM 等,是提供基础功能的产品,例如开源框架:Ruby on Rails、Spring、Laravel、Django 等,这是可以拿来直接使用或者在此基础上二次开发。再例如,SpringMVC 是 MVC 的开发框架,除了满足 MVC 的规范,Spring 提供了很多基础功能来帮助我们实现功能,包括注解(@Controller 等)、Spring Security、SpringJPA 等很多基础功能。

 1.3.2 架构

 1.3.2.1 架构定义

在 TOGAF9 是这么定义:一个系统基本的构件(子系统, 模块, 组件),体现在它的各个构件、构件间的相互关系、构件与环境间的关系,以及对系统设计和演进进行治理的原则中。两种含义:

* 一个系统的形式化描述,或指导系统实现的构件级的详细计划;
* 一组构件的结构、构件间的相互关系、以及对这些构件的设计和随时间演进的过程进行治理的一些原则和指导策略。

架构从字面意思上,是源于古代的建筑术语。把架构拆分成两个字“架”和“构”。“架”就是“加”和“木”的结合,把木头加起来、连接起来就是架。“构”就是结构的意思。所以,“架构”就是把“木“按照一定的结构连接起来。

 1.3.2.2 架构组成

 1.3.2.2.1 要素

对应到软件架构,“木”代表构件(要素),“结构”代表架构的产物:

木就是系统中的要素,我们将他们称之为架构构件(要素)。架构要素可以是**子系统、模块、应用服务、组件**。

 1.3.2.2.2 结构

**结构**,是架构的产物。不同的软件系统会有不同的结构,这些结构是为解决不同场景而设计的。

1.3.2.2.3 连接

**连接**,通过定义架构元素之间的接口和交互关系、集成机制,实现架构元素之间的连接。连接可以是分布式调用、进程间调用、组件之间的交互关系等。

 1.3.2.3 总结

总结一下架构的组成 = 要素 + 结构 + 连接,将系统要素按照特定结构进行连接交互。

 1.3.2.4 我对架构的理解

我在这重新定义架构(见仁见智,自己独立思考):软件架构指软件系统顶层结构设计。架构是经过系统性地思考,权衡利弊之后在现有资源约束下的最合理决策,最终明确的系统骨架:包括子系统,模块, 组件。 以及他们之间协作关系,约束规范, 指导原则. 并由它来指导系统各方面的设计和指导团队中的每个人思想层面上的一致。

 1.3.2.4.1 系统性思考的合理决策

比如技术选型、解决实施方案(包括执行目标计划)、成本评估、性价比评估等等。

 1.3.2.4.2 结构

明确的系统骨架(结构):明确系统有哪些构件组成。

1.3.2.4.3 连接

系统协作关系:各个组成部分如何协作来实现业务请求。

1.3.2.4.4 规范

约束规范和指导原则:保证系统有序,高效、稳定运行,包括规范、原则、流程等内容。

 二、架构设计的目的

 2.1 无架构设计带来的问题

如果没有架构设计,说明你的系统不够复杂。随着业务的增长,系统由单体应用渐进演化为分布式和微服务化。系统整体的复杂性越来越高,技术团队可能从一个团队变成多个专业化团队。假如没有架构设计,系统定会是一个无序失控的状态。

 2.1.1 应用服务的边界不是很清晰

到底该怎么拆分没有一个明确的原则,研发人员为了所谓微服务化而拆分,而不是从当前业务考虑。导致系统无序的状态,开发效率低。

 2.1.2 应用服务层次不清晰,系统耦合严重

导致服务依赖出现网状依赖结构,牵一发动全身,后续修改和扩展困难。

 2.1.3 系统应用服务跟踪问题

由于微服务化后,系统逻辑复杂,服务出现问题后,你很难快速的定位问题和修复。比如之前我们踩过不少坑,我们使用 dubbo 服务化,系统一旦出现问题,一推人手忙脚乱。

 2.1.4 系统服务监控问题

由于研发人员基本没有服务监控意识,都是出现问题后再想办法如何添加服务监控接口。

2.1.5 技术体系失控问题

不同的开发团队使用不同的技术栈或者组件,造成公司内部的技术架构失控。甚至研发人员为追求时髦新潮技术,拿应用项目来试验新技术。

 2.2 架构设计的作用

架构设计的目的是为了解决系统复杂性带来的问题,其本质就是对系统进行有序化地重构以致符合当前业务的发展,并可以快速扩展。

 2.2.1 系统性思考的合理决策

 2.2.2 明确的系统骨架

 2.2.3 系统协作关系

 2.2.4 约束规范和指导原则

 2.3 架构设计的目的

架构的本质是管理和解决系统的复杂性,提高效率。

 2.3.1 管理复杂性

对系统进行有序化重构,不断减少系统的“熵”,使系统不断进化,改善软件质量为目的的内在结构性变化

 2.3.2 提高效率

对系统进行有序化重构,以符合当前业务的发展,并可以快速扩展。

 2.4 架构设计的前提条件

无论是何种变化,架构师通过理解业务,全局把控,权衡业务需求和技术实现,选择合适技术,解决关键问题、指导研发落地实施,促进业务发展,提高效率。那什么样的系统要考虑做架构设计? 技术不会平白无故的出和自驱动发展起来,而架构的发展和需求是基于业务的驱动。

 2.4.1 需求相对复杂

 2.4.2 非功能性需求在整个系统占据重要位置

 2.4.3 系统生命周期长,有扩展性需求

 2.4.4 系统基于组件或者集成的需要

 2.4.5 业务流程再造的需要

如果觉得对您有帮助,欢迎点赞+收藏+关注!

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

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

相关文章

从零开始理解Linux中断架构(23)中断运行临界区和占先调度

Linux在内核中定义了6种运行临界区。 in_interrupt in_interrupt在驱动中使用频率最高的函数了,in_interrupt()就是指示Core是否正在中断处理中,包含了硬中断,软中断运行临界区。如果在中断处理中,则不能调用__do_softirq执行软中断处理。硬中断中不可调度不可中断,所有…

Linux vsftp三种模式的简单配置部署

环境:Debian 6.1.27-1kali1 (2023-05-12) vsftpd 安装 --查看是否当前系统是否已安装 apt list --installed | grep vsftpd 没有安装的话,就正常安装 apt-get update apt-get install vsftpd 一、匿名用户模式 分享一些不重要文件,任…

Android 通用带箭头提示窗

简介 自定义PopupWindow, 适用于提示类弹窗。 使用自定义Drawable设置带箭头的背景,测试控件和弹窗的尺寸,自动设置弹窗的显示位置,让箭头指向锚点控件的中间位置,且根据锚点控件在屏幕的位置,自动适配弹窗显示位置。…

C++——STL容器之list链表的讲解

目录 一.list的介绍 二.list类成员函数的讲解 2.2迭代器 三.添加删除数据: 3.1添加: 3.2删除数据 四.排序及去重函数: 错误案例如下: 方法如下: 一.list的介绍 list列表是序列容器,允许在序列内的任何…

css实现鼠标滑动左下角弹框带动画效果

代码 <div classNamekuang></div> css代码 .kuang {height: 500px;width: 400px;// background-color: #fff;position: absolute;z-index: 10;bottom: 0;transform: translateX(-390px)}.kuang:hover {animation: myanimation 3s linear 1;animation-fill-mode:f…

Flowable-中间事件-空中间抛出事件

定义 空中间抛出事件是一个 Throwing 事件&#xff0c;在 intermediateThrowEvent 元素下不加入任何的事件定 义元素&#xff0c;就构成一个空中间抛出事件。它通常用于表示流程中的某个状态&#xff0c;在实际使用的过程中可 以通过添加执行监听器&#xff0c;来表示流程状态…

算法通关村第二关——两两交换链表中的节点的问题解析

题目类型 链表反转 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点&#xff0c;且必须在不修改节点内部的值的情况下完成本题&#xff0c;即&#xff1a;只能进行节点交换 效果图 题目分析 如果原始顺序是 dummy(虚拟头节点) …

Linux学习之系统函数库

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64&#xff0c;bash --version可以bash的版本是4.2.46。 在/etc/init.d/functions有许多系统定义好的函数&#xff0c;比如…

基于ChatGPT聊天的零样本信息提取7.25

基于ChatGPT聊天的零样本信息提取 摘要介绍ChatIE用于零样本IE的多轮 QA 实验总结 摘要 零样本信息提取&#xff08;IE&#xff09;旨在从未注释的文本中构建IE系统。由于很少涉及人类干预&#xff0c;因此具有挑战性。 零样本IE减少了数据标记所需的时间和工作量。最近对大型…

DevOps-Jenkins

Jenkins Jenkins是一个可扩展的持续集成引擎&#xff0c;是一个开源软件项目&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 官网 应用场景 场景一 研发人员上传开发好的代码到github代码仓库需要将代码下载nginx服务器部署手动下载再…

递归实现 组合问题+排列问题(DFS)

目录 递归实现排列型枚举 递归实现排列类型枚举 II 递归实现组合型枚举 递归实现组合型枚举 II 递归实现指数型枚举 递归实现指数型枚举 II 递归不是循环&#xff0c;递归利用了系统栈&#xff0c;只要是函数都会被系统管理。当执行到函数地址入口时就会为函数在系统栈上分…

mac 删除自带的ABC输入法保留一个搜狗输入法,搜狗配置一下可以减少很多的敲击键盘和鼠标点击次数

0. 背景 对于开发者来说&#xff0c;经常被中英文切换输入法所困扰&#xff0c;我这边有一个方法&#xff0c;删除mac默认的ABC输入法 仅仅保留搜狗一个输入法&#xff0c;配置一下搜狗输入&#xff1a;哪些指定为英文输入&#xff0c;哪些指定为中文输入&#xff08;符号也可…

wps图表怎么改横纵坐标,MLP 多层感知器和CNN卷积神经网络区别

目录 wps表格横纵坐标轴怎么设置&#xff1f; MLP (Multilayer Perceptron) 多层感知器 CNN (Convolutional Neural Network) 卷积神经网络 多层感知器MLP&#xff0c;全连接网络&#xff0c;DNN三者的关系 wps表格横纵坐标轴怎么设置&#xff1f; 1、打开表格点击图的右侧…

arm 函数栈回溯

大概意思就是arm每个函数开始都会将PC、LR、SP以及FP四个寄存器入栈。 下面我们看一下这四个寄存器里面保存的是什么内存 arm-linux-gnueabi-gcc unwind.c -mapcs -w -g -o unwind&#xff08;需要加上-mapcs才会严格按照上面说的入栈&#xff09; #include <stdio.h> …

Android 面试题 线程间通信 六

&#x1f525; 主线程向子线程发送消息 Threadhandler&#x1f525; 子线程中定义Handler&#xff0c;Handler定义在哪个线程中&#xff0c;就跟那个线程绑定&#xff0c;在线程中绑定Handler需要调用Looper.prepare(); 方法&#xff0c;主线程中不调用是因为主线程默认帮你调用…

怎么在线修改图片?分享一个图片修改工具

无论是在个人或商业领域&#xff0c;我们都需要使用高质量的图片来传达信息或提高品牌形象。大尺寸的图片也会占据大量的存储空间和带宽&#xff0c;影响网站的加载速度和用户体验。因此&#xff0c;我们需要一种高效的工具来解决这个问题。今天向大家介绍一款非常实用的图片处…

Abaqus 导出单元刚度矩阵和全局刚度矩阵

Abaqus 导出单元刚度矩阵和全局刚度矩阵 首次创建&#xff1a;2023.7.29 最后更新&#xff1a;2023.7.29 如有什么改进的地方&#xff0c;欢迎大家讨论&#xff01; 详细情况请查阅&#xff1a;Abaqus Analysis User’s Guide 一、Abaqus 导出单元刚度矩阵 1.生成单元刚度矩阵…

Linux CentOS快速安装VNC并开启服务

以下是在 CentOS 上安装并开启 VNC 服务的步骤&#xff1a; 安装 VNC 服务器软件包。运行以下命令&#xff1a; sudo yum install tigervnc-server 输出 $ sudo yum install tigervnc-server Loaded plugins: fastestmirror, langpacks Repository epel is missing name i…

教雅川学缠论04-笔

笔由3部分组成&#xff1a; 顶分型K线底分型&#xff0c;或者 底分型K线顶分型 注意&#xff1a;笔加一起至少7根K线&#xff0c;因为一个底分型至少3根&#xff0c;K先至少1个&#xff0c;顶分型至少3根 下图中红色线段就是一个标准的笔&#xff0c;它始于一个底分型&#xff…

Visual C++中的虚函数和纯虚函数(以外观设计模式为例)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C学不下去的时候&#xff0c;就用JAVA实现同样的代码&#xff0c;然后再用对比的方法把C学会。 直接说虚函数…