架构师蓝图: 理解软件风格与模式

news2024/12/22 18:45:23

本文介绍了10种软件架构风格及其对应设计模式,梳理了各个风格的优缺点和适用场景,帮助读者在架构选项过程中能有的放矢,做出更适合业务场景的架构设计。原文: The Architect’s Blueprint: Understanding Software Styles and Patterns with Cheatsheet

在软件开发过程中,架构在塑造软件系统的结构和行为方面起着至关重要的作用。架构为系统设计提供蓝图,详细说明组件如何相互交互以交付特定功能。然而,由于有大量可用的体系架构风格和模式,辨别哪种方法最适合特定的项目或系统可能需要付出大量时间。本文旨在阐明相关概念,帮助读者在架构工作中做出明智决策。

架构风格(Architectural Styles) vs 架构模式(Architectural Patterns)

在深入研究细节之前,很重要的一点是要区分架构风格和模式,这些术语通常可以互换使用,但具有不同的含义。

架构风格是为一系列系统提供抽象框架的高级策略。架构风格通过经常解决重复出现的问题来改进模块划分并促进设计重用。可以把它想象成指导建筑或住宅设计的主题或美学,具体实例包括分层(Layered)、事件驱动(Event-Driven)和微服务(Microservices)等。

另一方面,架构模式要更加具体,并且特定于系统中的特定问题或模块,为体系架构问题提供了结构化解决方案,详细说明了应该如何为特定功能构建组件和交互。架构模式类似于软件设计模式,但是工作在更高的抽象层次上。具体实例包括模型-视图-控制器(MVC,Model-View-Controller)、发布-订阅(Publish-Subscribe)和无服务器(Serverless)等。

虽然架构风格提供了广泛框架,可以看作是系统设计的一般哲学,但架构模式是该框架中特定设计问题的具体解决方案。换句话说,架构风格描述了系统的总体结构,而架构模式解决了可能在该结构中出现的特定设计问题。

下面我们将探讨十种关键的架构风格,每种风格都有其各自的模式、原则、优缺点和应用范围。这些风格包括分层(Layered)、基于组件(Component-Based)、面向服务(Service-Oriented)、分布式系统(Distributed System)、领域驱动(Domain-Driven)、事件驱动(Event-Driven)、关注点分离(Separation of Concern)、解释器(Interpreter)、并发(Concurrency)和以数据为中心(Data-Centric)。通过理解这些风格和模式,可以更好驾驭全局性体系架构,并设计出健壮、可伸缩和可维护的系统。让我们开始吧!

"在软件设计的宏伟图景中,风格是粗线条的轮廓,而模式是将杰作带入生活的复杂细节。"

终极备忘录

为了帮助读者浏览架构风格和模式的广阔景观,我创建了一个备忘录,包含了本文讨论的所有关键点。这个备忘录可以作为方便的参考指南,帮助读者快速回忆每种体系架构风格和模式的主要特征。

软件架构风格备忘录
软件架构风格备忘录
1. 分层架构风格(Layered Architecture Style)

分层架构是最常见的架构模式之一,通常用于传统web应用序和企业应用程序。

  • 原则: 这种体系架构风格将关注点划分为不同的层。典型的例子是三层架构: 表示层、业务逻辑层和数据存储层。
  • 优点: 易于理解、测试和维护,每一层都可以独立开发和更新。
  • 缺点: 有额外的性能开销,影响多个层的更改可能很难实现。
  • 应用: Web应用、企业应用。
  • 反模式: 循环依赖,跨层依赖。
分层(n层)模式

n层架构将系统划分为n层,每一层都有特定职责。最常见的划分是三层: 表示层、业务逻辑层和数据存储层。

分层(n层)体系架构模式
分层(n层)体系架构模式
整洁/洋葱模式

