认识什么是架构

目录

​编辑 

一、架构是什么

 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 业务流程再造的需要

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

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

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

相关文章

苹果电脑系统优化工具:Ventura Cache Cleaner for mac

Ventura Cache Cleaner for Mac是一款专门为苹果电脑开发的系统优化工具,旨在帮助用户清理和优化Mac电脑,提高系统性能和速度。该软件由美国公司Northern Softworks开发,已经推出了多个版本,适用于不同版本的Mac操作系统。 Ventu…

在Ubuntu 系统下开发GUI,用哪种开发工具比较好?

在Ubuntu系统下开发GUI,你可以考虑使用以下几种开发工具:Qt Creator:Qt Creator是一个跨平台的集成开发环境,专门用于开发基于Qt框架的应用程序。它提供了丰富的图形界面设计工具和代码编辑器,支持C和QML编程。Qt Crea…

REST API的基础:HTTP

在本文中,我们将深入探讨万维网数据通信的基础 - HTTP。 什么是超文本? HTTP(超文本传输协议)的命名源于“超文本”。 那么,什么是超文本? 想象一下由超链接组成的文本、图像和视频的混合物。这些链接充当我…

【2023.7.29】本文用于自己写文章时查看Markdown编辑器语法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

texshop mac中文版-TeXShop for Mac(Latex编辑预览工具)

texshop for mac是一款可以在苹果电脑MAC OS平台上使用的非常不错的Mac应用软件,texshop for mac是一个非常有用的工具,广泛使用在数学,计算机科学,物理学,经济学等领域的合作,这些程序的标准tetex分布特产…

产品经理如何平衡用户体验与商业价值?

近期负责前端产品设计工作的小李忍不住抱怨:公司总是要求客户第一,实现客户良好体验,但在实际操作过程中,面向用户 体验提升的需求,研发资源计划几乎很难排上,资源都放在公司根据业务价值排序的需求…

Verilog语法学习——LV5_位拆分与运算

LV5_位拆分与运算 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 题目描述: 现在输入了一个压缩的16位数据,其实际上包含了四个数据…

uniapp 语音文本播报功能

最近uniapp项目上遇到一个需求 就是在接口调用成功的时候加上语音播报 , ‘创建成功’ ‘开始成功’ ‘结束成功’ 之类的。 因为是固定的文本 ,所以我先利用工具生成了 文本语音mp3文件,放入项目中,直接用就好了。 这里用到的工…

VoxPoser:使用大语言模型(GPT-4)来对机器人操作的可组合三维值图【论文解读】

这是最近斯坦福的李飞飞团队的一篇论文:VoxPoser: Composable 3D Value Maps for Robotic Manipulation with Language Models 主要是通过大语言模型LLM和视觉语言模型VLM结合,来对机器人做各种日常操作,我们可以先来看下实际效果:大语言模型…

2023牛客多校第三场 B.Auspiciousness

传送门 前题提要:没得说,赛时根本没想到dp,赛后翻各大题解看了很久,终于懂了dp的做法,故准备写一篇题解. 首先,先定义一下我们的 d p dp dp方程,考虑将处于 [ 1 , n ] [1,n] [1,n]的数当做小数,将处于 [ n 1 , 2 ∗ n ] [n1,2*n] [n1,2∗n]的数当做大数.那么对于我们的摸牌结…

使用低代码开发,需要注意哪些?

低代码平台的历史相对较短,大约始于 2000 年初,源于快速应用程序开发工具。随着低代码平台和工具的日益普及和优势,它不断发展以满足各种领域和角色的需求。 本文将研究各种低代码和无代码应用程序开发方法、业务用例、挑战和未来预测等。 一…

java重试机制实现方案

本文内容是目前团队内小磊同学对重试机制实现方案的梳理总结。 从为什么需要重试的背景开始,到重试的场景,大致的一些设计思路,最后通过两个成熟的retry组件进行案例讲解,理论实战。 背景 重试是系统提高容错能力的一种手段。在一…

LeetCode208.Implement-Trie-Prefix-Tree<实现 Trie (前缀树)>

题目: 思路: tire树,学过,模板题。一种数据结构与算法的结合吧。 代码是: //codeclass Trie { private:bool isEnd;Trie* next[26]; public:Trie() {isEnd false;memset(next, 0, sizeof(next));}void insert(strin…

区块链服务网络的顶层设计与应用实践

日前,2023全球数字经济大会专题论坛:Web3.0发展趋势专题论坛暨2023区块链、元宇宙蓝皮书发布会在北京举行。本次论坛上隆重发布了《中国区块链发展报告(2023)》,对我国区块链行业在2022年的发展状况进行了总结梳理&…

springboot中配置bpmsjs插件-activiti7流程图绘制插件/IDEA中运行bpmnjs

BPMNJS的安装和使用需要依赖nodejs插件,需要先安装NODEJS,因为bpmnjs插件的运行需要使用到NODEJS中的npm命令。 安装nodejs 安装和使用bpmnjs插件,绘制activiti工作流需要的流程图。 1、安装和配置nodejs 2.1、下载nodejs https://nodejs.org/en 1.2、安装nodejs,默认安…

MacDroid for Mac:在Mac上访问和传输Android文件的最简单方式

MacDroid for Mac是一款帮助用户在Mac和Android设备之间传输文件的软件。由于Mac OS X本身并不支持MTP协议,所以透过USB将Android设备连接到Mac电脑上是无法识别的,更别说读取里面的文件了。 MacDroid可以帮助您轻松搞定这个问题,您可以将An…

【Python】数据分析+数据挖掘——探索Pandas中的索引与数据组织

前言 在数据科学和数据分析领域,Pandas是一个备受喜爱的Python库。它提供了丰富的数据结构和灵活的工具,帮助我们高效地处理和分析数据。其中,索引在Pandas中扮演着关键角色,它是一种强大的数据组织和访问机制,使我们…

【JavaWeb】正则表达式

🎄欢迎来到边境矢梦的csdn博文,本文主要讲解Java 中正则表达式 的相关知识🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下🫰🫰&am…

spring启动流程 (6完结) springmvc启动流程

SpringMVC的启动入口在SpringServletContainerInitializer类,它是ServletContainerInitializer实现类(Servlet3.0新特性)。在实现方法中使用WebApplicationInitializer创建ApplicationContext、创建注册DispatcherServlet、初始化ApplicationContext等。 SpringMVC…

Selenium多浏览器处理

Python 版本 #导入依赖 import os from selenium import webdriverdef test_browser():#使用os模块的getenv方法来获取声明环境变量browserbrowser os.getenv("browser").lower()#判断browser的值if browser "headless":driver webdriver.PhantomJS()e…