架构师分享 7 种软件设计架构 (文末送书)

2023-10-27

文末留言送书5本

架构模式是对给定上下文的软件架构中常见问题的一种通用的可复用的解决方案。

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

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

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

  1. 分层架构

  2. 多层架构

  3. 管道/过滤器架构

  4. 客户端/服务器架构

  5. 模型/视图/控制器架构

  6. 事件驱动架构

  7. 微服务架构

1分层架构模式

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

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

efc443d2a1a70edabf253cd83b82a7df.png一个很流行的 n 层架构示例

 1 上下文 

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

 2 问题 

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

 3 方案 

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

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

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

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

29d357ec1edb0cc15fa198fd712871bc.png封闭层和请求访问

 4 弱点 

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

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

 5 用途 

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

2多层模式

 1 方案 

adf63d38cca5851e4c7e4745f97c3c6b.jpeg一个多层模式示例:消费者网站 J2EE

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

 1 上下文 

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

 2 问题 

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

 3 弱点 

大量前期成本和复杂性。

 4 用途 

用在分布式系统中。

3管道、过滤器架构

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

5ea2607c2bfe04872d863a56dcaa0831.jpeg管道过滤器模式

 1 上下文 

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

 2 问题 

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

 3 方案 

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

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

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

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

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

  • consumer (sink):终点。

 4 弱点 

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

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

 5 用途 

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

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

4客户端、过滤器架构

b99a06488169f13fd00c6c2254a925d1.jpeg

 1 上下文 

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

 2 问题 

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

 3 方案 

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

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

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

 4 弱点 

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

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

 5 用途 

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

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

e4170b4fff9a4e6f15c6d0cc987e0189.png

 1 上下文 

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

 2 问题 

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

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

 3 方案 

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

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

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

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

 4 弱点 

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

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

 5 用途 

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

6事件驱动架构

 1 上下文 

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

 2 问题 

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

 3 方案 

0cf043e29bda5c10ea7e1c171ed94140.jpeg

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

 4 弱点 

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

 5 用途 

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

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

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

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

7微服务架构

 1 上下文 

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

 2 问题 

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

 3 方案 

12cb5c05c5d75b99077540443c46f49f.png

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

 4 弱点 

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

当然,我们还需要更多钱。

 5 用途 

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

文章来源于网络,版权归原作者所有,如有侵权,请联系删除。

-END-

— end —

赠书福利
赠送新书《软件平台架构设计与管理之道》共5本,这是一本软件架构书籍,刚刚上架!由「 清华大学出版社」赞助提供 ,感兴趣的朋友推荐入手一本。

293fd0d5edafe83d90f3f43c6bc872aa.png

全书分为两部分。第1部分包括5章50节,通过主题短文,在思想底蕴与思维认知、平台顶层架构与核心能力、技术管理与分析决策方面,给读者提供丰富的工作锦囊,综合提升读者的技术掌控力和布道力,精进方法论,使读者能快速成为一个通识全貌型人才,从容自如地驾驭中大型软件平台方方面面的技术工作。第2部分包括3章,提供20余幅技术方案图和架构设计的工作示意图,以及常用工作台账示例,帮助读者进一步精通图形化表达方法,提升技术设计呈现能力。

同样这次准备了2种方式送书,「评论点赞、朋友圈点赞」这两种方式都可以参与!感谢亲爱的读者们,你们的支持也是我持续更文最大的动力。

 
 
 
 
 
 
 
 
 
 
本次开奖时间为 2023.2.25 14:00
为了避免中奖后失联,提前加我微信号:itcodexy 。

留言点赞(3本)

本文留言需要根据文章的内容留言会更大可能被精选,留言点赞数「第一、二、三名」可获得一本软件平台架构设计与管理之道

PS:买点赞数等作弊无效,一切解释权归程序员小猿所有

朋友圈点赞抽奖(2本)

 
 
 
 
 
 
 
 
记得先添加我微信,不然参加不了这个朋友圈活动 。


大奖:本文章我会在下午6点左右转发朋友圈,给第n位(具体数值看朋友圈发布时的规则)点赞朋友圈的同学送出一本 《软件平台架构设计与管理之道》,共2位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

架构师分享 7 种软件设计架构 (文末送书) 的相关文章

  • 中间表示- 三地址码

    使用三地址码的编译器结构 三地址码的基本思想 1 给每个中间变量和计算结果命名 没有复合表达式 2 只有最基本的控制流 没有各种控制结构 if do while for等等 只有goto call等 3 所以三地址码可以看成是抽象的指令集