整洁体系架构,也被称为洋葱体系架构,是一种强调系统内关注点分离的软件设计哲学。它将软件组织成同心的层,以领域模型为核心,周围是特定于应用程序的层。外层只依赖内层,促进高度的解耦和隔离。这使得基础设施、UI或外部代理的更改对业务逻辑的影响最小。对于需要高度可维护性、可测试性和独立于UI、数据库或外部框架的系统来说,是理想的选择。

整洁/洋葱架构模式
整洁/洋葱架构模式
2. 基于组件的体系架构风格

这种风格强调对整个软件系统中可用的广泛功能的关注分离。

  • 原则: 这种体系架构风格将系统组织为松耦合、可重用的组件。
  • 优点: 高可重用性、灵活性和可维护性。
  • 缺点: 管理组件及其交互的复杂性。
  • 应用: Web应用、桌面应用、分布式系统。
  • 反模式: 过于庞大的组件,冗余的组件。
面向对象模式

这种模式是基于"对象"的范式,对象可以包含数据和代码: 字段形式的数据(通常称为属性)和过程形式的代码(通常称为方法)。该模式促进了封装、继承和多态,使设计、实现、维护复杂系统变得更加容易。

微内核模式

此模式将最小功能核心(微内核)与扩展功能及特定于客户的部分分离开来。微内核包含核心功能,而其他特性则作为微内核的插件实现。这使得系统可以很容易扩展,而无需修改核心。

微内核架构模式
微内核架构模式
插件模式

此模式允许通过添加新模块或插件向应用程序添加新功能。新模块通过标准接口集成到应用中,从而可以扩展和定制应用程序。这种模式通常用于web浏览器、媒体播放器和内容管理系统。

3. 面向服务的体系架构风格

这种风格将软件设计为相互通信的服务集合。每个服务都是自包含的,代表具有确定结果的特定业务活动。

  • 原则: SOA将应用程序设计为通过网络进行通信的服务集合。
  • 优点: 灵活性、可伸缩性、可重用性和松耦合。
  • 缺点: 增加了复杂性、网络依赖性和潜在的性能问题。
  • 应用: 企业系统、web服务、微服务。
  • 反模式: 忽略业务需求,在不需要SOA的地方使用SOA。
面向服务的体系架构模式

这种模式将软件设计为多个系统可复用的离散服务的集合。SOA模型中的每个服务都是为执行特定业务功能而构建的,例如检查客户的信用评分、计算付款或处理抵押贷款。这些服务通过网络相互通信,以实现特定活动,例如处理抵押贷款申请。SOA促进了可重用性,多个应用可以灵活使用服务,特定服务可以在不影响其他服务的情况下被修改或替换。

面向服务的体系架构模式
面向服务的体系架构模式
代理(Broker)模式

在代理模式中,系统组件通过代理实体进行通信。代理协调通信,例如转发请求、传输结果和异常。这种模式通过解耦的组件构建分布式软件系统,组件通过远程服务调用进行交互。

微服务模式

此模式将软件应用程序设计为一组小型服务,每个服务在其进程中运行,并与轻量级机制(通常是HTTP)通信。这些服务围绕业务功能构建,可以通过完全自动化的部署机制独立部署。这种模式允许快速、频繁、可靠的交付复杂应用程序。

微服务架构模式
微服务架构模式
无服务器(功能即服务或FaaS)模式

在此模式中,应用程序在云环境中构建和运行,不需要考虑服务器。云服务商动态管理机器资源的分配,开发人员可以只关注应用代码中的单个功能。此模式非常适合可伸缩的事件驱动应用程序。

4. 分布式系统架构风格

这种风格指的是由一组组件交互实现共同目标的系统,这些组件位于联网的计算机上,通过传递消息进行通信以及协调互相的动作。

  • 原则: 该架构涉及多个系统在网络上一起工作,对最终用户显示为单个系统。
  • 优点: 可伸缩性、容错性和资源共享。
  • 缺点: 增加了复杂性、网络依赖性以及与数据一致性相关的问题。
  • 应用: 分布式数据库、云计算、电信网络。
  • 反模式: 不考虑网络故障,忽略数据一致性挑战。
