软件架构 架构应用模板 架构模式比较

2025-05-28

软件架构

建筑应用模板

架构模式比较

替代文本

简介
在本文中,我将尝试解释什么是架构和清洁架构,以及架构在项目中的作用。

Web架构应用示例
替代文本

让我们考虑一个具有一个架构级别(单层)的服务示例

在具有一个架构级别的应用程序中,用户界面、业务逻辑(即应用程序的后端部分)和数据库位于同一服务器上

替代文本

具有一个架构级别的应用程序示例包括 MS Office、GIMP

使用单层架构的好处

  1. 由于组件位于同一服务器上,因此组件交互的延迟很小或没有延迟
  2. 虽然这很大程度上取决于机器的性能和软件硬件要求,但衡量单层应用程序的实际性能
  3. 此外,用户数据保留在其设备上,无需通过网络传输。这确保了最高级别的数据安全。客户端数据不会被拦截,因为数据交换将在同一服务器内进行。

这种架构的缺点

  1. 代码或功能交付到生产服务器后无法更改。例如,在 90 年代,如果游戏发行时出现错误代码,工作室就无能为力。
  2. 点对点应用程序中的代码也容易被返工和逆转。业务安全性极低,因为在逆向工程的情况下,攻击者或竞争对手可以访问您的代码库,这可能导致财务损失。例如,您的应用程序与财务相关,攻击者泄露了您系统的部分代码,现在可以绕过您的某些检查,从而利用您的应用程序进行欺诈。

双层架构

替代文本

两层应用程序包含一个客户端和一个服务器。客户端将在同一台计算机上包含用户界面和业务逻辑。服务器是部署在另一台计算机上的后端应用程序。

有时您需要使用两层架构,例如待办事项列表应用程序。

三层架构

三层架构非常流行,并且经常使用。大多数简单的网站,例如博客、新闻网站,都使用这种架构。

替代文本

让我们考虑一个简单的博客的例子 - 客户端界面将使用 HTML、JavaScript、CSS 编写,后端应用程序将在服务器上启动,例如 Apache,后端部分将使用 PostgreSQL 数据库作为存储

N层架构

此术语用于描述使用三个以上组件的架构。这些组件的示例

  • 缓存 - 这项技术的一个例子是 JCache、Caffeine。这项技术用于以下用途:1. 减少应用程序的响应时间,而无需向数据库请求任何数据;2. 还可以节省一些来自第三方系统的响应,因为这些响应可能需要很长时间。
  • 消息代理 - 例如 Apache Kafka 和 RabbitMQ。此工具对于保存任何消息至关重要,消息可能意味着对第三方系统的某种请求,例如,在 Kafka 中,您可以存储需要发送给税务系统或财务数据运营商的消息。
  • 负载均衡器 - 例如 Nginx、Ribbon 和 Eureka。此工具用于分配应用程序的负载。想象一下以下情况:你有一个分布式应用程序,这意味着有多个实例或节点,为了优化最终用户的速度,所有请求都会经过均衡器,均衡器会选择负载较小的实例/节点。
  • 搜索服务——在海量数据中搜索信息
  • 负责处理数据数组的组件
  • 使用异构技术的组件,通常称为 Web 服务

所有现代社交应用程序(例如 Instagram、Facebook 和 Uber、Airbnb 等可扩展服务,以及像 Pokemon Go 这样的拥有大量玩家的游戏)都使用 N 层架构

清洁架构

应用程序的核心不是数据库。架构也不是一个或多个可用的框架。应用程序的核心是应用程序的用例。应用程序的核心是业务赖以盈利的功能,也就是说,你的应用程序能为业务带来什么问题/价值——这就是应用程序的核心。

清晰架构是一套实践、技术和设计模式,可帮助您创建可扩展且可靠的应用程序。旨在避免可能出现的以下问题:

  • 决策制定得非常快——当应用程序在生产服务器上时,仓促的决策可能会导致问题
  • 难以做出改变
  • 固守于某个框架——某一天,某个组织/个人可能会发现自己无力支撑这个框架。因此,你不应该被这个框架牢牢束缚。
  • 只关注技术方面——重要的是要明白,在开发时,你不仅应该关注技术方面,还应该关注新功能的开发将带来的商业价值
  • 在项目中找到合适的位置很困难
  • 业务逻辑分散在代码中——如果某些需求发生变化,程序员必须找到代码中的所有位置,并在每个位置更改功能。如果业务逻辑被隔离在一个地方,那么程序员只需在一个地方更改代码即可。
  • 缺乏测试
  • 不频繁更新 清洁架构在使用时还提供以下好处
  • 有效的测试策略
  • 使用框架的代码是独立的
  • 数据库独立性
  • 所有业务逻辑都包含在应用程序用例中
  • 很难做错
  • 应用程序随时准备输出到生产环境

