程序员必知的 七 种软件架构模式!

2023-11-10

一种模式就是特定上下文的问题的一种解决方案。

然而,很多开发者至今还对各种软件架构模式之间的差别搞不清,甚至对其所知甚少。

大体上,主要有下面这7种架构模式:

  • ① 分层架构

  • ② 多层架构

  • ③ 管道 - 过滤器架构

  • ④ 客户端 - 服务器架构

  • ⑤ 模型 - 视图 - 控制器架构

  • ⑥ 事件驱动架构

  • ⑦ 微服务架构

一、分层架构模式

最常见的架构模式就是分层架构或者称为 n 层架构。

大部分软件架构师、设计师和开发者都对这个架构模式非常熟悉。尽管对于层的数量和类型没有具体限制,但大部分分层架构主要由四层组成:展现层、业务层、持久层和数据库层,如下图所示:ba49f90e2a5c351584603e099776ddfa.png

1、上下文

所有复杂的系统都会经历独立地发展和衍化系统各个部分的需要。出于这个原因,系统开发者需要对关注点进行清晰且条理分明的分离,以便系统的各个模块可以独立地开发和维护。

2、问题

软件需要以这样一种方式分割:各个模块可以独自开发和衍化,各自部分之间的交互非常少,支持可移植性、可修改性和复用性。

3、方案

为了实现关注点分离,分层模式将软件分割成各个单元(称为“层”)。每一层都是一组模块,提供了一组高内聚的服务。其使用必须是单向的。层将一组软件作为一个完整的分区,每个分区暴露一个公开接口。

  • ✪ 第一个概念是,每一层都有特定的角色和职责。例如,展现层负责处理所有的用户界面。分层架构的这种关注点分离,让构建高效的角色和职责非常简单。

  • ✪ 第二个概念是,分层架构模式是一个技术性的分区架构,而非一个领域性的分区架构。它们是由组件组成的,而不是领域。

  • ✪ 最后一个概念是,分层架构中的每一层都被标记为封闭或者开放。封闭层意味着请求从一层移到另一层,它必须通过它正下面的这一层才能达到下面这一层的再下一层。请求不能跳过任何层。262ce3bd009cedd845d0d0d6dacc7cf0.png

4、弱点

分层会导致性能下降。这种模式不适合高性能应用程序,因为经过架构中的多层来实现一个业务请求的效率是不高的。

分层还会增加系统的前期成本和复杂性。

5、用途

我们应该将这种方式应用于小型简单的应用程序或网站。对于预算和时间非常紧张的场景,这是一个不错的选择。

二、多层模式

方案:

fe11e941343a3849bf84b59e7e8b6f5e.png许多系统的执行结构被组织成一系列逻辑组件分组。每个分组被称为一个层。

1、上下文

在一个分布式部署中,通常需要将系统的基础设施分到不同的子集中。

2、问题

我们如何将系统分割到多个计算上独立的执行结构:由一些通信媒介连接的软件和硬件组?

3、弱点

大量前期成本和复杂性。

4、用途

用在分布式系统中。

三、管道-过滤器架构

软件架构中反复出现的一种模式是管道 - 过滤器(pipe-filter)模式。453e9ffd550ae7870e1fe43ae530318a.png

1、上下文

许多系统需要转换从输入到输出的离散数据流。许多类型转换在实践中重复出现,因此将其创建成独立的可复用的部分,这是比较理想的。

2、问题

这些系统需要被分割成可复用的松耦合的组件,组件之间拥有简单通用的交互机制。这样它们就可以灵活地相互结合。这些通用松耦合的组件就很容易复用。那些独立的组件可以并行执行。

3、方案

这种架构中的管道构成了过滤器之间的通信通道。第一个概念是,由于性能原因,每个管道都是非定向的和点对点的,接受来自一个源的输入并经常直接输出到另外一个源。

在这种模式中,有如下四种过滤器。

  • ✪ producer(source):一个过程的起点。

  • ✪ transformer (map):对一些或所有数据进行转换。

  • ✪ tester (reduce):测试一个或多个条件。

  • ✪ consumer (sink):终点。

4、弱点

不太适合交互性的系统,因为它们的转换特性。

过多的解析和反解析会导致性能损失,也会增加编写过滤器本身的复杂性。

5、用途

管道 - 过滤器架构用于各种应用程序,特别是简化单项处理的任务,例如 EDI、ETL 工具。

编译器:连续的过滤器执行词法分析、语法分析、语义分析和代码生成。

