📜  如何设计 Web 应用程序——软件架构指南

📅  最后修改于: 2021-10-20 10:32:09             🧑  作者: Mango

你有没有试过在家里准备比萨? (是的!!!我们在谈论你最喜欢的食物……)

如果你没有为你的比萨饼底制作好的面团会发生什么?当然,整个比萨饼底都会变质,你不能继续准备你最喜欢的菜了。

如何设计 Web 应用程序软件架构指南

无论您是制作比萨饼还是构建一些软件,如果您没有获得正确的基础,您都必须从头开始一切。在 Web 应用程序中,应用程序的架构是基础,应谨慎选择以成功构建应用程序。优秀的开发人员为应用程序选择了正确的架构,以避免在软件设计中或以后的应用程序代码中发生任何类型的重大变化。当开发人员在初始设计阶段选择正确的架构时,开发过程会变得更加容易,并且还可以节省大量的工程和财务资源。在本文中,让我们详细讨论这个主题,并重点讨论为 Web 应用程序选择正确架构的一些关键方面。

软件架构和软件设计的区别

两者都不一样……是的!!!你没听错(不要混淆,让我们了解两者的不同之处。)

软件架构

系统的高级组件、这些组件之间的关系以及它们如何协同工作是软件架构的一部分。它是任何应用程序的骨架。例如:

  • 选择将应用程序拆分为两个组件的无服务器架构:BaaS(后端即服务)和 FaaS(功能即服务)
  • 选择一种微服务架构,其中不同的功能/任务被拆分为单独的模块/代码库。

当您选择架构时,您需要考虑一些指标,例如处理性能、容错、可扩展性和可靠性

软件设计

您在应用程序中为不同的模块、类、函数和其他功能编写的代码被视为软件设计。代码级设计定义了哪个模块在做什么、类的范围、功能及其目的等。为了在更大的团队中实现和管理这些代码,使用通用语言/模式(软件设计模式)来概念化重复问题。和解决方案。如果开发人员使用其他人已经定义的方法或模式,他/她可以更有效地实现代码。阅读文章设计模式:了解真实案例的重要性,以清楚地了解软件设计模式。

软件架构模式

1. 客户端-服务器

客户端-服务器架构是一种网络架构,它遵循请求-响应模型。这里的客户端可以是任何设备,例如用户运行应用程序的 PC 或工作站。这些客户端向服务器发送请求以获取某些信息。服务器是专用于管理磁盘驱动器(文件服务器)、打印机(打印服务器)或网络流量(网络服务器)的强大计算机。当服务器收到请求时,它会处理该请求并将响应发送回客户端。 Facebook、Twitter、Skype、银行应用程序和几乎所有社交媒体公司都遵循这种架构。

客户端-服务器-架构

这种架构是一个计算机网络,其中每台计算机都作为一个节点工作,这些节点可以在不使用任何中央服务器的情况下相互通信。网络中的每台计算机都具有相同的能力/责任。这种架构的好处是不用担心单点故障。如果一个节点出现故障,另一个节点将可用于处理请求。 P2P是区块链技术的基础。

点对点

3.模型-视图-控制器(MVC)

在软件工程中,这种模式非常流行,并且已经存在了很长时间。此架构可用于桌面、Web 或移动应用程序。在 MVC 中,我们将整个应用程序逻辑分成三个组件。

  • 模型(数据和逻辑):它代表和维护数据库中应用程序的数据。信息的存储方式和检索方式。
  • 视图(用户界面):它使用模型向用户显示数据,例如输出或 GUI。
  • 控制器(Request Handler):它处理用户请求并充当 模型和视图之间的接口。

4. 微服务

该架构将任务/功能划分为单独的相应模块/代码库。这些模块相互协调,形成一个整体的大服务。这种架构为开发人员提供了更大的灵活性,因为它允许他们为不同的模块选择他们的编程语言。与单体架构相比,基于微服务的架构应用程序更易于维护、测试和部署。

微服务架构

4. 事件驱动