云架构模式

这种模式旨在通过在多个服务器均匀分布服务和资源来避免任何单点故障或性能瓶颈,非常适合需要100%正常运行时间和水平可扩展性的大容量、关键任务型应用程序,例如金融交易系统或在线游戏平台。

云架构模式
云架构模式
点对点(P2P)模式

在这种模式中,网络中的每个参与者(对等体)同时充当客户机和服务器,网络节点直接通信,不需要中央服务器。这种模式用于需要分布式计算或资源共享的应用程序,例如文件共享网络或区块链技术。

点对点(P2P)架构模式
点对点(P2P)架构模式
5. 领域驱动架构风格

这种风格侧重于核心领域和领域逻辑,基于业务领域模型进行设计,强调技术和领域专家之间的协作,迭代的改进模型,使其准确而有效的解决业务问题。

  • 原则: 关注核心领域和领域逻辑,并基于领域模型进行设计。
  • 优点: 提高对复杂业务领域的理解,促进技术和业务团队之间的沟通。
  • 缺点: 对于简单的领域,可能过度复杂,需要深入理解。
  • 应用: 复杂业务系统、企业软件。
  • 反模式: 忽略通用语言,不涉及领域专家。
六边形(端口和适配器)模式

这种模式允许应用程序能同时由用户、程序、自动化测试或批处理脚本驱动,并且可以在与最终运行时的设备和数据库隔离的情况下进行开发和测试。它将软件的业务逻辑与由端口和适配器驱动的外部关注点分离开来。对于需要与软件环境解耦的应用程序,此模式非常理想,有助于系统适应新的环境。

六边形(端口和适配器)架构模式
六边形(端口和适配器)架构模式
领域驱动设计模式

此模式是通过将实现连接到不断发展的模型来实现复杂需求的软件开发方法,涉及实现和模型之间的密切关系,在两者之间有恒定的迭代周期。DDD非常适合具有丰富、复杂业务规则的复杂系统,或者领域处于不断变化中的系统。

领域驱动体系架构模式
领域驱动体系架构模式
6. 事件驱动架构风格

事件驱动体系架构是用于应用程序设计的软件体系架构和模型。对于事件驱动系统,事件的捕获、通信、处理和持久化是解决方案的核心架构。

  • 原则: 这种架构风格由用户操作、传感器输出或来自其他程序的消息等事件驱动。
  • 优点: 高度可伸缩、松耦合、适合处理实时或近实时信息流。
  • 缺点: 由于异步编程而增加的复杂性可能难以维护和调试。
  • 应用: GUI应用程序,实时分析,复杂事件处理。
  • 反模式: 忽略事件顺序,缺乏事件持久性。
事件驱动模式

事件驱动架构是一种流行的分布式异步架构模式,用于生成高度可伸缩的应用程序,具有很高的适应性,可用于小型应用程序和大型复杂系统。

事件驱动架构模式
事件驱动架构模式
发布-订阅模式

这是一种消息传递模式,其中消息的发送者(称为发布者)不将消息直接发送给特定的接收者(称为订阅者)。相反,发布的消息被划分为主题,发布者并不知道可能有哪些订阅者(如果有的话)。类似的,订阅者对一个或多个主题感兴趣,并且只接收感兴趣的消息,而不知道有哪些发布者(如果有的话)。此模式在异步系统中广泛使用,用于将产生事件的流程与消费事件的流程分离,从而实现更大的可伸缩性和控制。

7. 关注点分离架构风格

关注点分离是一种设计原则,核心是将计算机程序划分为不同部分,每个部分处理一个单独的关注点。

  • 原则: 不同功能领域由系统中独立的部分处理。
  • 优点: 提高可理解性,降低复杂性,促进模块化和并行开发。
  • 缺点 :由于接口管理,这会增加复杂性,并且需要在模块之间进行更多通信。
  • 应用: 几乎所有类型的软件系统。
  • 反模式: 混合关注点,缺乏清晰的模块边界。