四、客户端-过滤器架构

6d3629250193e37ea00b9a3886549576.png

1、上下文

有许多共享资源和服务是大量分布式的客户端希望访问的,我们希望控制访问或服务质量。

2、问题

通过管理一组共享资源和服务,我们可以通过分解公共服务并在单个位置或少数位置进行修改来提高可修改性和复用性。我们想要通过在将资源本身分布在多个物理服务器上的同时集中控制这些资源和服务,来提高可伸缩性和可用性。

3、方案

在客户端 - 服务器模式中,组件和连接器具有特定的行为。

称为“客户端”的组件将请求发送到称为“服务器”的组件,然后等待回复。

服务器组件接收到客户端的请求并向其发送回复。

4、弱点

服务器会成为性能瓶颈和单点故障位置。

在系统建成后,关于功能位置(在客户端还是在服务器)的决策通常是复杂的而且变动成本很大。

5、用途

对于有许多组件(客户端)发送请求到另外一些提供服务的组件(服务器)的系统,我们可以使用客户端 - 服务器模式来建模这个系统的一部分:在线应用程序,例如电子邮件、共享文档或银行服务。

五、模型-视图-控制器架构(MVC)

9c4e5ea6e126c0bd498622f8c5c7ea1e.png

1、上下文

用户界面通常是一个交互性应用程序的最频繁被修改的部分。用户通常希望从不同的视角查看数据,例如柱状图或者饼图。这些表示形式都应该反映数据当前的状态。

2、问题

用户界面功能如何独立于应用程序功能,同时还还对用户输入或底层应用程序数据的更改做出响应?

当底层应用程序数据更改时,如何创建、维护和协调用户界面的多个视图?

3、方案

模型 - 视图 - 控制器(model-view-controller,即 MVC)模式将应用程序功能分为以下三种类型的组件:

  • ✪ 模型,包含应用程序的数据。

  • ✪ 视图,显示部分底层数据并与用户交互。

  • ✪ 控制器,在模型和视图之间进行中介并管理状态更改的通知。

4、弱点

对于简单的用户界面,其复杂性并不值得这么做。

模型、视图和控制器抽象可能不适用于某些用户界面工具包。

5、用途

MVC 是网站或移动应用程序开发用户界面常用的一种架构模式。

六、事件驱动架构

1、上下文

需要提供计算和信息资源来处理传入的应用程序生成的独立异步事件,这种方式可以随着需求的增加而扩展。

2、问题

构建分布式系统,这个系统可以服务异步到达的事件相关信息,并且能从简单小型扩展到复杂大型。

3、方案

566e01155c97d3263ed605b4ef22f48c.png为事件处理部署独立的事件进程或处理器。到达的事件进入队列。调度程序根据调度策略从队列中拉取事件并将它们分配到合适的事件处理器。

4、弱点

性能和错误恢复可能是问题。

5、用途

使用这个方案的电商应用程序将工作如下:

Order Service 创建一个 Order,这个订单处于待定状态,然后发布一个OrderCreated事件。

  • ✪ Customer Service 接收到这个事件并尝试为这个 Order 扣除信用。然后发布一个 Credit Reserved 事件或者CreditLimitExceeded(超出信用限额)事件。

  • ✪ Order Service 接收到 Customer Service 发送的事件并将订单状态更改为已核准或已取消。

七、微服务架构

1、上下文

部署基于服务器的企业应用程序,支持各种浏览器和原生移动客户端。应用程序通过执行业务逻辑、访问数据库、与其它系统交换信息并返回响应来处理客户端请求。这个应用程序可能会暴露一个第三方 API。

2、问题

一体化应用程序会变得过于庞大和复杂,无法得到有效支持和部署来实现最优的分布式资源利用,例如在云环境中。

3、方案

将应用程序构建成服务套件。每个服务都是独立部署和可扩展的,拥有自己的 API 边界。不同的服务可以用不同的编程语言编写,管理它们自己的数据库,由不同的团队开发。868454e35082565b6f8698ac85209c2e.png

4、弱点

系统设计必须能容忍服务失败,需要更多的系统监控。服务编排和事件协作开销比较大。当然,我们还需要更多钱。

5、用途

许多使用场景都可以应用微服务架构,特别是那些涉及大量数据管道的场景。例如,一个微服务系统对关于一个公司的零售店销售的报表系统会比较理想。数据展现过程的每一步都会被一个微服务处理:数据收集、清理、规范化、浓缩、聚合、报告等。

