《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》。
在这里插入图片描述

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

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

相关文章

【银河麒麟】高可用触发服务器异常重启,处理机制详解

1.服务器环境以及配置 【机型】物理机 处理器: Intel 内存: 126G 【内核版本】 4.19.90-25.16.v2101.ky10.x86_64 【银河麒麟操作系统镜像版本】 Kylin-Server-10-SP2-Release-Shenzhen-Metro-x86-Build01-20220619 Kylin-HA-10-SP2-Release-S…

C++之STL(十一)

1、迭代器适配器 2、插入迭代器 #include <iostream> #include <vector> #include <algorithm> #include <list> using namespace std;void showVec(const vector<int>& v) {for (vector<int>::const_iterator it v.begin(); it ! v.…

rk3568 OpenHarmony 串口uart与电脑通讯开发案例

一、需求描述&#xff1a; rk3568开发板运行OpenHarmony4.0&#xff0c;通过开发板上的uart串口与电脑进行通讯&#xff0c;相互收发字符串。 二、案例展示 1、开发环境&#xff1a; &#xff08;1&#xff09;rk3568开发板 &#xff08;2&#xff09;系统&#xff1a;OpenHar…

STM32单片机实现串口IAP升级

一.概述 1.要实现串口IAP升级&#xff0c;首先要编写一个bootloader程序&#xff0c;然后再写支持IAP的app程序&#xff1b; 2.keil下bootloader的程序rom和ram设置 3.app程序要用bin文件 注&#xff1a;本文以STM32H743举例&#xff0c;其他stm32单片机IAP升级原理类似。 …

有哪些方法可以恢复ios15不小心删除的照片?

ios15怎么恢复删除的照片&#xff1f;在手机相册里意外删除了重要的照片&#xff1f;别担心&#xff01;本文将为你介绍如何在iOS 15系统中恢复已删除的照片。无需专业知识&#xff0c;只需要按照以下步骤操作&#xff0c;你就能轻松找回宝贵的回忆。 一、从iCloud云端恢复删除…

easyui的topjui前端框架使用指南

博主今天也是第一次点开easyui的商业搜权页面&#xff0c;之前虽然一直在使用easyui前端框架&#xff08;easyui是我最喜欢的前端ui框架&#xff09;&#xff0c;但是都是使用的免费版。 然后就发现了easyui的开发公司居然基于easyui开发出了一个新的前端框架&#xff0c;于是我…

句法分析概述

第1关&#xff1a;句法分析概述 任务描述 本关任务&#xff1a;通过对句法分析基本概念的学习&#xff0c;完成相应的选择题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 句法分析的基础概念&#xff1b; 句法分析的数据集和评测方法。 句法分析简介…

Potato(土豆)一款轻量级的开源文本标注工具(二)

示例项目&#xff08;模版&#xff09; Potato 旨在提高数据标注的可复制性&#xff0c;并降低研究人员设置新标注任务的成本。因此&#xff0c;Potato 提供了一系列预定义的示例项目&#xff0c;并欢迎公众向项目中心贡献。如果您使用 Potato 进行了自己的标注工作&#xff0…

【字符串】【双指针】1、仅仅反转字母+2、回文子串+ 3、最长回文子串+4、验证回文串+5、反转字符串中的单词

今天依旧是字符串&#xff01;2道简单&#xff0b;3道中等 1、仅仅反转字母&#xff08;难度&#xff1a;简单&#xff09; 该题对应力扣网址 错误做法 一开始是“原始”思路&#xff0c;交了之后果然不对&#xff0c;错误的思路我也就不解释了。 class Solution { public:…

计算机毕业设计Python+LSTM+Tensorflow股票分析预测 基金分析预测 股票爬虫 大数据毕业设计 深度学习 机器学习 数据可视化 人工智能