MVVC模式

此模式有助于将图形用户界面开发与业务或后端逻辑开发分离开来。MVVC的视图控制器负责从模型中公开数据对象,以便这些对象易于管理和呈现。此模式广泛用于桌面和移动应用等广泛的用户交互领域。

MVP模式

这种模式派生于模型-视图-控制器(MVC)模式,主要用于构建用户界面。在MVP中,呈现者承担了"中间人"的功能,模型和视图是完全分离的,并且仅通过呈现者相互通信。MVP是现代web应用的优秀架构,更容易实现自动化单元测试,并为项目提供了清晰的结构。

模型-视图-呈现者架构模式
模型-视图-呈现者架构模式
8. 解释器架构风格

解释器模式是一种设计模式,指定如何对语言中的句子求值。基本思想是在一种专门的计算机语言中为每个符号(终端或非终端)提供一个类。

  • 原理: 程序指令直接执行,无需事先转换成机器语言。
  • 优点: 更容易调试和测试,更灵活。
  • 缺点: 比编译语言慢,需要更多资源。
  • 应用: 脚本语言,一些高级编程语言。
  • 反模式: 在性能至关重要的地方使用解释器。
解释器体系架构模式
解释器体系架构模式
解释器模式

此模式指定如何计算语言中的句子,基本思想是在一种专门的计算机语言中为每个符号(终端或非终端)提供一个类。语言中句子的语法树是复合模式的一个实例,用于为客户端计算(解释)句子。此模式用于编程语言的编译器和解释器、正则表达式引擎以及处理和分析结构化文本数据。

9. 并发架构风格

并发是同时执行多个独立任务的系统的一种属性。

  • 原则: 程序的不同部分独立执行,也可能同时执行。
  • 优点: 可以显著提高性能,特别是在多核系统上。
  • 缺点: 设计和调试带有竞争条件和死锁的问题可能很复杂。
  • 应用: 实时系统、高性能计算、web服务器。
  • 反模式: 忽略潜在的并发问题,未正确同步共享资源。
Orchestration模式

在此模式中,控制器("调度器")控制服务之间的交互,指示业务逻辑的控制流,并确保一切都按调度进行。此模式通常用于必须协调多个服务并希望集中控制的复杂业务流程。

Orchestration模式
Orchestration模式
Choreography模式

此模式实现一个服务系统,每个服务独立工作,通过事件与其他服务交互,没有中央调度者。相反,每个服务都知道下一步该做什么。当我们想要创建分散的、高度解耦的系统,以实现更多的灵活性和可伸缩性时,可以使用此模式。

Choreography模式
Choreography模式
主从模式

此模式由两种类型组件组成: Primary和Secondary。主(Primary)部件将工作分配给相同的附属(Secondary)部件,并根据从附属部件返回的结果计算出最终结果。这种模式用于并行计算,通过将巨大的计算任务分配给几个处理器来更快执行计算。

流水线(Pipeline)/管道过滤(Pipe-Filter)模式

这种模式涉及一系列处理组件(进程、线程、协程等),以便一个组件的输出成为下一个组件的输入。其思想是将执行复杂处理的任务分解为可重用的独立组件。此模式用于Unix和类Unix操作系统中的管道命令。

10. 以数据为中心的体系架构

这种风格关注的是如何组织和转换数据,通常用于处理大量数据、执行复杂计算或需要高度可扩展的系统。

  • 原则: 数据库是体系架构的中心,所有交互都通过数据库进行。
  • 优点: 可以提供数据一致性、完整性和可靠性。
  • 缺点: 可能造成数据瓶颈和潜在的可伸缩性问题。
  • 应用: 企业应用、CRM系统和ERP系统。
  • 反模式: 忽略潜在的数据瓶颈,不考虑数据可伸缩性。
命令查询职责分离(CQRS)模式

