几种最佳软件架构模式
2023-02-18 16:32:08 阿炯

软件架构模式在其随时间扩展和满足用户需求的能力中起着至关重要的作用。本文涵盖了不同类型的软件架构模式、它们的重要性以及比较分析,以帮助您选择最佳的一种。原文地址

目录

什么是架构模式?
软件架构模式的重要性
软件架构模式与设计模式
不同类型的软件架构模式
不同软件架构模式的对比分析
是否有必要聘请软件架构师?


任何软件中的缺陷都会对组织的业务产生重大影响。任何软件失败的主要原因都可能是选择了错误的软件架构模式。但是有了先验知识,您将能够指导设计人员和开发人员设计组件及其反应方式。

经常看到公司在没有正式架构的情况下开始应用程序开发过程。然而,他们往往会忽略,缺少架构模式会迫使开发团队采用没有指导方针的传统模式。最终,他们最终得到的代码缺乏明确的角色、责任和彼此之间的关系。例如,在线银行应用程序不需要像微服务模式这样的复杂架构。它可以简单地使用客户端-服务器架构来开发以获取请求。但是,如果没有这个计划,应用程序可能会变得复杂,无法回头或在重组过程中损失巨额投资。规划架构模式有助于事先分析风险并避免对业务产生任何不利影响。

为了有一个清晰的理解,让我们探索什么是软件架构模式,并对其某些类型进行完整解释。

什么是架构模式?

架构模式可以称为大纲,它允许您为各种软件系统表达和定义结构模式。它是一个可重用的解决方案,提供一组预定义的子系统、角色和职责,包括用于定义它们之间关系的规则和路线图。它可以帮助您解决各种软件工程问题,例如性能限制、高可用性、最小化业务风险等。

尽管架构模式是系统的粗略图像或蓝图,但它并不是实际的架构。相反,它是一个帮助您理解软件架构元素的概念。可以有无数的架构实现相同的模式。这就是为什么模式被称为“严格描述和常用”的原因。系统的成功取决于软件架构的选择。

架构模式的著名示例是微服务、消息总线、服务请求者/消费者、MVC 模式、MVVM、微内核、n 层、领域驱动设计组件和表示-抽象-控制。

软件架构模式的重要性是什么?

软件架构模式具有重要意义,因为它可以解决不同领域内的各种问题。例如,复杂的用户请求可以很容易地分成更小的块并分布在多个服务器上,而不是依赖于单个服务器。在另一个示例中,可以通过划分软件的各个部分而不是一次测试整个软件来简化测试协议。

以下是软件架构模式对于任何软件应用程序都至关重要的更多原因:

定义应用程序的基本特征:了解每种架构的特性、优点和缺点对于选择合适的架构来满足您的业务目标非常重要。据观察,架构模式有助于定义应用程序的基本特征和行为。例如,一些架构模式可以自然地用于高度可扩展的应用程序,而另一些则可以用于敏捷应用程序。

保持质量和效率:您构建的任何应用程序很可能会面临质量问题。根据您的软件开发质量属性,选择架构模式可以帮助最大限度地减少质量问题,同时保持效率。

提供敏捷性:软件应用程序在软件开发过程中甚至在生产之后自然会经历无数次修改和迭代。因此,预先规划核心软件架构可为应用程序提供敏捷性,并使未来的调整变得毫不费力。

问题解决:预先规划和了解软件架构可以清楚地了解应用程序及其组件将如何运行。有了适当的架构,开发团队可以采用最佳实践来解决复杂的流程并解决未来的任何错误。

提高生产力:无论一个人对编程语言、框架或应用程序的技能和知识如何,都必须有一定的标准化原则。通过适当的应用模式,公司可以快速掌握项目的状态。此外,当架构模式到位以明确项目范围时,生产率会提高。

软件架构模式与设计模式

架构模式和设计模式之间只有一线之隔,大多数人会混淆两者。对于基础知识,让我们想象一下您的团队的任务是建造房屋并居住在其中。要开始这项任务,他们必须先计划好,然后再在空地上放置砖块和水泥。此外,即使在规划好房子之后,还需要更多的东西让它值得居住——他们需要基本的便利设施,如厨房用具、床上用品、洗漱用品等等。在这个类比中,房子的外观代表建筑模式,而房子的室内设计代表设计模式。

在软件系统中,当您必须创建业务逻辑、数据库逻辑、UI 等时,会考虑架构,而在实现业务逻辑或数据库逻辑时会使用软件设计模式。

不同类型的软件架构模式

让我们讨论一些流行的架构模式,它们帮助很多软件企业扩展了他们的业务:

1.分层架构模式

您可能听说过多层架构,也称为分层架构或 n 层架构。这种架构因其与许多初创企业和老牌企业中传统 IT 通信安排的共性而在设计师和软件架构师中广受欢迎。通常,分层架构分为四个不同的层:表示层、业务层、持久层和数据库;但是,该模式并不局限于指定的层,可以有应用层或服务层或数据访问层。像 Java EE 这样的流行框架使用了这种架构模式。