基于TensorFlow-LSTM的股票预测系统开题报告 一、研究背景与意义 随着信息技术的飞速发展&#xff0c;股票市场作为现代经济活动的重要组成部分&#xff0c;其价格波动受到广泛关注。投资者们迫切希望通过科学的方法预测股票价格&#xff0c;以优化投资决策&#xff0c;实现利…

达梦数据库的系统视图v$database

达梦数据库的系统视图v$database 基础信息 OS版本&#xff1a; Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a; DM Database Server 64 V8 DB Version: 0x7000c 03134284132-20240115-215128-20081在达梦数据库&#xff08;Dameng Database&#xf…

yolov10打包为exe

一、前言 本节实验将官方yolov10推理程序打包为exe运行 二、代码 首先下载官方代码至本机&#xff0c;并使用conda创建虚拟环境&#xff0c;并安装好yolov10所需库 conda create --prefix E:/pyenv/myYolo10 python3.8 pip install -r requirements.txt 下载官方模型权重 …

最新Adobe2024全家桶下载,PS/PR/AE/AI/AU/LR/ID详细安装教程

如大家所熟悉的&#xff0c;Adobe全家桶系列常用的软件有Photoshop&#xff08;PS&#xff09;、Premiere&#xff08;PR&#xff09;、After Effects&#xff08;AE&#xff09;、illustrator&#xff08;AI&#xff09;、Audition&#xff08;AU&#xff09;、Lightroom&…

计算机二级Access操作题总结——综合应用

属性表相关 例1&#xff1a; 不允许输入和修改其中的数据→【是否锁定】 例2&#xff1a; 单击“退出”按钮(名为“bt2”)&#xff0c;调用设计好的宏“mEmp”来关闭窗体。 分组和汇总 对“rSell”报表进行适当设置&#xff0c;使每名雇员的姓名显示在该雇员所售书籍信…

第四天 怎么又迟到了呀 哎啥时候来准时上个课呀

泛型编程 Traits实现&#xff0c;是什么 泛型编程&#xff08;Generic Programming&#xff09;是一种通过编写与特定类型无关的代码来实现代码复用和抽象的编程范式。 在C中&#xff0c;模板&#xff08;Templates&#xff09;是实现泛型编程的主要手段。 Traits&#xff0…

基于ssh框架的个人博客源码

基于ssh的个人博客源码&#xff0c;页面清爽简洁&#xff0c;原先有部分bug,运行不了&#xff0c;现已修复 1.博客首页 &#xff08;本地访问地址 :localhost:8080/Blog/index/index&#xff09; 2.关于我 3.慢生活 4.留言板 5.我的相册 微信扫码下载源码

《分析模式》漫谈07-怎样把一张图从不严谨改到严谨

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 下图是《分析模式》原书第2章的图2.10&#xff0c;里面有一些错误和考虑不周的地方&#xff1a; 2004中译本和2020中译本的翻译如下&#xff1a; 基本上都是照搬&#xff0c;没有改过…

widows下 vscode 的 terminal / powershell,ctrl+v失灵,输出^v

问题 原因 最近装了PSReadLine Import-Module PSReadLineSet-PSReadLineOption -PredictionSource History Set-PSReadLineOption -PredictionViewStyle InlineView Set-PSReadLineOption -EditMode Emacsvscode不兼容 解决方法 注释掉最后面的 Import-Module PSReadLineS…

2021年12月电子学会青少年软件编程 中小学生Python编程等级考试三级真题解析(选择题)

2021年12月Python编程等级考试三级真题解析 选择题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1、小明在学习计算机时&#xff0c;学习到了一个十六进制数101,这个十六进制数对应的十进制数的数值是 A、65 B、66 C、256 D、257 答案&#xff…

浅析Resource Quota中limits计算机制

前言 在生产环境中&#xff0c;通常需要通过配置资源配额&#xff08;Resource Quota&#xff09;来限制一个命名空间&#xff08;namespace&#xff09;能使用的资源量。在资源紧张的情况下&#xff0c;常常需要调整工作负载&#xff08;workload&#xff09;的请求值&#xf…