Tip: 如需转载,请在顶部插入 React 中文社区 公众号

总结

最后, 送人玫瑰,手留余香,觉得有收获的朋友可以点赞,关注一波 ,文档资料 已上传至 React 中文社区交流群, 请关注公众号,点击菜单栏 入群学习,添加 入群小助手 后入群领取。陆续更新前端超硬核文章。

推荐阅读

(点击标题可跳转阅读)

[极客前沿]-你不知道的 React 18 新特性

[极客前沿]-写给前端的 K8s 上手指南

[极客前沿]-写给前端的Docker上手指南

[面试必问]-你不知道的 React Hooks 那些糟心事

[面试必问]-一文彻底搞懂 React 调度机制原理

[面试必问]-一文彻底搞懂 React 合成事件原理

[面试必问]-全网最简单的React Hooks源码解析

[面试必问]-一文掌握 Webpack 编译流程

[面试必问]-一文深度剖析 Axios 源码

[面试必问]-一文掌握JavaScript函数式编程重点

[面试必问]-阿里,网易,滴滴,头条等20家面试真题

[面试必问]-全网最全 React16.0-16.8 特性总结

[架构分享]- 微前端qiankun+docker+nginx自动化部署

[架构分享]-石墨文档 Websocket 百万长连接技术实践

[自我提升]-Javascript条件逻辑设计重构

[自我提升]-页面可视化工具的前世今生

[自我提升]-10分钟快速构建错误监控系统

[大前端之路]-连前端都看得懂的《Nginx 入门指南》

[软实力提升]-金三银四,如何写一份面试官心中的简历

觉得本文对你有帮助?请分享给更多人

关注「React中文社区」加星标,每天进步