假设一位软件工程师正在构建一个大型应用程序,而您发现自己在架构模式中使用了所有四个层。另一方面,小型企业可能会将业务层和持久层合并为一个单元,主要是当后者作为业务逻辑层组件的组成部分参与时。

这种模式很突出,因为每一层在应用程序中扮演着不同的角色,并被标记为关闭。这意味着请求必须通过其正下方的层才能转到下一层。它的另一个概念——隔离层——使您能够在不影响其他层的情况下修改一层内的组件。

为简化此过程,让我们以电子商务 Web 应用程序为例。处理购物车活动所需的业务逻辑(例如计算购物车)直接从应用层提取到表示层。在这里,应用层充当集成层,在数据层和表示层之间建立无缝通信。此外,最后一层是数据层,用于独立维护数据,无需应用服务器和业务逻辑的干预。

用法:
需要快速构建的应用程序。
需要传统 IT 部门和流程的企业应用程序。
适用于开发人员经验不足且架构模式知识有限的团队。
需要严格的可维护性和可测试性标准的应用程序。

缺点:
无组织的源代码和没有明确角色的模块可能成为应用程序的问题。
跳过前面的层来创建紧密耦合可能会导致充满复杂相互依赖性的逻辑混乱。
基本修改可能需要完全重新部署应用程序。

图表:



2. 事件驱动架构模式

如果您正在寻找一种敏捷且高性能的架构模式,那么您应该选择事件驱动的架构模式。它由分离的、单一用途的事件处理组件组成,这些组件异步接收和处理事件。此模式围绕所有事件的生产、检测和消费以及它们引发的响应编排行为。

事件驱动的架构风格由两种拓扑组成——调解器和代理。当需要通过中央调解器在事件总线中编排多个步骤时,使用调解器。另一方面,代理用于在不使用中央调解器的情况下将事件链接在一起。

使用事件驱动架构的一个很好的例子是电子商务网站。事件驱动架构使电子商务网站能够在高需求时对各种来源做出反应。同时,它避免了应用程序的任何崩溃或资源的任何过度配置。

用法:
适用于单个数据块仅与少数模块交互的应用程序。
帮助用户界面。

缺点:
测试单个模块只有在它们是独立的情况下才能进行,否则,它们需要在一个功能齐全的系统中进行测试。
当多个模块处理相同的事件时,错误处理就变得难以构造。
如果事件有不同的需求,则为事件开发系统范围的数据结构会变得很困难。
对于解耦和独立的模块,维护基于事务的一致性机制可能会变得复杂。

图表:


3. 微内核架构模式

这种架构模式由两种类型的组件组成——一个核心系统和几个插件模块。虽然核心系统以最少的功能工作以保持系统运行,但插件模块是具有专门处理的独立组件。

如果我们从业务应用程序的角度来看,核心系统可以定义为通用业务逻辑,没有针对特殊情况、特殊规则或复杂条件过程的自定义代码。另一方面,插件模块旨在增强核心系统以产生额外的业务能力。

以任务调度程序应用为例,微内核包含调度和触发任务的所有逻辑,而插件包含具体任务。只要插件遵循预定义的 API,微内核就可以触发它们而无需知道实现细节。

用法:
在基本例程和高阶规则之间有明确划分的应用程序。
具有一组固定的核心例程和一组需要频繁更新的动态规则的应用程序。

缺点:
插件必须有良好的握手代码,以便微内核知道插件安装并准备好工作。
如果有多个插件依赖于它,则更改微内核几乎是不可能的。
提前为核函数选择合适的粒度是困难的,后期更复杂。

图表:


4. 微服务架构模式

微服务架构模式被视为单体应用程序和面向服务架构的可行替代方案。这些组件通过有效、简化的交付管道部署为单独的单元。该模式的好处是增强了可伸缩性和应用程序内的高度解耦。

由于其解耦和独立的特点,通过远程访问协议访问组件。此外,相同的组件可以单独开发、部署和测试,而不依赖于任何其他服务组件。

Netflix 是微服务架构模式的早期采用者之一。该架构允许工程团队以小团队形式工作,负责数百个微服务的端到端开发。这些微服务协同工作,每天向数百万 Netflix 客户提供流媒体数字娱乐。

用法:
需要快速开发的业务和 Web 应用程序。
具有小型组件的网站、边界明确的数据中心以及全球远程团队。

缺点:
为服务组件设计合适的粒度级别始终是一个挑战。
所有应用程序都不包括可以拆分为独立单元的任务。
由于任务分布在不同的微服务中,性能可能会受到影响。

图表:


5. 基于空间的架构模式

元组空间的概念——分布式共享内存的思想是该架构名称的基础。基于空间的模式包括两个主要组件——处理单元和虚拟化中间件。

处理单元包含部分应用程序组件,包括基于 Web 的组件和后端业务逻辑。虽然较小的 Web 应用程序可以部署在单个处理单元中,但较大的应用程序可以将应用程序功能拆分为多个处理单元以避免功能崩溃。此外,虚拟化中间件组件包含控制数据同步和请求处理的各个方面的元素。它们可以是自定义编写的,也可以作为第三方产品购买。