此模式将数据存储的读写操作分离,支持读写工作负载的独立伸缩,并分别对其进行优化。这种模式非常适合读写负载差异很大的应用程序。

命令查询职责分离(CQRS)架构模式
命令查询职责分离(CQRS)架构模式
事件源模式

这种技术将应用状态建模为不可变序列或事件"日志"。事件源不是就地修改应用状态,而是存储触发状态变更的事件。此模式用于需要知道导致当前状态的事件的系统中,例如审计系统或实时协作应用程序。

Kappa模式

Kappa架构系统中存储的规范化数据是只能追加的不可变日志,而不是SQL之类的关系数据库或Cassandra之类的键值存储。这种模式用于实时数据处理系统。

Lambda模式

这种数据处理架构旨在利用批处理和流处理方法来处理大量数据,为硬件故障和人为错误提供了健壮、容错的系统。此模式用于大数据处理任务。

结论

总之,理解架构风格和模式对任何软件架构师或开发人员来说都至关重要。这些风格和模式提供了沟通、记录和探索设计可选方案的方法,为常见问题提供了解决方案,节省了时间和精力,帮助我们构建更健壮和可维护的系统。

本文探讨了各种体系架构风格和模式,每种风格和模式都有优缺点和理想用例。然而这只是冰山一角,还有更多更新的风格和模式在不断被开发出来。


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

本文由 mdnice 多平台发布

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

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

相关文章

早春氛围感穿搭~清新甜美的女童外套

告别臃肿的冬季 迎接浪漫清爽的春天吧 属于女孩子的甜美氛围感穿搭 一件粉粉嫩嫩的外套值得拥有 两侧实用口袋简单大方的款式 怎么穿都很好看哦!

从入门到精通:成为文件批量改名高手的必修之路

从入门到精通:成为文件批量改名高手的必修之路 在数字世界中,我们经常需要处理大量的文件,其中一项重要的任务就是对文件进行重命名。虽然许多操作系统都提供了简单的文件重命名工具,但对于需要批量处理大量文件的用户来说&#…

三防平板丨手持工业平板丨ONERugged工业三防平板丨推动数字化转型

随着科技的发展,数字化转型已经成为企业转型升级的必由之路。而在数字化转型中,三防平板作为一种重要的工具,可以极大地推动企业的数字化转型。本文将从以下几个方面探讨三防平板如何推动数字化转型。 一、提高工作效率 ONERugged加固平板的…

什么是LoRA(Low-Rank Adaptation)?

低秩适应(LoRA) 低秩适应(LoRA)是一种创新技术,它使得在保持预训练神经网络的基础上进行高效定制成为可能,比如在扩散模型或语言模型中的应用。这种方法的核心优势在于其能够通过仅训练相对较少的参数来实…

泰山派摄像头使用-opencv流程

1. 泰山派添加camera 连接摄像头连接到usb接口,查看dev设备: # 在终端中输入如下命令,可以查看到camera设备资源: ls /dev/video* 检查板卡上的camera设备资源示例 也可以使用v4l2命令查看 v4l2-ctl --list-devices v4l2-ctl --list-devices是一个命令…

人工智能_PIP3安装使用国内镜像源_安装GIT_普通服务器CPU_安装清华开源人工智能AI大模型ChatGlm-6B_002---人工智能工作笔记0097

接着上一节来看,可以看到,这里 创建软连接以后 [root@localhost Python-3.10.8]# ln -s /usr/local/python3/bin/python3 /usr/bin/python3 [root@localhost Python-3.10.8]# python3 -V Python 3.10.8 [root@localhost Python-3.10.8]# pwd /usr/local/Python-3.10.8 [root@…

绿色化 数据库 MongoDB 和 mysql 安装

绿色化 数据库 MongoDB 和 mysql 安装 【1.1】 前言 为什么要绿色化 安装呢?因为系统老升级,老重装!!也方便了解下数据库配置和库在那 绿色软件喜欢一般放在 D盘tools目录里 D:\tools\ 数据库 MongoDB D:\tools\MongoDB 数…