随机推荐

  • Java(七) 句柄

    在学习什么是句柄之前我们先学习虚拟机的对对象的访问方式 一 句柄访问方式 使用句柄访问对象 会在堆中开辟一块内存作为句柄池 句柄中储存了对象实例数据 属性值结构体 的内存地址 访问类型数据的内存地址 类信息 方法类型信息 对象实例数据一般也
  • 学习人工智能技术法则

    在当前的教育体系下 人工智能领域的人才培养依然以研究生教育为主 随着近些年来人工智能领域人才缺口的增大 格物斯坦表示目前已经一小部分高校开始陆续在本科阶段开设人工智能专业 相信随着人工智能领域的发展 未来更多专业的学生将有机会接触到人工智能
  • GRE、PPTP、L2TP隧道协议

    在IPSec 和Multiprotocol Label Switching MPLS VPN出现前 GRE被用来提供Internet上的VPN功能 GRE将用户数据包封装到携带数据包中 因为支持多种协议 多播 点到点或点到多点协议 如今 G
  • 数学建模-Topsis综合评价(评价模型)

    Topsis算法核心思想是逼近理想解的排序方法 正理想解 各指标都达到各候选方案的最好值 负理想解 各指标都达到各候选方案的最差值 基于有限个评价对象与理想化目标的接近程度进行排序 在现有的对象中进行相对优劣的评价 算法步骤 1 构造决策矩
  • arm-linux 应用层调用驱动函数

    需要调用头文件 include stdio h include unistd h unistd h 是 C 和 C 程序设计语言中提供对 POSIX 操作系统 API 的访问功能的头文件的名称 该头文件由 POSIX 1 标准 单一UNIX
  • 机考[41-50]

    华为机考 041 求解连续数列 042 求字符串中所有整数的最小和 043 求最多可以派出多少支团队 044 删除字符串中字符最少字符 045 数据分类 046 数列描述 047 数字涂色 048 数组二叉树 049 数组拼接 050 数组
  • MD5 加密算法详细介绍

    MD5是什么 message digest algorithm 5 信息 摘要算法 经常说的 MD5加密 就是它 信息 摘要算法 在下载一下东西时 经常在一些压缩包属性里 看到md5值 而且这个下载页面 很可能会在某一个地方 写了一句 此文
  • 同时存在js和jq时的相互定义转换

    div div div div
  • keras序列化模型 to json文件,保存模型和加载模型

    首先保存 1 模型结构 2 模型参数数据 usr bin env python coding utf 8 Author Jia ShiLin 模型的权重保存在HDF5中 模型的结构保存在JSON文件或者YAML文件中 Keras提供了to
  • Dbus数据总线(基于0.5.0) 深入理解,源码适配修改编译全过程,集群部署,使用操作

    声明 本文基于2018年10月份 发版的0 5版本进行安装实验 dbus产生背景 首先了解下当下的采集工具 1 我们发现 采集工具都有各自的优点和应用场景 但是都缺乏统一的数据源端管控 所以无法找到统一的数据入口 2 各个数据使用方在业务低
  • .ajax判断参数,vue.js获取ajax参数

    vue js获取ajax参数 内容精选 换一换 获取标签所有技术栈您可以在API Explorer中调试该接口 GET v2 stacks状态码 200状态码 403状态码 404状态码 406状态码 500获取标签所有技术栈状态码 200
  • 基于ARM Cortex-M0+内核的bootloader程序升级原理及代码解析

    本文主要讲述BootLoader程序升级原理及一些代码的解析 力图用通俗易懂的语言描述清楚BootLoader升级的主要关键点 BootLoader 升级原理概述 首次接触这一块时 有一个概念叫IAP 在应用编程 通俗一点讲便是通过一段已有
  • Latex公式自动编号与自动引用

    在进行latex引用时 有两种办法 一 被动引用 如有这样一段代码 x 2 y 2 z 2 eqno 1 1 In this paper we investigated 1 1 and applied it into some fields
  • 图论(四)宽度优先搜索BFS

    宽度优先搜索 BFS Breadth First Search 是一个针对图和树的遍历算法 发明于上世纪50年代末60年代初 最初用于解决迷宫最短路径和网络路由等问题 对于下面的树而言 BFS方法首先从根节点1开始 其搜索节点顺序是1 2
  • keepalived-lvs-nat-主备模型实现高可用负载均衡

    keepalived简介 Keepalived的作用是检测web服务器的状态 如果有一台web服务器死机 或工作出现故障 Keepalived将检测到 并将有故障的web服务器从系统中剔除 当web服务器工作正常后Keepalived自动将
  • 移远公司 NB-IoT模块AT指令详细解释

    AT指令的分类和格式 AT指令分测试指令 读取参数指令 设置参数指令 执行命令指令四类 参见下表 命令 命令名称 命令功能 AT lt CMD gt 测试命令 询问模块支持哪些设置参数或者是那些项目 AT lt CMD gt 读取命令 读取
  • 2.数据定义语言DDL

    一 数据库定义语言 DDL Data Definition Language 是用于描述数据库中要存储的现实世界实体的语言 主要由create 添加 alter 修改 drop 删除 和 truncate 删除 四个关键字完成 二 crea
  • 服务器的软件架构

    1 服务器的整体架构 x86 2 服务器的软件整体架构 x86 3 服务器的软件介绍BIOS POST CPU 内存 外设初始化与资源分配 BIOS Setup 英文 中文 CPU Performance SATA等接口控制 BIOS BM
  • JS Date日期的使用

    Date 分两大系列 1 get系列 及获取时间 2 set系列 及设置时间 1 get系列的方法 1 getDate 返回一月中的某一天 2 getDay 返回一周中的某一天 0 6 0代表周日 6代表周一 3 getFullyear 返
  • 架构师分享 7 种软件设计架构 (文末送书)

    文末留言送书5本 架构模式是对给定上下文的软件架构中常见问题的一种通用的可复用的解决方案 一种模式就是特定上下文的问题的一种解决方案 然而 很多开发者至今还对各种软件架构模式之间的差别搞不清 甚至对其所知甚少 大体上 主要有下面这7种架构模