投标拍卖网站可以被认为是这种架构模式的合适示例。它的功能是网站通过浏览器请求接收互联网用户的出价。收到请求后,站点会记录带有时间戳的出价,更新最新出价的信息,并将数据发送回浏览器。

用法:
具有大量用户群和持续不断的请求负载的应用程序和软件系统。
应该解决可伸缩性和并发性问题的应用程序。

缺点:
在不干扰多个副本的情况下缓存数据以提高速度是一项复杂的任务。

图表:


6.客户端-服务器架构模式

客户端-服务器架构模式被描述为具有两个主要组件的分布式应用程序结构——客户端和服务器。这种架构方便了客户端和服务器之间的通信,客户端和服务器可能在也可能不在同一个网络下。客户端请求从服务器获取特定资源,这些资源可能是数据、内容、服务、文件等形式。服务器识别发出的请求并通过发送请求的资源来适当地响应客户端。

客户端和服务器的功能特性是在应用程序中相互交互的程序示例。这种架构的功能非常灵活,因为单个服务器可以为多个客户端提供服务,或者单个客户端可以使用多个服务器。服务器可以根据它们提供的服务或资源进行分类,而不管它们的性能如何。

电子邮件是使用客户端-服务器模式构建的模型的一个突出示例。当用户/客户端搜索特定电子邮件时,服务器会查看资源池并将请求的电子邮件资源发送回用户/客户端。这也有助于您改善用户体验。

用法:
电子邮件、在线银行服务、万维网、网络打印、文件共享应用程序、游戏应用程序等应用程序。
专注于实时服务的应用程序(如电信应用程序)是使用分布式应用程序结构构建的。
需要受控访问并为大量分布式客户端提供多种服务的应用程序。
具有集中资源和服务的应用程序必须分布在多个服务器上。

缺点:
不兼容的服务器容量可能会变慢,从而导致性能瓶颈。
服务器通常容易出现单点故障。
改变模式是一个复杂而昂贵的过程。
服务器维护可能是一项要求高且成本高的任务。

图表:


7. 主从架构模式

想象一个单一的数据库同时接收多个相似的请求。当然,同时处理每一个请求会使申请流程复杂化并减慢速度。这个问题的解决方案是主从架构模式,主数据库启动多个从属组件以快速处理这些请求。

顾名思义,主从架构模式可以被描绘成一个主节点向它的从节点分发任务。一旦从属组件完成任务,分布式任务由主组件编译并显示为结果。

必须注意,主机对从属组件具有绝对控制权和权力,决定它们的通信和功能优先级。这种模式的独特之处在于,每个从站都会同时处理请求,同时提供结果。这也意味着在每个从站都将结果返回给主站之前,从站操作不会被视为完成。

这种模式非常适合可以分成更小的段来执行类似请求的应用程序。一个合适的例子是需要繁重的多任务处理作为其重要组成部分的数据库应用程序。

用法:
开发可能需要多处理器兼容架构的操作系统。
必须将较大的服务分解为较小的组件的高级应用程序。
应用程序通过分布式网络处理存储在不同服务器中的原始数据。
遵循多线程以提高其响应能力的 Web 浏览器。

缺点:
主组件故障可能导致数据丢失,而从属组件没有备份。
系统内的依赖关系会导致从属组件出现故障。
由于从属组件的隔离特性,间接成本可能会增加。

图表:


8.管道过滤器架构模式

管道过滤器架构模式处理单向流中的数据流,其中组件称为过滤器,管道是连接这些过滤器的组件。处理数据链发生在管道将数据传输到过滤器的地方,一个过滤器的结果成为下一个过滤器的输入。该体系结构的功能是将重要的组件/流程分解为可以同时处理的独立和多个组件。

管道过滤器模式最适合使用 Web 服务处理流中数据的应用程序,并且可以创建从简单序列到复杂结构的应用程序。编译器可以被认为是具有这种架构模式的合适示例,因为每个过滤器都执行词法分析、解析、语义分析和代码生成。

用法:
它可用于促进简单的单向数据处理和转换的应用程序。
使用电子数据交换和外部动态列表等工具的应用程序。
开发用于错误检查和语法分析的数据编译器。
在 UNIX 等操作系统中执行高级操作,其中程序的输出和输入按顺序连接。

缺点:
如果基础设施设计不可靠,过滤器之间可能会丢失数据。
最慢的过滤器限制了整个架构的性能和效率。
在过滤器之间传输期间,数据转换开销成本可能会增加。
该架构的持续转换特性使其对交互系统的用户友好性降低。

图表:


9. 代理架构模式

代理模式用于构建具有解耦组件的分布式系统。通过调用远程服务,组件可以在代理架构模式中与其他组件交互。此外,代理负责组件之间的所有协调和通信。