替代文本
替代文本

让我们更详细地分析一下这些数据:

该应用程序的核心是:

  • 表示领域或主题领域的实体。支付网关应用的主题领域 - 互联网金融
  • 此级别的代码适用于整个对象(例如,检查主机名的格式)
  • Java 普通对象:无需框架或注释

核:

  • 代表您的应用程序的业务操作 - 这是您的应用程序可以做的事情。
  • 纯业务逻辑,Java 代码不使用任何框架,但使用 Apache Commons 等实用库
  • 定义应用逻辑所需的数据接口。一个或多个数据提供者实现了该接口,但在使用时,无法得知数据来自何处。
  • 在此级别,将抛出业务异常 - 与应用程序域直接相关的异常

数据提供者(dataproviders):

  • 从多个信息源(数据库、网络设备、文件系统等)接收和存储数据

应用程序入口点:

  • 该应用层描述了与应用程序交互的方式,通常包括交付机制(例如,REST API,计划任务,GUI,其他系统)
  • 启动用例并将结果转换为与交付机制匹配的格式

配置

  • 将所有组件连接在一起
  • 依赖注入在这里被隔离
  • 包含“肮脏的细节” - 例如主类、Web 服务器配置、数据库配置等。

替代文本
替代文本

建筑应用模板

架构模式是针对给定上下文中的应用程序架构问题而产生的问题的重复性和通用的解决方案。

让我们来看看 10 种流行的架构模式

  • 多级
  • 客户端 - 服务器
  • 领导 - 奴隶
  • 渠道和过滤器
  • 中介者模板
  • 点对点模板
  • 事件总线
  • 模型 - 视图 - 控制器
  • 木板
  • 解释器

多级

它用于构建可分解​​为特定抽象级别的特定子任务组的程序。每一层都为上一层提供服务。

常见的信息系统通常有4层:

  • 表示层(也称为用户界面层)
  • 应用层(又称服务层)
  • 业务逻辑层(也称为领域层)
  • 数据访问层(又称数据存储层)

用法

  • 常见的桌面应用程序。

  • Web 应用程序电子商务。

客户端 - 服务器

此模板由两部分组成:服务器和多个客户端。服务器组件为客户端组件提供服务。客户端向服务器请求服务,服务器反过来将这些服务提供给客户端。此外,服务器还会持续“监听”客户端的请求。

用法

在线应用程序(电子邮件、文档共享、银行业务)。

主从

该模式同样涉及两个参与者——主节点和从节点。领导者将任务分配给相同的追随者,并根据其“下属”收到的结果计算最终结果。

用法

  • 在数据库复制中,主数据库被视为权威来源,下属数据库与其同步。

  • 计算机中连接到总线的外围设备(主设备和从设备)。

通道和过滤器

此模式适用于生成和处理数据流的系统。每个处理步骤都发生在过滤器组件内部。待处理的数据通过通道传输。这些通道可用于缓冲或同步数据。

用法

· 编译器。顺序过滤器执行词法分析、语法分析、语义分析和代码生成。

· 生物信息学中的工作流程。

中介者模板

这种模式适用于构建具有互不相连组件的分布式系统。这些组件可以通过远程服务调用相互通信。中介组件负责协调组件之间的交互。

服务器通过中介(代理)托管其功能(服务和特性)。客户端向代理请求服务。然后,代理将客户端重定向到其注册表中的相应服务。

用法

· 按类型划分的消息代理有Apache ActiveMQApache KafkaRabbitMQJBoss Messaging

点对点模板

此模板中包含一些独立的组件,即所谓的对等体。对等体可以充当客户端,向其他对等体(peer)请求服务,也可以充当服务器,向其他对等体提供服务。对等体可以同时充当客户端或服务器,也可以同时充当两者,并且可以随时间动态地更改其角色。

用法