761dbb5bfc487f90f00e6e9dcb5401f1.png   点个

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序员必知的 七 种软件架构模式! 的相关文章

  • 一行Python和SQLite代码,为什么需要加“,”? [复制]

    这个问题在这里已经有答案了 c execute INSERT INTO numbers VALUES random randint 0 100 如果我将上面的代码更改为 c execute INSERT INTO numbers VALUE
  • 如何从 Python 中指定运行程序的输入文件?

    我正在编写一个外部脚本 以通过笔记本电脑上的 Python mrjob 模块 而不是在 Amazon Elastic Compute Cloud 或任何大型集群上 运行 mapreduce 作业 我读自mrjob文档 http packag
  • Django - 电子邮件发送两次

    每当我使用如下所示的电子邮件设置从views py调用下面的方法时 电子邮件的两份副本都会发送给收件人 并且我收到如下所示的错误 def sendEmailBasic request msg EmailMessage Request Cal
  • 在Python中删除带有重音符号的字符串中的所有非字母字符

    我正在尝试使用 Python 3 7 从包含重音符号的字符串中删除所有非字母字符 空格除外 我尝试了以下方法 import re text 29 1981 4 2008 clean text re sub W d text print cl
  • RuntimeError: 预期所有张量都在同一设备上,但发​​现至少有两个设备,cpu 和 cuda:0!使用我的模型进行预测时

    我使用变压器训练了一个序列分类模型 BertForSequenceClassification 我收到错误 预计所有张量都在同一设备上 但发 现至少有两个设备 cpu 和 cuda 0 在方法wrapper index select中检查参
  • 在 matplotlib 中使用 yscale('log') 时缺少误差线

    在某些情况下 当使用对数刻度时 matplotlib 会错误地显示带有误差条的图 假设这些数据 例如在 pylab 内 s 19 0 20 0 21 0 22 0 24 0 v 36 5 66 814250000000001 130 177
  • Python 视频框架

    我正在寻找一个 Python 框架 它将使我能够播放视频并在该视频上绘图 用于标记目的 我尝试过 Pyglet 但这似乎效果不是特别好 在现有视频上绘图时 会出现闪烁 即使使用双缓冲和所有这些好东西 而且似乎没有办法在每帧回调期间获取视频中
  • Matplotlib 图例不工作

    自从升级 matplotlib 以来 每当尝试创建图例时 我都会收到以下错误 usr lib pymodules python2 7 matplotlib legend py 610 UserWarning Legend does not
  • Python正则表达式从字符串中获取浮点数

    我正在使用正则表达式来解析字符串中的浮点数 re findall a zA Z d d t 是我使用的代码 这段代码有问题 如果数字和任何字符之间没有空格 则不会解析该数字 例如 0 1 2 3 4 5 6 7 8 9 的预期输出为 0 1
  • 当另一个线程发生事情时从主线程获取数据?

    目前我有一个线程正在运行一个侦听连接的套接字 当它收到连接时 它需要上传在主线程中收集的数据 即从主线程获取数据 但是 我传递了对象的实例 但它从未使用等待连接时收集的数据进行更新 有没有正确的方法来做到这一点 我用谷歌搜索了一下 似乎找不
  • 在 HttpClient4 中使用 PoolingHttpClientConnectionManager 的正确方法出现问题 java.lang.IllegalStateException: 连接池关闭

    我正在 Java 中利用 HTTPclient4 发送 HTTP 请求并处理 HTTP 响应 我想使用连接池来提高性能 但我无法找到合适的方法来做到这一点 我正在 Java 中利用 HTTPclient4 发送 HTTP 请求并处理 HTT
  • Django 接受 AM/PM 作为表单输入

    我试图弄清楚如何使用 DateTime 字段在 Django 中接受 am pm 作为时间格式 但我遇到了一些麻烦 我尝试在 forms py 文件中这样设置 pickup date time from DateTimeField inpu
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • 如何正确消除字典中的元素直到只剩下一个字符串

    我真的需要这方面的帮助 def get winner dict winner new dict for winner in dict winner first letter winner 0 value dict winner winner
  • 如何手动添加Android Studio依赖

    我多次尝试向我的项目添加依赖项 但每次都会出现错误 我想添加它们的依赖项是 de hdodenhof circleimageview 1 3 0 and com github bumptech glide glide 3 6 1 所以我想下
  • scipysolve_ivp() 中的访问时间步长

    我有一个常微分方程系统 正在使用 scipy 的solve ivp 函数求解 它运行良好 但我在访问每个步骤中使用的时间步时遇到问题 我知道solve ivp 将当前时间传递给用户定义的函数 但我需要使用的时间步长 而不是当前时间 为了解决
  • 在Python中从日期时间中减去秒

    我有一个 int 变量 它实际上是秒 让我们调用这个秒数X 我需要得到当前日期和时间 以日期时间格式 减去的结果X秒 Example If X是 65 当前日期是2014 06 03 15 45 00 那么我需要得到结果2014 06 03
  • 在游戏中实现功能

    我在完成这部分作业时遇到了麻烦 我必须宣布游戏的获胜者 然后输入到函数中 输入所有 if 语句后 我必须创建一个函数def playGame 这必须包括 showRules user getUserChoice computer getCo
  • Python 枚举子集迭代

    我想迭代以下枚举的子集 class Items enum Enum item1 0 item2 1 item3 2 item4 3 item5 4 item6 5 item7 6 item8 7 说我想 for item in Items
  • 在 Vavr 中结合任一者?

    我有几个Vavr https www vavr io Either https www vavr io vavr docs either的 我想调用一个函数Right每个 Either 的值 例如 Either