现代 Web 应用程序因使用这种架构而广受欢迎。它也被称为非阻塞架构。它允许应用程序以最少的资源消耗处理大量并发请求。它最适合需要完全异步模型来扩展的应用程序。

事件驱动架构

5 .主从架构

在计算机科学的早期,这种架构是在数据库复制的上下文中定义的。例如,在数据库中,我们跨三台服务器复制数据/信息。存在不一致的可能性,因为其中一个可能与其他不同步。主从架构解决了这个问题,我们将一个副本视为主,其余被识别为从。在垂直扩展中,我们通常使用复制方法,其中一个存储主代码,另一个存储主代码的副本。

主从架构

6. 分层

程序的整个结构分为子任务或层的组,每个子任务或层都处于特定的抽象级别。每一层都负责向下一个更高层提供服务。这些层是……

  • 表现层
  • 应用层
  • 业务逻辑层
  • 数据访问层

你的应用程序应该有多少层?

1. 单层应用

优点:

  • 无网络延迟
  • 无需任何延迟即可轻松访问数据。
  • 确保数据安全。

缺点:

  • 对应用程序的控制较少。实现新功能或修改代码很困难。
  • 需要深入 以最小的错误进行测试。

2.两层应用

优点:

  • 更少的网络调用,因为代码和 UI 存在于同一台机器上。
  • 数据库服务器和业务逻辑都在物理上接近,所以它提供了快速的性能。

缺点:

  • 大多数应用程序逻辑由客户端处理,因此很难重用逻辑和控制软件版本,也很难重新分发新版本。
  • 可扩展性问题。当请求数量增加时,应用程序性能下降。

3.三层应用

优点:

  • 对于数据库更新,在中间层传递的数据确保其有效性,并通过客户端应用程序消除数据损坏。
  • 业务逻辑置于中央服务器上,确保数据安全。
  • 由于应用服务器的分布式特性,可以扩展应用程序的可伸缩性。不需要与每个客户端都有单独的连接,很少有应用程序服务器连接就足够了。

缺点:

  • 由于通讯点的增加 (客户端到中间层到服务器,而不是直接从客户端到服务器),创建三层应用程序需要更多的努力。此外,由 Visual Basic、PowerBuilder、Delphi 等工具扩展的性能也会下降。

4. N层应用

优点:

  • 三层架构的所有优点。
  • 从数据库层和客户端层卸载可提高性能。

缺点:

  • 层被分成组件,这就是实现和维护复杂结构变得困难的原因。

结论

  • 如果您不想要任何网络延迟,请使用单层架构。
  • 如果您的首要任务是最大限度地减少网络延迟,并且希望对应用程序内的数据进行更多控制,那么请选择两层应用程序。
  • 如果您想控制数据,控制应用程序中的代码/业务逻辑,并且您的偏好是安全性,那么选择三层应用程序。
  • 如果您主要关注可扩展性,则选择 N 层架构。

水平或垂直扩展——哪个适合应用程序?

  • 如果您的应用接收到最少的一致流量并且您知道流量负载不会显着增加,那么最好选择垂直缩放。您可以升级服务器,也可以更换容量更大的服务器。无需使用分布式网络。
  • 如果您的应用程序类似于任何社交媒体应用程序,并且每天的流量增长得更加频繁,那么很有可能它很快就会呈指数级飙升。在这种情况下,可用性 成为任何应用程序的首要关注点。所以最好选择水平缩放

单体还是微服务?

何时使用单体架构?

  • 要求相当简单并且应用程序上的流量有限时,请选择单体架构(例如:税收计算应用程序)。如果您没有看到未来流量呈指数级增长,那么选择这种架构是很好的。

何时使用微服务架构?

  • 它最适合复杂的用例。如果您的应用程序收到大量流量,并且预计未来流量将呈指数级增长,那么微服务架构是不错的选择。
  • 如果您正在构建社交媒体网络应用程序,那么对于不同的功能,例如消息传递、实时聊天、实时视频流、图像上传、喜欢和共享,请分别实现这些组件。牢记单一职责关注点分离原则。