· 文件共享网络(GnutellaG2

· 多媒体协议(P2PTVPDTP

· 专有多媒体应用程序(如Spotify)。

事件总线

此模板主要与事件交互,包含 4 个主要组件:事件源、事件监听器、通道和事件总线。事件源将消息发送到事件总线上的特定通道。监听器订阅特定通道。监听器会收到其订阅的通道上发布的消息的通知。

用法

Android 开发

通知服务

模型 - 视图 - 控制器

此模式也称为 MVC 模式。它将交互式应用程序分为 3 个部分:

  1. 模型——包含关键数据和功能;

  2. 视图 - 向用户显示信息(可以指定多个视图);

  3. 控制器——负责处理来自用户的数据。

这样做是为了区分信息的内部呈现方式和用户呈现及接收信息的方式。这种设计隔离了组件,并允许高效的代码重用。

用法

· 用主要编程语言编写的 WWW 应用程序的架构。

· Web 框架(例如DjangoRails

木板

此模式适用于没有明确确定性解决方案的问题。Board 模板包含 3 个主要组件:

· 棋盘是一个结构化的全局内存,包含来自可能解决方案空间的对象;

· 知识来源——具有自己呈现方式的专门模块;

· 控制组件——选择、配置和执行模块。

所有组件都可以访问该面板。组件可以生成新的数据对象并添加到面板中。组件会在面板上查找特定类型的数据。搜索的一种方法是将模式与现有的知识源进行匹配。

用法

· 语音识别;

· 车辆识别和跟踪;

· 测定蛋白质结构;

· 声纳信号解释。

解释器

它适用于开发必须解释特定编程语言程序的组件。它主要描述如何对特定编程语言编写的字符串(换句话说:“句子”或“表达式”)进行求值。其核心是为该语言中的每个字符分配一个类。

用法

· 数据库查询语言(SQL);

· 用于描述数据传输协议的语言。

架构模式比较

以下是每种架构模式的优缺点。

分层模板

优点:

  • 一个较低层可被较高级别的不同层使用。
  • 层次使标准化变得更容易,因为我们明确地定义了级别。
  • 在一个层内进行更改,而其他层保持不变。

缺点:

  • 不具有普遍性。
  • 在某些情况下,可以跳过一些层。

客户端/服务器模板

优点:

  • 客户可以请求的一组服务适合建模。

缺点:

  • 请求通常在服务器上的单独线程中执行。
  • 进程之间的交互会增加资源消耗,因为不同的客户端有不同的视图。

主从模板

优点:

  • 准确性,因为服务执行被委托给具有不同实现的不同从属设备。

缺点:

  • 所有的奴隶都是孤立的,他们没有普遍的条件。
  • 主从通信中的等待时间是一个明显的缺点。例如,在实时系统中。
  • 仅适用于那些解决方案可以分解成几个部分的问题。

模板“渠道和过滤器”

优点:

  • 它们可以实现并行处理,当输入和输出由流组成时,过滤器在接收数据后开始计算。
  • 只需简单添加过滤器,系统即可轻松扩展。
  • 过滤器适合重复使用。它们可以构建不同的管道,从而创建现有过滤器集的各种组合。

缺点:

  • 最慢的过滤过程会降低效率。当从一个过滤器移动到另一个过滤器时,需要进行数据转换,这会导致资源消耗增加。

中介模板

优点:

  • 可以动态地更改、添加、删除和移动对象。此模式使分发过程对开发人员透明。

缺点:

  • 需要标准化服务描述。

点对点模板

优点:

  • 支持去中心化计算。对任何节点的故障都具有极强的恢复能力。
  • 资源和计算能力方面的高可扩展性。

缺点:

  • 服务质量没有保证;节点自发合作。
  • 安全很难得到保证。
  • 性能取决于节点的数量。

事件总线模板

优点:

  • 轻松添加新的订阅者、发布者和连接。适用于高度分布式的应用程序。

缺点:

  • 可扩展性问题,因为所有消息都经过一个事件总线。

模型-视图-控制器模板

优点:

  • 有助于创建同一模型的不同表示;它们可以在运行时启用或禁用。

缺点:

  • 算法的复杂性增加。可能导致用户操作进行许多不必要的调整。

董事会模板

优点:

  • 轻松添加新应用程序。
  • 您可以轻松扩展数据空间结构。

缺点:

  • 编辑数据结构确实很困难,因为这样的改变会影响所有应用程序。
  • 可能需要同步和访问控制。

模板“解释器”

优点:

  • 可能实现高度动态的行为。
  • 从编程便利性方面来说,这对最终用户来说是一个极好的解决方案。

缺点:

  • 性能问题,因为解释型语言比编译型语言慢。
文章来源:https://dev.to/vrnsky/software-architecture-1k7e
PREV
3 个很酷的 CSS 技巧让你在聚会上给朋友留下深刻印象 伪元素覆盖 响应式宽高比 快速,无 JS,点击即可显示 最后的话 谢谢
NEXT
🪟 受 Windows 11 启发的作品集 🪟