《software architecture patterns》学习笔记

了解通用的架构模式并知道什么时候使用它们。

软件架构定义了软件的基本特点和行为。比如,有些软件架构会让软件变得可扩展,而有些软件架构会让软件变得易于修改。
知道每一种软件架构的特点、优缺点是非常有必要的,因为它们能帮助你选择一种能满足你需求的架构。
这本书介绍了5种常见的软件架构,以及每种架构的优缺点,我们做架构设计时可以参考参考。下面就介绍这5种架构。

Layered architecture(分层架构)

在分层架构模式中,组件以水平分层的方式被组织,每一层都有自己的职责,比如UI层专门负责所有UI的绘制和渲染,业务逻辑层主要处理业务逻辑。虽然分层架构并没有规定分层的数量和类型,但是大多数的分层架构基本是由4层组成(如下图所示):展现层(也称为UI层,对应下图的presentation layer)、业务层(business layer)、持久化层(persistence layer)、数据库层(database layer)。有些架构会把业务层和持久化层合并成一层,比如那些把持久化层的逻辑(比如SQL语句)耦合到了业务层中。
在这里插入图片描述
架构中的每一层都有自己的任务需要完成,以便满足业务需求,并且每一层都不需要其它层的内部具体实现细节。比如,UI层不需要知道如何请求服务端的数据,它只需要把要展现的内容绘制出来即可。类似的,业务层不需要关心如何把内容绘制出来或者数据从哪里来,它只需要从持久化层获取数据,然后使用业务逻辑来处理这些数据(比如对数据加减乘除),然后把处理结果交给UI层渲染。
这种架构的好处是分离了关注点(每层只关注某个点),让代码更容易开发、测试和维护。
如下图所示,这种架构中,每一层都是“closed”的,意思是,比如当UI层发生一个请求时,UI层只能调用业务层的接口而不能“跨层”直接调用持久化层的接口。类似的,业务层只能调用持久化层的接口而不能直接调用数据库层的接口来获取数据。
在这里插入图片描述
为什么不允许UI层直接访问持久化层或者数据库层呢?毕竟让UI层直接访问数据库层的数据的性能更好。因为每一层都是“closed”(或者称为layers of isolation)。
Layers of isolation的意思是每一层的改变都不会影响到其它不紧挨着自己的层。如果你允许UI层直接访问持久化层,那么持久化层的SQL语句的修改就可能会影响到业务层和UI层,进而让UI层的组件和持久层的组件耦合在一起,这将会让软件变得更加难以修改。layer of isolation的好处是,例如,当我们要把JSP(java server pages)这个UI层的框架替换成JSF(java server faces)时,假如UI层和业务层之间的接口(比如接口中的某个Model)保持不变,那么业务层就不需要做任何改动。

Microkernel architecture(微内核架构)

微内核架构(如下图所示)常常被称为插件式架构,该架构允许你通过插件的方式添加新的功能。
微内核架构由两种类型的组件组成:1 核心系统;2 插件式模块(也称为可插拔模块)。整个软件的逻辑被划分为“独立的且可插拔的模块”和“基础的核心系统”,这种架构的可扩展性好,能够把各个功能隔离开,并允许使用方自定义处理逻辑。我们熟知的大多数操作系统都以该架构实现,这也是该架构名字的由来。
核心系统通常只包含最小的功能集以便让整个架构能正常运行。从业务的角度看,核心系统通常包含通用的业务逻辑而不会包含某个具体的或者特殊的业务逻辑。
在这里插入图片描述
插件式模块由多个相互独立的插件组成,每个插件都包含某个具体的业务处理逻辑,以便扩展核心系统的功能。通常来说,一个插件通常不依赖别的插件,但你也可以根据需要让某个插件依赖另一个插件,但最好不要让插件之间进行通信以便减少依赖问题。如果插件之间没有依赖,意味着当一个插件添加到核心系统或者从核心系统移除时,就不会对其它插件有影响,当然也不会对核心系统造成影响。
核心系统需要知道从哪里去读取和使用插件。一种比较常见的做法是让核心系统提供一个注册插件和解注册插件的接口。
该架构的应用场景有浏览器(比如chrome)、eclipse等。

Event-driven architecture

事件驱动型架构(event-driven architecture)是一种异步分发的架构,该架构具有很好的可扩展性。该架构由高度解耦且具有单一目的的事件处理组件所组成,这些组件能异步地接受和处理事件。
事件指的是状态发生变化时,软件所发出的通知。
事件驱动型架构有两种类型的拓扑结构:1 mediator(中介者);2 broker(代理者)。

mediator拓扑结构