注意:当您开始使用单个代码库构建应用程序时,大多数情况下它会变成一个巨大的应用程序。这就是为什么许多开发人员从单体架构开始,但后来他们将应用程序扩展为微服务架构的原因。因此,选择架构取决于您的用例和要求。

NoSQL 还是 SQL?

何时选择 SQL/关系数据库?

  • 如果您正在构建基于股票交易、银行或金融的应用程序,则选择关系数据库。
  • 关系数据库最适合您的应用程序处理事务或符合ACID属性的应用程序。对于这些应用程序,数据一致性极其重要。
  • 例如,Facebook 类型的社交网络应用程序存储具有大量关系的数据。如果应用程序中的数据有很多关系,那么在这种情况下最好选择关系数据库。您可以举一个住在特定城市的人或去特定酒店度假的人的例子。如果您正在构建 Facebook 类型的社交网络应用程序并且您需要存储大量关系,那么请使用 SQL/关系数据库。

MySQL、Microsoft SQL Server、PostgreSQL、MariaDB所有这些都是流行的关系数据库的例子。

何时选择 NoSQL/非关系型数据库?

  • 如果您主要关心的是非关系型数据库 是应用程序的扩展。当您的网站上发生大量读/写操作并且您需要处理大量用户请求时,NoSQL 数据库最适合。使用 NoSQL,可以轻松处理并发流量和大量请求,将延迟降至最低。
  • NoSQL 数据库也是数据分析用例的最佳选择。

MongoDB、Redis、Cassandra、 HBase 这些都是流行的非关系型数据库的例子。

哪种技术适合该应用程序?

1. 实时数据交互

如果您正在构建需要的应用程序,请选择NodeJS、Tornado(Python 框架)、Spring Reactor、Play 和 Akka.io (用于Java生态系统)……

  • 与后端服务器实时通信。例如,像 Spotify、Netflix 这样的音频视频流应用程序或任何类型的消息传递应用程序。
  • 客户端和服务器之间的持久连接,以及后端的非阻塞技术。

2. 点对点网络应用

  • 对于点对点 Web 应用程序例如 P2P 分布式搜索引擎或 P2P 直播电视广播服务(例如 Microsoft LiveStation),您可以选择DAT 和 IPFS 等 JavaScript 协议
  • 一个 JavaScript 框架 Freedom.js适用于构建可在现代 Web 浏览器中运行的 P2P Web 应用程序。

3.基于CRUD的常规应用

  • 对于简单的基于 CRUD 的应用程序,请使用PHP Laravel、 Python Django Spring MVC、Ruby on Rails 和 ASP .NET MVC。

4. 小规模应用

  • 如果您正在构建一个简单的应用程序,例如一个博客、一个在线表单、一个与社交媒体集成的简单应用程序,那么请使用PHP 。还有一些其他选项,例如Spring boot 或 Ruby on Rails 。这些技术需要更少的开发或配置时间,但与其他技术相比, PHP的托管更实惠,而且最适合简单的用例。

5. CPU 和内存密集型应用程序

  • 常规的 Web 框架或脚本语言适合构建 Web 应用程序,但这些语言不适合运行 CPU 密集型、内存密集型或在后端执行繁重的计算任务。对于上述所有任务和大数据处理、并行处理或对大量数据运行监控和分析,C++ 是技术社区中最常用的语言。它促进了低级内存操作,开发人员可以编写对内存有更多控制的分布式系统。大多数加密货币都写在 C++
  • Rust类似于 C++,提供高性能和安全的并发性。工业界也在使用Java、Scala 和 Erlang。 Java适用于大型企业系统。
  • Go编程语言适用于多核机器和处理大量数据。
  • Julia是一种动态编程语言,具有高性能特性。它适用于运行计算和数值分析的应用。

结论

无论我们在整篇文章中讨论了什么要点,当您开始使用软件架构时,记住所有这些都很重要。在开始编写代码之前,请确保选择了正确的软件架构、正确的数据库、正确的技术和正确的可扩展性选项。请记住以上所有要点,从长远来看它会对您有所帮助。