【Emgu CV教程】6.11、图像平滑之快速非局部平均去噪

文章目录 一、函数介绍1.FastNlMeansDenoising()函数2.FastNlMeansDenoisingColored() 二、举例1.原始素材2.灰度图FastNlMeansDenoising()快速非局部平均去噪3.彩色图像FastNlMeansDenoisingColored()快速非局部平均去噪 一、函数介绍 “快速非局部平均去噪” 是消除图像噪声…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-20-处理鼠标拖拽-下篇

1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,其次有人私信宏哥说是有那种…

Python假数据生成库之mimesis使用详解

概要 在软件开发和测试过程中,经常需要使用假数据来模拟真实环境,进行测试、演示或者填充数据库。Python Mimesis 库就是一个强大的工具,可以帮助快速、方便地生成各种类型的假数据。本文将深入探讨 Mimesis 库的功能、用法和示例代码,以帮助大家更好地了解如何利用这个库…

2024年及以后在您的项目中使用的最佳CSS框架

在过去几年中,CSS已经取得了长足的进步。在过去,您可能会使用CSS来创建依赖于HTML表格和CSS浮动作为其布局系统的简单外观的Web应用程序。而现在,您可以设计复杂的交互式用户界面,具有优雅的设计。 尽管CSS变得越来越先进&#x…

【ARMv8M Cortex-M33 系列 8.1 -- RT-Thread 堆内存 检查命令 free 实现及介绍】

文章目录 RT-Thread 堆内存 检查命令 free 实现及介绍rt_memory_info 函数验证 RT-Thread 堆内存 检查命令 free 实现及介绍 在RT-Thread系统中,通常可以通过rt_memory_info函数获取当前的堆内存使用信息,然后你可以包装这个函数来显示剩余的堆空间。rt…

Keil软件生成bin文件

首先需要在keil的魔法棒里将运行脚本加上 加上脚本后,还需要将编译后的文件存放于什么位置 C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o "$LL.bin" "#L" 到这里就可以了

【知识点】CNN中concat与add的区别

cat操作经常用于将特征联合,多个卷积特征提取框架提取的特征融合或者是将输出层的信息进行融合;而add层更像是信息之间的叠加。 add是在一个特征上增加其语义信息,对最终的图像的分类是有益;cat导致的结果改进可能是由于cat操作通…

嵌入式 系统 开发 - 第一件事 “搭开发环境”

无论是对DSP,FPGA,或其他可编程芯片开发 都要 “搭开发环境” : 懒得写太多字,画个图来扯淡吧! 看看实际 怎么搞的 :) 这张照片仅仅是 老哥 自己的一个DSP开发实际连结的搞法儿啊&#xff0c…

从零开始手写mmo游戏从框架到爆炸(十六)— 客户端指定回调路由与登录

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 我们这次来把注册、登录、选择英雄,进入主页-选择地图的功能完善。 在这之前,我们还要解决一个问题,就是服务端往客户端发消息的路由问题…

生产环境下,应用模式部署flink任务,通过hdfs提交

前言 通过通过yarn.provided.lib.dirs配置选项指定位置,将flink的依赖上传到hdfs文件管理系统 1. 实践 (1)生产集群为cdh集群,从cm上下载配置文件,设置环境 export HADOOP_CONF_DIR/home/conf/auth export HADOOP_CL…

面试redis篇-03缓存击穿

原理 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮 解决方案一:互斥锁 解决方案二:逻辑过期 提问与回答 面试官 &a…

Springboot+vue的疫情信息管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的疫情信息管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的疫情信息管理系统,采用M(model&a…

wordpress企业网站模板免费

绿色风格的wordpress免费模板,经测试可以免费下载的WP模板。 https://www.wpniu.com/themes/300.html 简洁大气的文化艺术类wordpress模板,可以免费下载,实用易上手,新手也适合。 https://www.wpniu.com/themes/304.html 高端大…