📜  如何设计Web应用程序–软件体系结构指南

📅  最后修改于: 2021-08-27 18:14:58             🧑  作者: Mango

您是否尝试过在家准备披萨? (是的!我们正在谈论您最喜欢的食物…)

如果您没有为比萨饼制作好面团怎么办?当然,整个比萨饼基地都会变质,您无法继续准备自己喜欢的菜。

如何设计Web应用程序软件体系结构指南

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

软件体系结构和软件设计之间的区别

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

软件构架

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

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

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

软件设计

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

软件架构模式

1.客户服务器

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

客户端-服务器架构

这种体系结构是一个计算机网络,其中每台计算机都充当一个节点,并且这些节点可以彼此通信,而无需使用中央服务器。网络中的每台计算机将具有相同的功能/职责。这种体系结构的好处在于,无需担心出现单点故障。如果一个节点发生故障,则另一个节点将可用于处理请求。 P2P是区块链技术的基础。

点对点

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

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

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

4.微服务

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

微服务架构

4.事件驱动

现代Web应用程序因使用此体系结构而很流行。它也被称为非阻塞架构。它允许应用程序以最少的资源消耗处理大量并发请求。它最适合需要完全异步模型进行扩展的应用程序。

事件驱动架构

5主从架构

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

主从架构

6.分层

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

  • 表示层
  • 应用层
  • 业务逻辑层
  • 资料存取层

您的应用应具有多少层?

1.单层应用

好处:

  • 没有网络延迟
  • 数据易于访问,没有任何延迟。
  • 确保数据安全。

缺点:

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

2.两层申请

好处:

  • 由于代码和UI位于同一台计算机中,因此网络调用次数减少。
  • 数据库服务器和业务逻辑在物理上都很接近,因此可以提供快速的性能。

缺点:

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

3.三层申请

好处:

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

缺点:

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

4. N层应用

好处:

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

缺点:

  • 层级分为多个组成部分,这就是为什么难以实现和维护复杂结构的原因。

结论

  • 如果您不希望任何网络延迟,则可以使用单层体系结构。
  • 如果您的首要任务是最大程度地减少网络延迟,并且您希望在应用程序中对数据进行更多控制,那么请选择两层应用程序。
  • 如果要控制数据,请控制应用程序中的代码/业务逻辑,并且您的首选是安全性,然后选择一个三层应用程序。
  • 如果您主要关注可伸缩性,则选择N层体系结构。

水平或垂直缩放-哪种适合应用程序?

  • 如果您的应用收到的流量很少,并且您知道流量负载不会显着增加,那么最好选择垂直缩放。您可以升级服务器,也可以更换更大容量的服务器。无需使用分布式网络。
  • 如果您的应用程序类似于任何社交媒体应用程序,并且每天的访问量增加的频率越来越高,那么机会很快就会成倍增加。在这种情况下,可用性 成为任何应用程序的主要关注点。因此,最好选择水平缩放

整体还是微服务?

什么时候使用整体架构?

  • 需求相当简单且应用程序的流量受到限制时,请使用Monolithic体系结构(例如:Tax计算应用程序)。如果您看不到未来的流量呈指数级增长,那么最好选择这种体系结构。

何时使用微服务架构?

  • 最好用于复杂的用例。如果您的应用收到大量流量,并且预计流量将来会成倍增加,那么微服务架构是不错的选择。
  • 如果要构建社交媒体网络应用程序,则针对消息传递,实时聊天,实时视频流,图像上载,喜欢和共享等不同功能,将分别实现这些组件。牢记单一责任关注点分离原则。

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

NoSQL或SQL?

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

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

MySQL,Microsoft SQL Server,PostgreSQL,MariaDB都是流行的关系数据库的示例。

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

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

MongoDB的,Redis的,卡珊德拉,HBase这些都是流行的非关系型数据库的例子。

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

1.实时数据交互

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

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

2.点对点Web应用程序

  • 对于点对点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是一种动态编程语言,具有高性能。它适用于运行计算和数值分析的应用。

结论

无论我们在本文中讨论的任何观点,在您开始使用软件体系结构时都必须记住。在弄糟代码之前,请确保选择了正确的软件体系结构,正确的数据库,正确的技术和正确的可伸缩性选项。请牢记以上所有要点,从长远来看将对您有帮助。