mediator结构适用于有多个步骤的事件。
mediator结构由4种类型的组件组成:事件队列(event queue),事件分发器(event mediator),事件渠道(event channels),事件处理器(event processors)。如下图所示,事件流从一个client发送一个事件到一个事件队列,该队列用于把事件递给事件分发器,事件分发器收到原始事件后对该事件进行加工,然后把加工后的事件发送给事件渠道,以便事件渠道执行“过程中的每一步”,事件处理器监听了事件渠道,当收到由事件分发器发来的事件后,会执行具体的业务逻辑。
在这里插入图片描述
事件分为两类:原始事件 和 加工后的事件。原始事件指的是事件分发器收到的事件,而加工后的事件则是由事件分发器创造和初始化的,加工后的事件最终会被事件处理器接收并处理。
事件分发器并不会处理业务逻辑。
事件渠道可以使用事件队列。

broker拓扑结构

broker结构和mediator结构不同的是前者没有中心化的事件分发器,消息流在消息处理器之间转发。比如后台开发里面的ActiveMQ,HornetQ等框架。
brocker结构主要由两种类型的组件组成:1 代理组件(broker component);2 事件处理器组件(event processor component)。
代理组件可以是中心化的也可以是非中心化的,代理组件包含了在一个事件流里面的所有事件渠道。事件渠道指的是消息队列。
在这里插入图片描述

Microservice architecture

微服务有几个核心概念需要了解:

  1. 独立部署单元(seprately deployed units),如下图所示,每个微服务架构的组件都作为一个单独的单元被部署。
    在这里插入图片描述
  2. 服务组件(service component),其粒度可大可小,小到你可以理解它为一个小模块,大到你可以认为它实现了软件的绝大部分功能。服务组件包含了1个或者多个模块,每个模块都有一个独特的功能,比如某个模块提供某个具体城市的天气预报数据。在微服务架构设计中,如何定义服务组件的粒度是比较难的。
  3. 分布式架构,微服务架构就是分布式架构,指的是架构中的每一个组件之间都不会相互耦合,服务之间通过远程访问协议(remote access protocol,比如REST、SOAP)来通信。分布式的特点让微服务架构能够具备非常好的可伸缩性(scalability)和已部署的优点。

微服务架构从使用了layered架构的庞大的单体系统和使用了service-oriented架构的分布式系统演化而来。
虽然微服务架构的具体实现有很多种,但其中有3种拓扑架构比较常见:①基于REST API的拓扑架构;②基于REST应用的拓扑架构;③消息中心化的拓扑架构。

  1. 基于REST API的拓扑架(如下图所示)对网页系统来说比较实用,因为该架构通过API来暴露小型的、独立的服务。
    在这里插入图片描述
  2. 在基于REST应用的拓扑架构(如下图所示)中,client的请求会被传统的基于web或者“fat-client”的应用的UI层接收而不是被一个简单的API层接收。
    在这里插入图片描述
  3. 消息中心化的拓扑架构(如下图所示)和上面的基于REST应用的架构比较类似,但消息中心化架构不使用REST协议,而是使用一种lightWeight centralized message broker(轻量级的消息中心化的代理)来进行远程访问,比如ActiveMQ,Hornet等。lightWeight centralized message broker并不进行复杂的路由,而仅仅是一种简单的访问service component。这种拓扑架构相对于上面的基于REST架构来货,有以下优点:更高级的队列机制;异步消息处理;监控,异常处理。
    在这里插入图片描述
    微服务的缺点是很难定义service component的合适的粒度。如果service component的粒度太大,你就很难理解这种架构在部署、伸缩性、可测试下和低耦合的优势。而如果service component的粒度太小,就会变成SOA架构了。

Space-based architecture