客户端、服务器和代理是代理模式的三个主要组件。通常,经纪人可以访问与特定服务器相关的所有服务和特性。当客户向经纪人请求服务时,经纪人将他们重定向到合适的服务类别以进行进一步处理。

这种体系结构模式的主要优点之一是它如何以动态方式管理与对象相关的操作,例如更改、添加、删除或重定位。最后,这种架构模式将所有与通信相关的代码从应用程序中分离出来,允许应用程序在分布式或单台计算机上运行。由于这些优势,代理架构一直很流行。

用法:
用于 Apache ActiveMQ、Apache Kafka、RabbitMQ 和 JBoss Messaging 等消息代理软件。
用于构建具有解耦组件的分布式系统。

缺点:
容错能力较浅。
需要服务描述的标准化。
隐藏层可能会降低软件性能。
更高的延迟,需要更多的部署工作。

图表:


10. 点对点架构模式

在点对点架构模式中,各个组件称为对等点。对等点可以充当客户端、服务器或两者兼而有之,并随时间动态改变其角色。作为客户端,一个对等点可以向其他对等点请求服务,作为服务器,一个对等点可以为其他对等点提供服务。点对点和客户端-服务器架构之间的显着区别在于网络上的每台计算机都具有相当大的权限并且没有集中式服务器。它的容量随着越来越多的计算机加入网络而增加。

对等体系结构模式的一个很好的例子是文件共享网络,如 Skype、BitTorrent 和 Napster。在 BitTorrent 中,点对点架构用于以分散的方式在 Internet 上分发数据和文件。通过使用此协议,可以非常轻松地传输大型视频和音频文件。在 Skype 中,您使用 VoIP P2P 架构模式来拨打语音电话并向其他用户发送文本消息。通过这种方式,您可以使用对等架构进行文件共享、消息传递、协作等。

用法:
文件共享网络,例如 Gnutella 和 G2。
基于加密货币的产品,例如比特币和区块链。
P2PTV、PDTP等多媒体产品。

缺点:
无法保证高质量的服务。
实现强大的安全性具有挑战性。
性能取决于连接到网络的节点数。
无法备份文件或文件夹。
可能需要一个特定的接口来读取文件。

图表:



不同软件架构模式的对比分析

到目前为止,我们已经了解了不同类型的架构模式。现在您会为所用的软件类型选择哪种架构?您需要做出正确的选择。

是否有必要聘请软件架构师?

在我看来,“架构师”一定是高级程序员。拥有一个不会编程的架构师和少数不了解架构基础知识的程序员是软件公司灾难的根源。现代应用程序需要快速思考和标准化核心,为应用程序建立坚如磐石的基础。软件架构模式为相关应用程序和公司的长期目标设定了基于解决方案的愿景。


八种常用的软件架构模式的原理与应用


软件架构模式是软件开发的基础,决定了软件各个功能模块之间的层级关系、依赖关系、通信方式,也影响着软件的开发、调试、运维和升级方式。本节重点讲解在软件开发中8种常见的架构模式,欢迎阅读。

分层模式

分层模式基本上是软件中最常用、最普遍的模式。顾名思义,在分层架构中,一个软件整体被分为多个层级,每一层担负着不同的职责与角色。

通常情况下,一个软件整体会分为3层:表示层、业务逻辑层和数据访问层。表示层即用户界面层,还有一部分对外提供的api、sdk接口服务。表示层直接面向用户,跟用户打交道,接收用户的使用指令并将IO输入下发到业务逻辑层;同时,将业务逻辑层的运算结果、静态页面、动态页面显示给用户。

业务逻辑层作为表示层和数据访问层之间的连接者,对表示层提供需要的业务逻辑,同时借助于数据访问层获得数据。主要提供的功能包括验证、计算和业务规则。数据访问层主要负责数据的增、删、改、查,它不包括数据库,只是对数据的读写。


采用分层架构,各层间充分解耦,结构和任务清晰明确。同时,提高了各层的可扩展性、可维护性。也可以并行开发,迅速响应需求的变化。但是,分层架构一定程度上降低了系统的运行效率。比如原本简单的数据查询在表示层就可以直接做的,分层之后就必须通过业务逻辑层才可以。多了中间层,一个层级的代码调整,会影响到多个层级都要跟着调整,级联的修改导致代码修改成本增加。

管道-过滤器模式

一个事件可以导致一系列的步骤发生,每一个步骤执行特定的功能。管道-过滤器架构是将一个大的任务拆分成多个顺序执行的子任务,子任务串行处理。就像是生产车间的流水线一样,原始数据在水流线上跑动,每经过一个环节就进行一次加工处理,最终变为最终的数据。我们可以看到,每一个【管道-过滤器】就是一个功能模块,它由输入、业务逻辑、输出3个部分构成。每经过一个管道-过滤器组合,数据便被处理一次。


管道-过滤器模式核心在于任务拆解,将复杂的任务化繁为简,形成串行的多任务处理机制。只实际开发中,存在数据封装的要求,因为每个【管道-过滤器】组合的输入、输出都是有特定格式要求的。此外,虽然对于单个任务是串行处理的,其实【管道-过滤器】组合可以并行处理多个任务,过滤器中的任务处理是独立的,并不依赖于其他的过滤器。