随机推荐

  • unity导入的模型无法编辑材质球属性

    有时候美术做好的模型导入到unity 发现无法编辑材质的shader 如图 选中对应的模型 在inspector面板上更改一个设置 一般就可以了 将location从use embedded materials 改成use external
  • Java原始客户端操作Mongodb 增删改查

    Document方式操作增删改查 1 导入Pom依赖 2 java客户端代码 1 导入Pom依赖
  • 全面理解网络流中的最大流问题

    网络流 最大流问题 前序 在将网络里实现算法之前 我们得聊聊网络流究竟是个什么东西 毕竟只有知道它的样貌 才能继续看懂下面的定义 对吧 首先 网络流不仅仅指的是什么FF算法 dinic算法 算法只是用来解决问题的 稍后我们会更加能体会这一点
  • 移动构造-C++11

    移动构造 移动构造是C 11标准中提供的一种新的构造方法 在现实中有很多这样的例子 我们将钱从一个账号转移到另一个账号 将手机SIM卡转移到另一台手机 将文件从一个位置剪切到另一个位置 移动构造可以减少不必要的复制 带来性能上的提升 有些复
  • 查询每门课程成绩都大于80分学生的姓名

    转载的sql语句 1 查询每门课程成绩都大于80分学生的学号 数据库 表 student name score course A 85 语文 A 75 数学 A 82 英语 B 75 语文 B 89 数学 B 79 英语 天使美眉90 语文
  • Flutter报错之Waiting for another flutter command to release the startup lock解决方案

    问题引入 通过命令行执行 flutter devices 或其他flutter命令时 报错如下 Waiting for another flutter command to release the startup lock 解决方案 关闭A
  • 不用看网课就能学到python的文章(第一天)

    为什么要学python 在大数据时代 抖音快手火爆全球 作业帮小猿搜题的数据库 都离不开大数据 大数据的科学计算 最重要的语言就是python 网络爬虫 网络爬虫 搜狗百科 搜索引擎等等也主要是python 包括一些游戏图像等等都缺少不了p
  • Windows7在Eclipse中配置Python+OpenCV

    1 从http www oracle com technetwork java javase downloads jdk 7u2 download 1377129 html下载jdk 7u2 windows i586 exe 安装到D Pr
  • 简单介绍Roop(类似SimSwap)项目

    文章目录 一 关于Roop 二 安装Roop CPU 2 1 克隆仓库 2 2 设置python国内源 2 2 检查安装virtualenv 2 3 创建项虚拟环境 2 5 安装项目依赖 2 6 下载必要文件 三 运行Roop CPU 四
  • 论文解读《SOLO: Segmenting Objects by Locations》

    实例分割属于比较challenging的任务 他相当于是object detection和semantic segmentation的结合体 在SOLO出现之前 有两种常用的paradigm 1 top down 先进行目标检测 再对检测框
  • mysql中TINYINT的取值范围

    项目场景 最近在开发过程中 看见表设计中是thinyint字段 但对于它的范围产生了好奇 问题描述 当我们填写超过128数值的时候 该字段就会报以下错误 Cause com mysql jdbc MysqlDataTruncation Da
  • 62_Pandas有条件地提取 pandas.DataFrame 的行

    62 Pandas有条件地提取 pandas DataFrame 的行 使用query 方法根据pandas DataFrame的列值的条件提取行 它很方便 因为您可以使用比较运算符和字符串方法以及多个条件的组合来简洁地描述条件规范 目录
  • -bash: /etc/profile: line 11: syntax error near unexpected token `$'{\r''报错问题解决

    在Linux系统配置Java环境变量之后执行 source etc profile指令报 bash etc profile line 11 syntax error near unexpected token r 如下图 错误提示信息已经反
  • dlmalloc解析连载一

    dlmalloc是目前一个十分流行的内存分配器 其由Doug Lea 主页为 http gee cs oswego edu 从1987年开始编写 到目前为止 最新版本为2 8 3 可以从 ftp g oswego edu pub misc
  • 对计算机硬件维护的方法,计算机硬件维护方法

    计算机硬件维护方法 随着科技的不断发展 计算机应用率越来越高 在社会生活的各个领域均有广泛的应用 下面是小编分享的计算机硬件维护方法 一起来看一下吧 计算机常见的硬件故障主要包括内存条损坏 主板元器件损坏 硬盘损坏等 计算机硬件出现故障 一
  • 黑马程序员--分布式搜索ElasticSearch学习笔记

    写在最前 黑马视频地址 https www bilibili com video BV1LQ4y127n4 想获得最佳的阅读体验 请移步至我的个人博客 SpringCloud学习笔记 消息队列MQ学习笔记 Docker学习笔记 分布式搜索E
  • CENTOS环境Apache最新版本httpd-2.4.54编译安装

    一 下载 Apache至少需要apr apr util pcre组件的支持 cd usr local src wget http dlcdn apache org apr apr 1 7 0 tar gz wget http dlcdn a
  • 微信小程序心得体会

    1 微信小程序诞生的前景 1 受到手机内存的限制 用户无法下载诸多app 2 用户为了简洁性不愿意下载app 3 微信用户的日益增加 2 微信小程序的特点 微信小程序的理念是 触手可及 用完即走 是一种不需要下载安装即可使用的应用 一次开发
  • SpringBoot 项目健康检查与监控

    转载 https www cnblogs com javanoob p springboot healthcheck html 前言 You build it You run it 当我们编写的项目上线后 为了能第一时间知晓该项目是否出现问
  • 程序员必知的 七 种软件架构模式!

    一种模式就是特定上下文的问题的一种解决方案 然而 很多开发者至今还对各种软件架构模式之间的差别搞不清 甚至对其所知甚少 大体上 主要有下面这7种架构模式 分层架构 多层架构 管道 过滤器架构 客户端 服务器架构 模型 视图 控制器架构 事件
Powered by Hwhale