很多基于web的业务系统都遵循着相同的请求处理流程:浏览器请求服务端的某个接口,然后web服务器会受到该请求,然后wen服务器转发给应用服务器以便处理请求,而应用服务器往往都会访问数据库服务器以便实现数据的增删改查。这种流程适用于用户较少的场景,然而当用户量激增的时候,瓶颈就出现在了web服务器,然后是应用服务器,最后是数据库服务器。当用户的访问量量增长时,解决服务端响应速度的瓶颈问题的通常方法是增加web服务器,这种方法实现成本低。然而,这种方法仅仅是把响应速度的瓶颈转移到了应用服务器。而增加应用服务器相对于增加web服务器是比较复杂和高成本的,并且这种做法也仅仅是把瓶颈问题转移到数据库服务器而已,但是数据库会因为锁和事务的存在而不能简答地通过增加数据库服务器来解决瓶颈问题。space-base(基于云)的架构就是为了解决这个问题的。
space-base架构的名字来源于分布式共享内存中tuple space。高伸缩性通过解除中心化数据库的限制并且使用可被复制的内存中的数据网格(data grids)来实现的。系统的数据被保存在内存中并且所有活着的处理单元(process units)中都存在着一份拷贝。处理单元的个数能够根据请求数量的增加而增加,减少而减少。因为没有了中心化的数据库,数据库的瓶颈也就没有了,意味着该架构给系统提供了无止境的伸缩能力。
该架构(如下图所示)有两个核心概念:处理单元(processing unit) 和 虚拟中间件(vitualized middleware)。
在这里插入图片描述
虚拟中间件主要负责通信,数据同步,请求分发和部署处理单元。如上图所示,虚拟中间件主要包含了消息网格,数据网格,处理网格(processing grid),部署管理器。
处理单元主要包含了业务逻辑。一个大型的系统可能会被以功能维度划分成多个处理单元。如下图所示,一个处理单元通常包括业务模块、内存中的数据网格、可选的异步持久化仓库、数据复制引擎。
在这里插入图片描述
消息网格(如下图所示)管理着客户端发来的请求和session信息,比如当收到客户端发来的请求时,消息网格负责把请求转发给某个能处理该请求的处理单元。
在这里插入图片描述
数据网格负责和每个处理单元里面的数据复制引擎打交道,以便当数据发生变化时能够进行数据同步。如下图所示,当数据变化时,数据网格会同步复制数据到每个处理单元。
在这里插入图片描述
处理网格负责“需要多个处理单元共同处理”的请求的分发,如下图所示,当收到一个客户端的请求时,处理网格会协调两个处理单元来处理该请求。
在这里插入图片描述
部署管理器负责根据请求的数量来启动或者关闭处理单元。该管理器会持续地监控响应时间和请求数量,当请求增多时启动新的处理单元,当请求减少时关闭多余的处理单元。

上面5种架构的优缺点对比

下图所示的是,5种架构(layered架构、event-driven架构、microKernel架构、mricroService架构、space-based架构)在灵活性(对应下图的Overall Agility,指的是能够持续不断地快速响应需求变化的能力)、部署、可测试程度、性能、伸缩性、开发难度上的评分。该表格虽然能帮助你在项目上选择合适的架构,但是你还要结合项目的预算、开发周期、系统规模等方面来最终决定选用合适的架构。因为一旦系统按照某个架构被实现了,更换架构的成本就会比较高。如果想要更加深入地了解每种架构的具体优缺点,请看原书:《software architecture patterns》。
在这里插入图片描述

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

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

相关文章

吉时利 Keithley2461 数字源表

Keithley2461吉时利SMU高电流数字源表 2461 型图形化高电流数字 SourceMeter SMU 2461 高电流 SMU 凭借其 10A/1000W 脉冲电流和 7A/100W 直流电流能力以及双 18 位 1MS/s 数字转换器,优化用于检定和测试高功率材料、器件和模块,例如碳化硅 (SiC)、氮化…

Codeforces Round 954 (Div. 3) A~F

A.X Axis(暴力) 题意: 在 X X X轴( 1 ≤ x i ≤ 10 1\leq x_i\leq 10 1≤xi​≤10)上有三个点,其整数坐标分别为 x 1 x_1 x1​、 x 2 x_2 x2​和 x 3 x_3 x3​。您可以选择 X X X轴上任何一个整数坐标为 …

一分钟学习数据安全—自主管理身份SSI分布式标识DID介绍

SSI标准化的两大支柱,一个是VC,之前简单介绍过,另一个就是DID。基本层次上,DID就是一种新型的全局唯一标识符,跟浏览器的URL没有什么不同。深层次上,DID是互联网分布式数字身份和PKI新层级的原子构件。 一…

分别使用netty和apache.plc4x测试读取modbus协议的设备信号

记录一下常见的工业协议数据读取方法 目录 前言Modbus协议说明Netty 读取测试使用plc4x 读取测试结束语 前言 Modbus 是一种通讯协议,用于在工业控制系统中进行数据通信和控制。Modbus 协议主要分为两种常用的变体:Modbus RTU 和 Modbus TCP/IP Modbus …

通过验证邮箱进行注册信息确认

应用在进行注册时,避免恶意攻击和垃圾注册,可以通过验证注册者身份后才能够提交。一般可以使用验证手机短信或者验证邮箱,验证短信会有专门的第三方服务,可以进行付费购买。验证邮箱的正确与否,可以通过以下2种方式进行…

Linux 安装 MySQL 8.0.26

1、MySQL 8.0.26 下载 官方网站下载 MySQL 8.0.26 安装包,下载地址:mysql8.0.26 本案例采用Linux 64位操作系统进行讲解,通过wget命令下载安装包。 使用df -lh命令查看,磁盘大小,尽量安装在比较大的磁盘下&#xff0c…

vue3+ts <script setup lang=“ts“> element-plus的el-date-picker设置默认日期