客户端-服务器模式C/S

C/S架构中,客户端作为服务的请求者和消费者,服务器作为服务的提供者,两个部分通过网络进行连接和交互。C/S模式的优点是比较容易对client和server进行建模,但是会出现单点故障和性能方面的瓶颈。C/S架构的安全性比B/S高一些,适合金融业务、邮件业务和共享文档等业务。

客户端的升级也是比较复杂的事情,如果软件需要升级,那么需要对所有的客户端做手动升级才可以。现在有了云服务,客户端升级可以做批量,这仍是一项耗时的工作。

模型-视图-控制器模式MVC

模型-视图-控制器模式( Model-View-Controller)又称MVC模式。这是一种类似于分层模式的开发架构,MVC可以将用户页面和业务逻辑进行分离,在二者之间增加了一道控制器。UI的显示和业务逻辑处理要经过控制器的转换和传送,才可以进行交互。这样做让Model和View之间充分解耦,提高了整个软件的可扩展性、复用性和灵活性。


我们知道,UI界面在开发中是改动最为频繁的部分,那么通过MVC模式,就可以将UI改动对于业务的影响降低到最小。

事件总线模式

事件总线模式是一种基于监听机制的工作架构,由事件、监听器、通道和事件总线四部分组成。

首先,监听器订阅事件通道,与其建立绑定关系,当事件源需要触发某个任务时会告知特定的通道。然后,与通道建立了订阅关系的监听器会收到消息通知,最后执行监听器中的各项任务。


事件总线模式类似于广播机制,我们可以通过添加订阅者来增加某个事件源的响应者。这种模式在Android开发中经常会用到。比如EventBus订阅者,它可以实现Activity、Service、Fragment、等组件间的通信。

微服务模式

当前,在很多大的应用软件,比如企业OA系统,一体化计划建设系统等,这些系统涉及到的流程特别复杂,功能超级多。如果采用基本的浏览器或者原生开发很难有效完成部署和升级迭代。

可以采用微服务架构,我们“化繁为简”把某一类功能归类,把整个系统作为一个个独立的微服务。各个微服务之间有自己的API边界,甚至可以采用不同的编程语言。


在数据库层面可以通过API接口调用,或者用消息队列通信。微服务的架构使得繁杂的系统具备独立开发、独立部署的良好特点,特别适合庞大的企业应用软件。

点对点模式

点对点模式又称p2p模式(peer to peer),每个组件被称为节点。节不同的节点既可以作为客户端,向其他节点发请求。也可以作为其他节点的服务端,响应对方的请求。这种模式具有很强的健壮性和可扩展性。同时,系统性能往往依赖于节点的数量,且节点之间是资源合作的关系。因此,服务质量、安全性方面可能得不到很好的保障。点对点模式常用于文件共享网络类型的企业应用。


在点对点模式中,生产者(producer)发送一条消息到消息队列queue,队列中的消息只能被一个消费者接收到并处理。并且,消费者Consumer随时处于接收消息的状态。

主从模式

主从模式由master、slave两大组件构成,master组件会将工作分配给slave组件,并根据slave组件返回的结果计算出最终结果。


主从模式中,服务的执行委托给具有不同实现的不同从服务器。该模式经常用于将主数据库视和从数据库,并将数据同步到从库。

以上是关于软件开发中常用的框架模式,框架模式直接决定了开发中各个功能模块之间的依赖关系,以及数据交互方式等等。


说了模式,再来看风格,在此列出了12种常见的软件架构风格。

本节转自程序新视界,感谢原作者。

什么是软件架构
软件架构是定义软件系统的高级结构和组织的过程。它涉及识别和选择正确的组件,决定它们之间如何交互,以及确定它们应该如何组织以实现特定的目标。软件架构的目标是创建一个可维护、可扩展和安全的系统,能够满足用户和组织的需求。

为什么需要软件架构
强大的架构为构建满足用户和利益相关者需求的软件提供了坚实的基础。它确保系统满足其功能和非功能需求,如性能、安全性和可靠性。通过良好设计的架构,开发人员可以构建易于修改和扩展的软件,从而更容易适应不断变化的业务需求。软件架构对于管理复杂性也至关重要。随着软件系统变得越来越复杂,了解不同组件之间如何交互变得具有挑战性。良好设计的架构提供了对系统的高级视图,使得更容易理解其结构和操作。这反过来帮助开发人员识别潜在问题,并就如何修改系统做出明智决策。

如何文档化架构?4C模型。
上下文级别(Context Level)
在最高级别的上下文级别,描述系统的外部环境,如用户、其他系统、法规等。这一级别提供了系统的目的和与外部世界的关系的高级概述。它有助于识别将与系统交互的利益相关者以及影响其设计和开发的因素。

容器级别(Containers level)
下一个级别是容器级别,它描述了系统的运行时环境,如服务器、数据库或消息队列。这一级别有助于识别主要的技术选择和部署决策。它提供了对将支持系统的物理基础设施以及部署和维护所需的工具和资源的理解。

