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、微服务

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

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

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

微服务架构的挑战

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

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

微服务架构的最佳实践

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

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

11、事件驱动

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

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

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

事件驱动的好处

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

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

事件驱动架构的挑战

尽管事件驱动架构具有许多好处,但也存在一些挑战。其中一个主要挑战是管理事件驱动系统的复杂性。由于事件可以由许多不同的组件生成和消费,跟踪和调试出现的问题可能很困难。

另一个挑战是确保事件按正确的顺序处理。由于事件可以异步生成和处理,事件的处理顺序可能不正确。这可能导致数据不一致或计算错误等问题。

12、基于流

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

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

基于流的架构的好处

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

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

此外,基于流的架构可以带来显著的成本节省。传统的批处理流程需要昂贵的硬件和复杂的软件基础设施来管理数据处理。而基于流的系统可以建立在廉价的通用硬件上,使得扩展和维护更加容易。

最后,基于流的架构具有很高的容错性。由于数据是实时处理的,可以构建能够自动从故障中恢复的系统,无需手动干预。这使得可以构建具有高可靠性的大规模运行系统,降低数据丢失或系统停机的风险。

小结

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

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

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

相关文章

小红书自动化仿写发文机器人了解一下

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽!

权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽 一、SpringCloud GateWay 1.它是如何工作的? ​ 客户端向 Spring Cloud Gateway 发出请求。如果Gateway处理程序映射确定一个请求与路由相匹配,它将被发送到Gateway Web处理程序。…

蓝桥杯第十四届--异或和之和

题目描述 给定一个数组 Ai,分别求其每个子段的异或和,并求出它们的和。或者说,对于每组满足 1 ≤ L ≤ R ≤ n 的 L, R ,求出数组中第 L 至第 R 个元素的异或和。然后输出每组 L, R 得到的结果加起来的值。 输入格式 输入的第一…

基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 关键概念与模型 4.2数学模型 5.完整程序 1.程序功能描述 基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出ACO优化的收敛曲线,规划路径结果和每一条路径的满载率。 2.测试软…

C# MES通信从入门到精通(8)——C#调用Webservice服务进行数据交互

前言 在上位机开发领域,使用webservice来访问客户的终端Mes系统是一项必备的技能,本文详细介绍了如何在c#中调用webservice服务,不仅介绍了使用添加服务引用直接调用webservice中的方法外还介绍了使用http的post方法调用webservice方法,过程详细且均为实战经验总结,对于初…

十个排序算法

目录 冒泡排序(Bubble Sort) 选择排序(Select Sort) 插入排序(InsertSort) 希尔排序(ShellSort) 计数排序(CountSort) 快速排序(QuickSort) 归并排序(Merge Sort&a…

chatGPT4无法登录

遇到问题:chatgpt网站上点击登录(log in),网站就会跳转并显示:unable to connect 解决方法:不要用亚洲节点,亚洲节点被全面封禁,在全局代理中可以换成美国的节点

故障诊断 | 一文解决,PLS偏最小二乘法的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,PLS偏最小二乘法的故障诊断(Matlab) 模型描述 偏最小二乘法(Partial Least Squares, PLS)是一种统计建模方法,用于建立变量之间的线性关系模型。它是对多元线性回归方法的扩展,特别适用于处理高维数据和具有多重共线性的数据集。…

Idea显示无法自动装配。找不到‘ xxx’类型的Bean

虽然只标红,不报错,但是看着非常别扭! 原因: 当我们在使用Autowired注解的时候,默认requiredtrue,表示注入的时候bean必须存在,否则注入失败。 解决方案一: 在自动转配的注解后面添加(require…

AcWing 788. 逆序对的数量——算法基础课题解

AcWing 788. 逆序对的数量 题目描述 给定一个长度为 n 的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i 个和第 j 个元素&#xff0c;如果满足 i<j且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。…

HTML基础知识详解(上)(如何想知道html的全部基础知识点,那么只看这一篇就足够了!)

前言&#xff1a;在学习前端基础时&#xff0c;必不可少的就是三大件&#xff08;html、css、javascript &#xff09;&#xff0c;而HTML&#xff08;超文本标记语言——HyperText Markup Language&#xff09;是构成 Web 世界的一砖一瓦&#xff0c;它定义了网页内容的含义和…

一点点金融 5

一点点金融 5 怎么判断是短期回撤&#xff0c;还是趋势反转&#xff1f;市场行为和价格波动背后的深层次原因是什么&#xff1f;1. 成交密度与价格区间2. 投资者心理与市场情绪3. 供需动态4. 价格波动的自我实现性挖掘技术策略的原理分析步骤交易策略实施风险管理 技术分析者怎…

深入探索MySQL:成本模型解析与查询性能优化,及未来深度学习与AI模型的应用展望

码到三十五 &#xff1a; 个人主页 在数据库管理系统中&#xff0c;查询优化器是一个至关重要的组件&#xff0c;它负责将用户提交的SQL查询转换为高效的执行计划。在MySQL中&#xff0c;查询优化器使用了一个称为“成本模型”的机制来评估不同执行计划的优劣&#xff0c;并选择…

获取天翼网关TEWA-708E超级管理员密码

Download RouterPassView 参考&#xff1a;破解光猫超级管理员密码&#xff08;网关型号&#xff1a;TEWA-708E&#xff09; - 知乎

华清远见STM32MP157开发板助力嵌入式大赛ST赛道MPU应用方向项目开发

第七届&#xff08;2024&#xff09;全国大学生嵌入式芯片与系统设计竞赛&#xff08;以下简称“大赛”&#xff09;已经拉开帷幕&#xff0c;大赛的报名热潮正席卷而来。嵌入式大赛截止今年已连续举办了七届&#xff0c;为教育部认可的全国普通高校大学生国家级A类赛事&#x…

复杂度的讲解

1.算法效率 如何衡量一个算法的好坏&#xff1f;从两个维度&#xff0c;时间和空间&#xff08;算法运行的快慢&#xff0c;消耗的空间大不大&#xff09;。因为计算机硬件领域的高速发展&#xff0c;如今计算机的存储量已经达到了一个很高的程度&#xff0c;所以现在我们一般…

MyBatis的xml实现方式

1、该项目引入的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…

DotNetBar的SlidePanel和metroTilePanel使用笔记

一、前言 界面组件DotNetBar2中的2个控件属性SlidePanel和metroTitlePanel的使用方法&#xff0c;网上相关资源较少&#xff0c;就一些属性的使用学习记录如下&#xff1a; SlideSideDevComponents.DotNetBar.Controls.eSlideSide.Top/Bottom/Right/Left 及 metroTilePanel和m…

【拓扑空间】示例及详解1

例1 度量空间的任意两球形邻域的交集是若干球形邻域的并集 Proof&#xff1a; 任取空间的两个球形邻域、&#xff0c;令 任取,令 球形领域 例2 规定X的子集族,证明是X上的一个拓扑 Proof&#xff1a; 1. 2., &#xff08;若干个球形邻域的并集都是的元素&#xff0c;元素…

法向量估计

法向量估计 1. 求解点P法向量的原理2. 法向量估计的证明3. 为什么求点P的法向量&#xff0c;需要使用以P为中心的邻域内的点&#xff1f;4. 法向量估计的应用和思考5. 权重法向量估计 1. 求解点P法向量的原理 已知有一组点 P ( p 1 , p 2 , p 3 , . . . , p n ) , p i ∈ R 3…