效果图(单个日期): utils.ts: /*** 格式化时间戳* param {number} timestamp 时间戳* param {string} format 格式* returns {string}*/ export const formatTimeStamp (timestamp: number, format: string) > {if (!timesta…

Linux系统防火墙iptables(下)

备份与还原iptables规则设置 1、yum -y install iptables iptables-services 安装iptables软件包 2、systemctl start iptables.service 开启服务 3、systemctl enable iptables.service 开机自启 我们对iptables命令行中的设置,都是临时设置,只要遇到服…

GPT-5

欢迎来到 Papicatch的博客 文章目录 🍉技术突破预测 🍈算法进步 🍈理解力提升 🍈行业推动力 🍉人机协作的未来 🍈辅助决策 🍈增强创造力 🍈复杂任务中的角色 🍈人…

深入剖析Tomcat(十三) Host、Engine 容器

前面很多篇文章都在介绍Context与Wrapper两个容器,因为这两个容器确实也比较重要,与我们日常开发也息息相关,但是Catalina是存在四个容器的,这一章就来简单看看Host与Engine这两个容器。 再次展示下Catalina的容器结构&#xff0…

VS2022(Visual Studio 2022)最新安装教程

1、下载 1、下载地址 - 官网地址:下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux - 根据自己的电脑的 【操作系统】 灵活选择。 2、安装包 【此处为Windows系统安装包】 2、安装 1、打开软件 - 右击【以管理员身份打开】, 2、准备配置 …

Web Serial串口通信实现WEB浏览器读写M1卡

本示例使用的设备&#xff1a;RS232串口RFID NFC IC卡读写器可二次开发编程发卡器USB转COM-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &l…

优思学院|工厂的部门架构管理与精益生产

工厂内有不同部门&#xff0c;各部门之间必须协调合作才能发挥整体功能。工厂最主要的部分是制造产品的现场&#xff0c;这里安装了生产工具&#xff0c;还有操作员进行加工或生产制造。 制造时使用的材料或零组件&#xff0c;需要对外采购。对于加工组装型的工厂&#xff0c;…

基于Boost和平均电流控制方法的APFC电路设计

通过学习无线充电相关知识&#xff0c;为更快熟悉APFC工作原理&#xff0c;通过实验得以掌握 技术要求&#xff1a; 1&#xff09;输入电压&#xff1a;AC 85V&#xff5e;265V&#xff1b; 2&#xff09;输出电压&#xff1a;400V1%&#xff1b; 3&#xff09;输出额定电流…

音视频开发30 FFmpeg 视频编码- 流程以及重要API,H264编码原理说明,该章节使用h264编码说明

一.H264编码原理 1 视频为什么需要进行编码压缩 ◼ 一张为 720x480 的图像&#xff0c;用 YUV420P 的格式来表示&#xff0c;其大小为&#xff1a; 720*480*1.5 约等于 0.5MB 。 ◼ 如果是 25 帧&#xff0c; 10 分钟的数据量 0.5M*10*60*25 7500MB -> 7GB 多 ◼ …

自学网络安全的三个必经阶段(含路线图)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

blender 快捷键 常见问题

一、快捷键 平移视图&#xff1a;Shift 鼠标中键旋转视图&#xff1a;鼠标中键缩放视图&#xff1a;鼠标滚动框选放大模型&#xff1a;Shift B线框预览和材质预览切换&#xff1a;Shift Z 二、常见问题 问题&#xff1a;导入模型成功&#xff0c;但是场景中看不到。 解…

电路与数字逻辑期末复习重点整理!!

1.带无关项的卡诺图 2.置数法设计N进制电路 计数器&#xff1a;具有记忆输入脉冲个数功能的电路称为计数器。 按照各个触发器状态更新情况的不同可分为&#xff1a; 同步计数器&#xff1a;各触发器受同一时钟脉冲─输入计数脉冲控制&#xff0c;同步更新状态。异步计数器&a…

阿里云centos 7.9 使用宝塔面板部署.netcore 6.0

前言&#xff1a; 我有一个netcore6.0的系统接口和手机端程序的站点程序之前是部署在一台windows测试服务器的IIS站点中&#xff0c; 服务器最近压力太大扛不住了&#xff0c;买了一台centos7.9的阿里云服务器准备进行迁移。具体操作日记如下。 一、安装宝塔面板 这一步涉及…

堡垒机软件详细定义以及部分厂商汇总

随着大家对网络安全的重视&#xff0c;越来越多的企业开始采购堡垒机。堡垒机可以分为硬件堡垒机、软件堡垒机、软硬一体机。今天我们就来聊聊堡垒机软件详细定义以及部分厂商汇总。 堡垒机软件详细定义 堡垒机软件&#xff0c;又称为运维安全审计系统&#xff0c;其主要功能在…