组件级别(Components level)
第三个级别是组件级别,它描述了系统的主要功能构建块。这一级别有助于识别构成系统的模块、类或函数。它提供了对系统功能和其不同组件之间关系的理解。

代码级别(Code level)
最后,代码级别是最低级别,描述了实际代码及其如何实现组件。这一级别提供了对系统如何工作以及其不同组件如何相互交互的详细理解。对于将与代码一起工作的开发人员来说,清楚代码如何结构化和工作是至关重要的。

使用C4模型,软件架构师可以创建图表和书面文档,描述每个级别,提供系统架构的全面视图。这种方法有助于识别潜在问题和权衡,同时促进可扩展性、可维护性和适应性。通过以这种方式记录架构,开发人员和利益相关者可以清晰、易于理解地了解系统,从而更容易根据业务需求进行修改和扩展。以下为软件工程师应该了解的12中软件架构风格与设计。

1. 客户端-服务器
客户端-服务器架构是一种模型,其中客户端(用户或应用程序)向服务器发送请求,服务器则返回所请求的数据或服务。客户端和服务器可以在同一台机器上,也可以通过网络连接在不同的机器上。客户端负责发起与服务器的通信并发送请求;而服务器则监听来自客户端的请求,处理并返回响应。

客户端-服务器架构的优势:
可扩展性:客户端-服务器架构具有很高的可扩展性,因为它允许多个客户端连接到同一个服务器并共享资源。
安全性:客户端-服务器架构提供比其他网络模型更好的安全性,因为服务器可以控制对资源和数据的访问。
可靠性:客户端-服务器架构非常可靠,因为服务器可以在发生故障时提供备份和恢复服务。

2. 分层
这是一种设计复杂软件系统的常见方式,它将系统分解为多个层,每个层负责特定的功能集。这种方法有助于组织代码,并使得系统随着时间的推移更容易维护和修改。典型的分层架构包括三个主要层:表示层、业务逻辑层和数据访问层。

表示层:表示层负责向用户显示信息并收集输入。该层包括用户界面和与用户直接交互的其他组件。用户界面是用户看到和与之交互的内容,例如按钮、文本框和菜单。表示层还包括与用户界面相关的任何逻辑,例如事件处理程序和验证。

业务逻辑层:业务逻辑层负责实现应用程序的业务规则。该层包含处理和操作数据的代码,以及任何其他应用程序逻辑。业务逻辑层是软件发挥魔力的地方,它是软件执行计算、做出决策和执行任务的地方,也是软件真正发挥作用的地方。

数据访问层:数据访问层负责与数据库或其他外部数据源进行交互。该层包含读取和写入数据到数据库的代码。数据访问层是软件检索数据、对数据进行更改并将更改保存回数据库的关键。这一层对软件的功能至关重要,因为它使得软件能够存储和检索数据。

3. 管道和过滤器
管道和过滤器架构是一种设计模式,允许软件系统通过将处理任务分离为多个独立组件来处理数据。这种架构对于需要处理大量数据的系统特别有帮助。它可以提高性能、可扩展性和可维护性。

管道和过滤器架构基于管道的概念,数据通过一系列处理步骤流动,每个步骤执行特定的任务。每个处理步骤都被实现为一个独立的组件或过滤器,它接受数据作为输入,在数据上执行某些操作,并生成输出数据。输出数据随后传递给管道中的下一个过滤器。

管道中的过滤器彼此独立,这意味着它们可以单独开发、测试和部署。这使得可以很容易地向管道中添加新的过滤器或修改现有过滤器,而不会影响系统的其他部分。

优势:
可扩展性:该架构可以通过向管道中添加更多的过滤器来进行水平扩展,从而使系统能够处理更大量的数据。
性能:该架构可以通过将数据处理并行化到多个过滤器上来优化性能。
可维护性:该架构促进了模块化和关注点分离,使得系统更易于维护和更新。

4. 主从
主从架构是一种在分布式系统中使用的设计模式,其中一个节点(主节点)控制一个或多个节点(从节点)执行特定任务。主节点负责将工作负载分配给从节点,并协调它们的活动。从节点没有与主节点相同的控制级别,只执行主节点分配给它们的任务。

优势:最重要的优势之一是它允许有效地将工作负载分布到多个节点上。这有助于减轻任何一个节点的负载,并确保系统能够处理大量的数据和流量。

使用主从架构的另一个优势是它提供了容错能力。如果一个从节点失败,主节点可以重新分配其工作负载给其他从节点。这确保即使一个或多个节点失败,系统仍然可以正常运行。

5. 微内核
微内核架构,也称作插件化架构,是一种软件设计模式,允许开发人员构建更模块化和灵活的系统。它将核心系统功能与其他功能分离,这些功能在单独的模块中实现。系统的核心功能在微内核中实现,微内核是一个最基本的核心系统,只提供运行系统所需的最基本服务。这是一种即插即用的概念。

