12种常见的软件架构风格

news2024/11/20 21:18:15

什么是软件架构?

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

为什么需要软件架构?

强大的架构为构建满足用户和利益相关者需求的软件提供了坚实的基础。它确保系统满足其功能和非功能需求,如性能、安全性和可靠性。通过良好设计的架构,开发人员可以构建易于修改和扩展的软件,从而更容易适应不断变化的业务需求。

软件架构对于管理复杂性也至关重要。随着软件系统变得越来越复杂,了解不同组件之间如何交互变得具有挑战性。良好设计的架构提供了对系统的高级视图,使得更容易理解其结构和操作。这反过来帮助开发人员识别潜在问题,并就如何修改系统做出明智决策。

如何文档化架构?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、基于流

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

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

基于流的架构的好处

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

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

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

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

小结

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

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

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

相关文章

车载电子电器架构 —— 软件下载

车载电子电器架构 —— 软件下载 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无…

【Qt】:常用控件(三:按钮类)

常用控件(三) 一.Push Button二.Radio Buttion三.Check Box 一.Push Button 使⽤ QPushButton 表⽰⼀个按钮.这也是当前我们最熟悉的⼀个控件了.QPushButton继承⾃QAbstractButton .这个类是⼀个抽象类.是其他按钮的⽗类. QAbstractButton 中,和 QPushBu…

基于java+SpringBoot+Vue的网上订餐系统设计与实现

基于javaSpringBootVue的网上订餐系统设计与实现 开发语言: Java 数据库: MySQL技术: Spring Boot JSP工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 菜品浏览与选择:用户可以浏览不同的菜品分类,并选择心仪的菜品。 订单创建与管理&…

做抖店的新手朋友!别再盲目跟风个人店了!开通完根本做不起来!

哈喽~我是电商月月 想做抖音小店的朋友们一定要分清个人店和个体店的区别 个人店铺的限制真的太多了!真的不好做! 一.首先我们要知道两种的区别 个人店不需要营业执照,身份证就能开启 个体店则需要办理营业执照【营业执照的办…

设计模式——建造者模式03

工厂模式注重直接生产一个对象,而建造者模式 注重一个复杂对象是如何组成的(过程),在生产每个组件时,满足单一原则,实现了业务拆分。 设计模式,一定要敲代码理解 组件抽象 public interface …

算法设计与分析实验报告c++实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)

一、实验目的 1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握; 2.提高学生利用课堂所学知识解决实际问题的能力; 3.提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、 编…

JDI LCD 驱动时序介绍

1. 引言 绝大多数 STM32 MCU 都可应用于图形界面,而且很多系列还内置图形硬件 LTDC,支持驱动 RGB 接口的 LCD。但是存在少数类型的 LCD,如 JDI 屏,除了 STM32L4P5 支持外,其它 MCU 只能根据屏的接口时序要求&#xff…

DNS和HTTP

DNS应用层协议 域名解析系统 使用IP地址,来描述设备在网络上的位置 IP地址并不适合来进行传播网站,就采用了域名的方式来解决网站传播的问题。如www.baidu.com这样类似的就很容易让人记住。其域名就直接代表了这个网站。而且有一套自动的系统会将域名解…

LeetCode 2192.有向无环图中一个节点的所有祖先:拓扑排序

【LetMeFly】2192.有向无环图中一个节点的所有祖先:拓扑排序 力扣题目链接:https://leetcode.cn/problems/all-ancestors-of-a-node-in-a-directed-acyclic-graph/ 给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编…

AFCI 应用笔记二之数据采集

1. 简介 基于监督学习的神经网络算法需要大量数据作为输入,模型完全由数据驱动,其数据质量是算法有效的必要条件,所以如何高效的采集到数据,以及正确的标注或分析是极其重要的,如果第一步有问题,后续的所有…

如何删除 iPhone 上的 iCloud 激活锁

Apple 在 iPhone 上通过不同的安全屏障来保护您的数据。 iCloud 激活锁可阻止外部人员访问您的手机。您可以通过打开“查找我的 iPhone”功能来激活此锁。 使用安全协议似乎是无害的,直到你到达门的另一边。如果您购买了带有激活锁的二手 iPhone 或忘记了 iCloud 凭…

eBay买家号注册下单容易死号?是什么原因导致?

随着电子商务的迅猛发展,跨境电商平台eBay日益成为众多消费者和商家的首选。然而,自去年下半年以来,eBay推出的新规则给买家号的注册带来了前所未有的挑战。许多新用户反映,在注册eBay买家号后,往往遭遇刚注册就被冻结…

哈希表2s总结

3.哈希表 哈希表非常常用,字典一般会用来保存处理过后的输入输出信息,集合也可以用来去重,这部分是重点,但是还是那句话,这种题目是不会或者说很少考原题的,主要还是学习知识,所以题目看一下答…

JS详解-手写Promise!!!

前言: 针对js的深入理解,作者学习并撰写以下文章,由于理解认知有限难免存在偏差,请大家指正!所有定义来自mdn。 Promise介绍: 对象表示异步操作最终的完成(或失败)以及其结果值. 描…

基于SpringBoot+Vue光影视频平台(源码+部署说明+演示视频+源码介绍)

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

ChernoCPP 2

视频链接&#xff1a;【62】【Cherno C】【中字】C的线程_哔哩哔哩_bilibili 参考文章&#xff1a;TheChernoCppTutorial_the cherno-CSDN博客 Cherno的C教学视频笔记&#xff08;已完结&#xff09; - 知乎 (zhihu.com) C 的线程 #include<iostream> #include<th…

SV学习笔记(六)

覆盖率类型 写在前面 覆盖率是 衡量设计验证完备性 的一个通用词。随着测试逐步覆盖各种合理的场景&#xff0c;仿真过程会慢慢勾画出你的设计情况。覆盖率工具会 在仿真过程中收集信息 &#xff0c;然后进行后续处理并且得到覆盖率报告。通过这个报告找出覆盖之外的盲区&…

设计模式——原型模式05

原型模式核心复制&#xff0c;每次new出来的对象完全不一样&#xff0c;实现对象之间的隔离。 学习前最好先掌握jAVA值传递和深浅拷贝 设计模式&#xff0c;一定要敲代码理解 浅拷贝 克隆出对象&#xff0c;其中两者的引用类型属性是同一个对象。 对象信息 /*** author ggb…

C++:逻辑运算符-非与或(19)

!非!a如果a为假&#xff0c;那么当前他就是真&#xff0c;如果a是真&#xff0c;那么他直接就是假&&与a&&ba与b都为真&#xff0c;那么就是真&#xff0c;如果两个里面有一个为假那么就是假||或a||ba或b有一个为真&#xff0c;那么就是真 非&#xff08;!&…

怎样把学浪购买的课程下载下来

如何把学浪已购买的课程下载下来?这里就教大家一个方法,利用一个工具轻轻松松把视频下载下来 这个工具我打包成压缩包了,有需要的自己取一下 链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提取码&#xff1a;kqvj --来自百度网盘超级会员V1…