示例:

以电子商务网站为例。微内核将提供处理用户身份验证、管理用户会话和处理付款等基本服务。其他功能,如产品推荐、用户评论和社交媒体集成,将在单独的模块中实现。如果网站想要添加一个新功能,比如一个忠诚度计划,可以将其作为一个独立的模块开发并添加,而不会影响系统的核心功能。这种模块化使得可以更容易地添加新功能或删除现有功能,而不会影响核心系统功能。

此外,如果网站想要根据不同用户的特定需求定制其系统,可以为每个用户选择所需的模块。例如,经常购买电子产品的用户可以提供一个推荐电子产品的模块。另一方面,经常购买化妆品的用户可以提供一个推荐化妆品的模块。最后,如果网站想要扩展其系统以处理更多用户或硬件变化,可以根据需要轻松添加或删除模块。这种可扩展性使得可以更容易地根据用户需求或底层硬件的变化调整系统。

6. 领域驱动设计(DDD)
在本质上,DDD是一种关于软件架构的思考方式,强调项目的领域或问题空间。这意味着开发人员关注的是软件的业务逻辑,而不仅仅是技术实现。

在实践中,这意味着开发人员首先理解他们正在工作的领域,并将其分解为更小、更可管理的部分。然后,他们使用这种理解创建领域模型,这是领域内不同实体及其相互交互的表示。

创建了领域模型后,开发人员可以使用它来指导软件的其余架构。这包括创建有界上下文(Bounded Context),它们是由特定语言和上下文定义的软件区域,以及聚合(Aggregates),它们是作为单个单元对待的相关实体的集合。

7. 基于组件
在软件工程中,基于组件的架构(CBA)是一种强调可重用软件组件的软件设计和开发方法。CBA的思想是通过将复杂系统拆分为更小、更可管理的组件,从而使软件开发更加高效和有效。

什么是组件?
软件组件是一种模块化、自包含的软件单元,可以在不同的系统中重复使用。组件通常具有明确定义的接口,指定其他组件如何与其交互。该接口包括有关组件的输入、输出和行为的信息。

组件可以根据其功能进行分类,例如用户界面组件、数据访问组件和业务逻辑组件。每种类型的组件在软件系统中扮演特定的角色,并可以通过其接口与其他组件进行交互。

8. 面向服务体系结构(SOA)
SOA是一种旨在创建模块化、可重用服务的架构风格,这些服务可以轻松地与其他服务集成以创建一个更大的系统。在这种方法中,服务通过接口公开其功能,其他服务或应用程序可以访问这些接口。

在核心层面上,SOA是通过将软件拆分为更小的组件或模块来构建软件。这种模块化的方法使开发人员可以专注于构建特定的功能,并将其与其他部分集成以创建一个更大的系统。

SOA的核心组件
服务提供者:服务提供者负责创建和公开服务,供外界使用。这些服务可以被其他服务、应用程序或最终用户使用。例如,付款处理服务提供商可以创建和公开一个服务,允许其他应用程序处理付款。

服务注册表:服务注册表是可供其他服务或应用程序访问的可用服务的目录。服务注册表提供有关服务的信息,如名称、位置和接口。例如,如果一个应用程序需要处理付款,它可以使用服务注册表找到付款处理服务并访问其接口。

服务请求者:服务请求者负责消费服务提供者公开的服务。可以通过使用服务注册表找到合适的服务,然后调用其接口来完成。例如,一个应用程序可以使用服务注册表找到付款处理服务,然后使用其接口来处理付款。

9. 单体
单体架构是一种存在了几十年的软件设计风格。它是将应用程序作为一个单一、紧密结合的单元构建的一种方式,而不是将其拆分为个别的、更小的组件。

在单体架构中,整个应用程序被构建为一个单一的、自包含的单元。所有的代码和依赖项都打包在一起,因此应用程序可以在单个服务器上部署和运行。这使得开发和部署应用程序变得容易,因为所有内容都在一个地方。它也使得通过添加更多的服务器来实现水平扩展变得更容易。

单体架构的优势
单体架构最大的优势之一是它的简单性。由于所有内容都包含在一个单元中,所以需要关注的移动部分较少。这使得开发、测试和部署应用程序更加容易。另一个优势是单块应用程序的维护和调试更容易。由于所有内容都在一个地方,更容易追踪问题并进行修复。

单体架构的缺点
单体架构最大的缺点之一是在垂直方向上扩展应用程序可能很困难。由于所有内容都在单个服务器上运行,应用程序能够处理的流量有限。

另一个缺点是在单体应用程序中很难采用新的技术和语言。由于所有内容都打包在一起,很难在不破坏整个应用程序的情况下更新单个组件。

10. 微服务
微服务架构是一种软件架构风格,将应用程序构建为一组小型、独立的服务,它们通过网络相互通信。每个服务专注于特定的业务能力,并可以独立于系统中的其他服务进行开发、部署和扩展。

微服务架构的主要思想是将一个大型的、单体式应用程序拆分为更小、更易管理的服务。这种方法带来了许多好处,如提高可扩展性、增加灵活性和更快地推出新功能。

在微服务架构中,每个服务可以独立地进行扩展,更容易处理流量峰值或需求变化。开发人员还可以修改或添加新的服务,而不影响系统的其他部分,从而加快了开发过程。

微服务架构的挑战
尽管微服务架构带来了许多好处,但也引入了额外的复杂性。其中一个最大的挑战是管理服务之间的通信。服务需要能够发现彼此并有效地进行通信,这在规模上可能很困难。在微服务架构中,负载均衡和容错性也更加复杂。

另一个挑战是确保每个服务都有自己的数据存储。在单体应用程序中,所有数据通常存储在一个数据库中。而在微服务中,每个服务应该有自己的数据存储,以确保对一个服务的更改不会影响系统中的其他服务。这可能导致数据管理和同步方面的复杂性增加。

微服务架构的最佳实践
为了确保基于微服务的系统的成功,开发人员应遵循设计和实现微服务的最佳实践。其中一些最佳实践包括:

设计松耦合、高内聚的服务,具有清晰的边界和明确定义的接口。
使用容器化技术,如Docker,将每个服务打包和部署为单独的容器。这样可以根据需要轻松地扩展和部署各个服务。
实施有效的监控和管理工具,以确保系统的平稳运行,并快速检测和解决问题。
使用服务网格,如Istio,管理服务之间的通信和负载均衡。
实施持续集成和部署(CI/CD)流水线,自动化测试和部署微服务。

11. 事件驱动
事件驱动架构(EDA)是一种设计软件系统的方法,它能够实现不同组件或服务之间的快速高效通信。在这种范式中,不同的软件组件通过事件相互通信,而不是通过直接的请求或响应。

在事件驱动架构中,事件由软件系统的不同组件生成,例如用户界面或后端服务。这些事件随后广播到系统的其他组件,这些组件可以订阅事件并根据需要对其进行处理。

例如,考虑一个简单的电子商务应用程序。当下达一个新订单时,订单处理服务可以生成一个“订单创建”事件,然后广播到其他服务,如库存管理、发货和结算。每个服务都可以处理事件并对其各自的系统进行更新。

事件驱动的好处
事件驱动架构的一个关键好处是它能够解耦软件系统的不同组件。当不同组件通过事件而不是直接请求进行通信时,它们对彼此的依赖性较小。这使得更容易更改或更新系统的各个组件,而不会影响系统的其他部分。

事件驱动架构的另一个好处是可扩展性。由于事件广播到系统的多个组件,可以并行处理大量的数据和事务。这使得更容易处理高流量和需求峰值。

事件驱动架构的挑战
尽管事件驱动架构具有许多好处,但也存在一些挑战。其中一个主要挑战是管理事件驱动系统的复杂性。由于事件可以由许多不同的组件生成和消费,跟踪和调试出现的问题可能很困难。另一个挑战是确保事件按正确的顺序处理。由于事件可以异步生成和处理,事件的处理顺序可能不正确。这可能导致数据不一致或计算错误等问题。

12. 基于流
随着软件开发变得越来越复杂,对可扩展性的需求也越来越高,传统的架构变得越来越不够用。基于流的架构作为一种有前途的替代方案出现,使开发人员能够构建能够实时处理大量数据的系统。

基于流的架构的核心是基于事件驱动编程的原则。基于流的系统不是批量处理数据,而是实时处理数据生成的数据。这使得开发人员能够构建能够以最小延迟响应数据变化的系统。

基于流的架构的好处
基于流的架构的一个关键好处是可扩展性。由于数据是实时处理的,基于流的系统可以处理大量的数据,而无需复杂的批处理流程。这使得可以构建每秒处理数百万个事件的系统,非常适合传感器数据处理、金融交易和在线广告等用例。

基于流的架构的另一个好处是灵活性。由于数据是实时处理的,可以构建能够以最小延迟响应数据变化的系统。这使得可以构建复杂的、事件驱动的系统,能够适应不断变化的业务需求。例如,在电子商务平台中,可以使用基于流的架构实时跟踪用户活动,并根据用户的浏览和购买历史提供个性化推荐和促销活动。

此外,基于流的架构可以带来显著的成本节省。传统的批处理流程需要昂贵的硬件和复杂的软件基础设施来管理数据处理。而基于流的系统可以建立在廉价的通用硬件上,使得扩展和维护更加容易。最后,基于流的架构具有很高的容错性。由于数据是实时处理的,可以构建能够自动从故障中恢复的系统,无需手动干预。这使得可以构建具有高可靠性的大规模运行系统,降低数据丢失或系统停机的风险。

小结
软件架构对于构建满足用户和利益相关者需求的成功软件系统至关重要。它提供了设计和开发软件系统的蓝图,确保系统满足其功能和非功能需求,促进适应性,并帮助管理复杂性。因此,在软件开发项目的开始阶段投入时间和资源来设计一个健壮的架构是至关重要的。希望本文章能够对你有一些帮助。