Web 应用程序架构概述
Web 应用程序架构展示了包含所有软件组件(例如数据库、应用程序和中间件)以及它们如何相互交互的布局。它定义了数据如何通过 HTTP 传递,并确保客户端服务器和后端服务器能够理解。此外,它还确保所有用户请求中都存在有效数据。它创建和管理记录,同时提供基于权限的访问和身份验证。选择正确的设计决定了您公司的发展、可靠性和互操作性以及未来的 IT 需求。因此,了解构成 Web 应用程序架构的组件非常重要。
Web 应用程序架构组件
通常,基于 Web 的应用程序架构包括三个核心组件:
1) Web 浏览器:浏览器或客户端组件或前端组件是与用户交互、接收输入并管理表示逻辑同时控制用户与应用程序交互的关键组件。如果需要,也会验证用户输入。
2) Web 服务器: Web 服务器也称为后端组件或服务器端组件,通过将请求路由到正确的组件并管理整个应用程序操作来处理业务逻辑和处理用户请求。它可以运行和监督来自各种客户端的请求。
3)数据库服务器:数据库服务器为应用程序提供所需的数据。它处理与数据相关的任务。在多层架构中,数据库服务器可以在存储过程的帮助下管理业务逻辑。
什么是三层架构?
在传统的 2 层架构中,有两个组件,即客户端系统或用户界面和通常是数据库服务器的后端系统。这里的业务逻辑被合并到用户界面或数据库服务器中。2 层架构的缺点是随着用户数量的增加,性能会下降。此外,数据库与用户设备的直接交互也引发了一些安全问题。铁路预订系统和内容管理系统是通常使用此架构构建的几个应用程序。
当谈到 3 层架构时,有三层:
- 表现层/客户层
- 应用层/业务层
- 数据层
在此模型中,中间服务器接收客户端请求并通过与应用业务逻辑的从属服务器协调来处理它们。客户端和数据库之间的通信由中间应用层管理,从而使客户端能够访问来自不同 DBMS 解决方案的数据。
3 层架构更安全,因为客户端不直接访问数据。在多台机器上部署应用程序服务器的能力提供了更高的可伸缩性、更好的性能和更好的重用性。您可以通过独立缩放每个项目来水平缩放它。您可以将核心业务从数据库服务器中抽象出来,高效地进行负载均衡。当所有数据都通过应用程序服务器时,数据完整性得到改善,应用程序服务器决定数据应该如何访问以及由谁访问。因此,管理层的变更既简单又具有成本效益。客户端层可以是瘦客户端,这意味着硬件成本会降低。这种模块化模型允许您修改单个层而不影响其余组件。
现代 Web 应用程序架构的层次
构建分层的现代 Web 应用程序架构可帮助您识别应用程序每个组件的角色,并轻松地对相应层进行更改,而不会影响整个应用程序。它使您能够轻松地编写、调试、管理和重用代码。
Web 应用架构的三层:
- 表现层/客户层
- 应用层/业务逻辑层
- 数据层
这是一个额外的网络应用程序层次结构图,供您参考:
应用层:Web 服务器
什么是网络服务器?简而言之,网络服务器运行一个或多个网站或网络应用程序。Web 服务器使用超文本传输协议 (HTTP) 以及其他协议来通过浏览器侦听用户请求。它通过应用业务逻辑并将请求的内容交付给最终用户来处理它们。
Web 服务器可以是硬件设备或软件程序。
- 硬件 Web 服务器:连接到 Internet 的计算机设备,包含 Web 服务器软件和 Web 应用程序组件,例如图像、HTML 文档、JS 文件和 CSS 样式表。
- 软件 Web 服务器:这是理解 URL 和 HTTP 协议的软件。用户可以通过域名访问它来接收请求的内容。
静态 Web 服务器将内容按原样交付给浏览器,而动态 Web 服务器会在将数据交付给浏览器之前更新数据。
Apache 是 Apache Software Foundation 推出的一种流行的开源 Web 服务器。它由 Robert McCool 于 1995 年使用 C 和 XML 开发。Apache 基于进程驱动模型,其中每个请求都会导致创建一个新线程。Apache 的模块化设计使您可以轻松扩展单个资源。使用最少的配置,您甚至可以管理大量流量。它适用于 MacOS、Windows 和 Linux 环境。但是,Linux 是 Apache 最喜欢的环境。
虽然它使用文件系统来处理静态内容,但动态内容是在服务器内处理的。使用 .htaccess 文件,您可以对服务器设置执行其他配置。安全性很好。它通过 IRC、Stack Overflow 和邮件列表提供支持。
NGINX 是另一种流行的 Web 服务器,通常发音为“Engine X”。NGINX 由 Igor Sysoev 于 2004 年开发,迅速流行起来。它在事件驱动模型上运行,其中数千个请求在单个线程中处理,以最少的资源提供更多。它使用 PHP 提供静态资源,提供静态内容的速度比 Apache 快 2.5 倍。动态内容通过外部进程提供。在解释请求时,Apache 传递文件系统位置,而 NGINX 传递 URI。此功能将 NGINX 功能扩展为负载平衡器、HTTP 缓存和代理服务器。
虽然它支持基于 Unix 的操作系统,但 Windows 兼容性有限。您不能进行其他配置。较小的代码库提供更好的安全性。不支持动态模块。除了邮件列表和 IRC,论坛也可用。
NGINX 比 Apache 有优势,因为它既可以用作 Web 服务器,也可以用作代理服务器。在单个线程中处理数千个请求的事件驱动方法可提供更高的性能、速度和成本效益。
表示层:客户端组件(前端)
Web 应用程序体系结构的客户端组件使用户能够通过浏览器与服务器和后端服务进行交互。代码驻留在浏览器中,接收请求并向用户显示所需信息。这就是 UI/UX 设计、仪表板、通知、配置设置、布局和交互元素发挥作用的地方。
以下是一些最常用的前端技术:
HTML
HTML 或超文本标记语言是一种流行的标准标记语言,它使开发人员能够使用一系列页面元素来构建网页内容。由 Tim Berners-Lee 开发并于 1993 年发布的 HTML 迅速发展并成为全球标准标记语言。
CSS
CSS 或层叠样式表是一种流行的样式表语言,它使开发人员能够为使用标记语言开发的网站分离网站内容和布局。使用 CSS,您可以为元素定义样式并多次重复使用它们。同样,您可以在多个站点上应用一种样式。它简单易学。您可以为单个元素、整个网页或整个网站应用样式。它也是设备友好的。
浏览器兼容性和安全性是引起关注的两个方面。同样,不同版本的 CSS 也会造成混淆。建议开发人员在对设计进行任何更改之前检查兼容性。
JavaScript
JavaScript 或 JS 是最流行的客户端编程语言,近来超过 90% 的网站都在使用它。它由 Netscape 的 Brendan Eich 于 1995 年设计。JavaScript 使用简单易学的语法。该语言非常流行,以至于每个浏览器都带有一个 JS 引擎来在设备上运行 JavaScript 代码。可以很容易地在任何网页上插入 JS 代码,这使得它具有高度的互操作性。它允许您创建丰富的界面以提供更好的 UI/UX 体验。作为客户端,JS 也减少了服务器负载。
但是,开发人员应该注意安全性,因为代码是在客户端执行的,有时可能会被黑客利用。
React
React 是近年来流行的开源 JavaScript。它由 Facebook 的 Jordan Walke 于 2013 年开发。React 的优势包括使开发人员能够以最少的代码和工作量轻松创建高质量的动态 Web 应用程序。
ReactJS 易于学习和使用。有大量的文档和大量方便的工具可供开发人员使用。代码是可重用的。ReactJS 使用虚拟 DOM,这意味着相关元素会在发生更改时更新,而不是重写整个 DOM 树。它提高了效率并优化了内存使用。ReactJS 使用单向数据流,这意味着对“子”元素所做的更改不会影响“父”元素。该代码易于测试且对 SEO 友好。
不利的一面是,ReactJS 开发环境是高度动态的,这意味着开发人员应该主动监控变化并快速适应新技能以利用 React。此外,React 技术正在迅速发展,但是文档无法跟上这个步伐。一个值得关注的关键领域是 ReactJS 专注于 UI 部分,您需要依赖其他库来实现客户端功能。
Vue.js
Vue.js 是 Evan You 于 2014 年编写的开源 JavaScript 框架。该框架使开发人员能够轻松地为 Web、桌面和移动设备构建 UI 界面。Vue.js 附带了满足基本编程需求的便捷工具。该工具对于下载和安装来说是轻量级的。它易于学习和使用。它使用虚拟 DOM,因此当用户与元素交互时,浏览器不必渲染整个页面,只需渲染元素。速度和性能都不错。它使用双向数据绑定模型,使您可以更有效地跟踪数据和更新相关组件。这些组件是可重复使用的。它可以轻松地与现有应用程序集成。该文档简明扼要且结构合理。社区支持很好。
虽然社区支持很好,但 Vue.js 主要由阿里巴巴和小米等中国公司采用。因此,论坛和讨论通常以中文进行,这给说英语的人造成了语言障碍。该工具包适合基本项目,但对大型项目的支持有限。它提供的灵活性也会对大型项目造成质量问题。GitLab、阿里巴巴和 Adobe 是一些使用 Vue.js 的热门公司。
Angular.js
Angular 是 Google 于 2016 年开发的开源 Web 应用程序框架。它完全重写了 Angular.js 框架。截至目前,它是市场上最受欢迎的前端开发框架之一。
NGModules 是 Angular 的构建块,提供开发应用程序的所有功能,例如组件、模块、模板、指令、服务和依赖注入、路由等。它可以帮助开发人员快速构建原型。它使用纯 HTML 模板。由于依赖注入架构风格,测试快速而简单。
Angular 使用双向数据绑定,这使得 DOM 操作变得简单快捷。CPU 性能增强功能使其成为大型应用程序的理想选择。它带有各种开箱即用的插件和工具。Angular 来自 IT 巨头谷歌,享有充满活力的社区支持。受欢迎程度和市场价值意味着您会在市场上找到高技能的 Angular 专业人员。
然而,分层结构有时会使调试成为一项挑战。控制反转、依赖查找和依赖注入等概念需要陡峭的学习曲线。你需要在机器上安装 JavaScript 才能运行 Angular。虽然双向数据绑定是一项很棒的功能,但它可能会导致较旧和遗留设备的性能下降。将遗留基础设施与 Angular 集成也是一个问题。
如果你想从这些前端开发工具中挑选出最好的,强烈推荐 React 和 Vue.js。React 是一个轻量级的工具,具有最好的开发者功能,使您能够快速构建高质量的软件。
Vue.js 是一种面向视图的产品,轻量级、易于使用,并带有一组强大的开发人员工具。要开始使用,您只需要简单地加载界面并添加 JavaScript。
应用层:服务器端组件(后端)
服务器端组件是 Web 应用程序体系结构的关键组件,它接收用户请求、执行业务逻辑并将所需数据传送到前端系统。它包含服务器、数据库、Web 服务等。
以下是一些最常用的服务器端技术:
Node.js
Node.js 是由 Ryan Dahl 开发的开源跨平台运行时环境。它基于 Google Chrome V8 Engine 构建,用于运行网络和服务器端应用程序,并于 2009 年发布。开发人员使用 JavaScript 构建 node.js 应用程序,并使用 Windows、macOS 和 Linux 平台在 node.js 运行时运行它们。
Node.js 非常受欢迎,因为它提供了丰富的 JavaScript 模块库,使开发人员能够快速构建高质量的应用程序。Node.js 不缓冲数据并超快地执行代码。它是事件驱动和异步的,在单个线程上运行,同时具有高度可扩展性。Node.js 最适合数据流、数据密集型、I/O 绑定和基于 JSON-API 的应用程序。Paypal、Uber、eBay 和 GoDaddy 都是由 Node.js 提供支持的一些流行应用程序。它不适合 CPU 密集型应用程序。
Java
Java 是有史以来最流行和最有效的编程语言之一。Java 由 James Gosling 于 1995 年编写,是一种面向对象和基于类的编程语言,使开发人员能够使用 Java 虚拟机 (JVM) 环境编写代码并在任何平台上运行它。这意味着您不需要在目标机器上安装 Java。该语言易于学习、编码、编译和调试。由于与平台无关,Java 程序的构建和运行具有成本效益。利用 OOPS 概念,您可以在其他程序中重用对象。由于它不适用于显式指针,因此避免了未经授权的内存访问。它支持多线程、可移植性、自动垃圾收集、分布式网络等。
不利的一面是,Java 需要大量的内存空间。由于 JVM 抽象,程序运行速度也较慢。也没有备份。UX/UI 没有吸引力。然而,对于使用 Java 开发 Web 应用程序架构的服务器端组件,利大于弊。
Python
Python 是由 Guido Van Rossum 编写并于 1991 年发布的一种开源高级编程语言。如今,它是一种快速发展且流行的编程语言,并且是用 Java 构建 Web 应用程序架构的有力替代方案。它易于学习和开发,并且功能丰富。这种动态类型语言非常灵活,适用于小型和大型 Web 应用程序项目以及移动应用程序、视频游戏、AI 编程等各种领域。它允许您用更少的代码做更多的事情,这意味着您可以快速构建和测试原型,从而提高生产率。Python 提供了一个广泛的库,其中包含几乎所有类型程序的代码。凭借其充满活力的社区,支持始终可用。
但是,与现代语言相比,Python 速度较慢。线程问题是另一个问题。Python 不适用于移动应用程序。谷歌、Spotify、Instagram 和 Facebook 是一些使用 Python 的流行 IT 巨头。
PHP Laravel
PHP Laravel 是一个 PHP 框架,可帮助开发人员轻松构建自定义 Web 应用程序。它是一个开源框架,在其他 PHP 框架中非常流行。PHP Laravel 是一个基于 MVC(模型、视图和控制器)的框架。
Laravel 语法优雅且富有表现力。凭借丰富的内置功能和结构,开发人员可以轻松编写代码并更快地部署应用程序。它提高了性能和速度。文档很好。PHP Laravel 的一个重要优势是它的自动化测试功能,可以帮助您在初始阶段测试和调试错误。自动任务和计划也可用。对象关系映射支持很优雅。PHP Laravel 提供提供安全性的跨站点请求伪造令牌。它具有可扩展性和成本效益。
但是,产品升级有时会产生问题。Laravel Composer 可以改进。由于它是一个相对较新的产品,因此社区支持不是很好。PHP Laravel 最适合中小型组织。
Go
Go编程语言来自于IT巨头谷歌,这赋予了它相当的实力。它由 Robert Griesemer、Ken Thompson 和 Rob Pike 于 2009 年编写。Go 也称为 Golang。它类似于 C 语言,易于学习和构建。由于没有虚拟运行时,Go 代码编译速度更快,生成的二进制文件也更小。它使用静态类型和接口类型。标准库提供一系列内置函数以及测试支持。垃圾收集可用。与其他语言相比,并发编程很容易。
不利的一面是,库支持不足。在某些情况下,社区支持并不受欢迎。隐式接口可能难以管理。没有泛型,代码的重用并不容易。
.NET
.NET 是由 Microsoft 开发并于 2001 年发布的用于桌面和 Web 应用程序的软件开发框架。来自IT巨头微软,。NET 迅速流行起来,用于开发各种软件产品。
.NET 具有三种风格:
- .NET Framework:它是第一个特定于 Windows 平台的产品。
- .NET Core:.NET Core 于 2016 年作为跨平台解决方案发布,以适应 macOS 和 Linux 平台。
- Xamarin: Xamarin 并非由微软开发,而是在 2016 年被该公司收购。Xamarin 扩展了 .NET 平台以支持原生移动应用程序开发。
.NET Standard 是用于 .NET Framework、.NET Core 和 Xamarin 实现的单个基类库。
.NET 是一种面向对象编程 (OOP) 模型,使用模块化结构,使开发人员能够将代码分解成更小的部分,并使用 CI/CD 管道无缝构建和管理软件产品。它提供了一个强大而简单的缓存系统,可以提高速度和性能。ASP.NET 中的自动监控是一个额外的优势。Visual Studio IDE 是一个单一的 IDE,可帮助开发人员从单个窗格监视和管理整个开发操作。由于与语言和平台无关,它允许您使用各种开发环境。代码的部署和管理是灵活和容易的。.NET 带有广泛的文档和社区支持。
但是,对象关系支持是有限的。内存泄漏是一个在编写应用程序时需要特别注意的问题。严重依赖 Microsoft 会导致供应商锁定和更高的许可成本。.NET 最适合需要高可扩展性和跨平台解决方案的企业产品。
Ruby
Ruby 是日本的 Yukihiro Matsumoto 于 1995 年开发的一种流行的编程语言。时间效率是 Ruby 的最大优势之一。结合 Rails 框架,它允许开发人员快速构建和部署应用程序。该工具提供了一个广泛的库和有用的工具。它具有内置安全性,可降低与 SQL 注入、跨站点脚本软件 (XSS) 和跨站点请求伪造 (CSRF) 相关的风险。Ruby 有一个支持性的社区和良好的文档。
虽然开发人员可以快速构建应用程序,但应用程序的速度是一个问题。也就是说,这个问题主要影响大型应用程序。中小型组织在这个领域没有任何问题。
Ruby 不如 Java 或 Python 流行。出于这个原因,要为这个细分市场找到优质的专业人士并不容易。Airbnb、GitHub、Bloomberg 和 Etsy 是一些使用 Ruby 的热门公司。
在服务端开发工具中,Node.js 和 Python 是比较推荐的。Node.js 是一种易于学习、轻量级、对开发人员友好、高度可伸缩和可扩展的跨平台解决方案。Python 使用简单的语法,专注于自然语言,使编写和执行代码变得更容易、更快。社区也非常支持。
应用层:应用程序编程接口(API)
应用程序编程接口 (API) 不是一种技术,它是一种概念,使开发人员能够访问软件的某些数据和功能。简单地说,它是一个让应用程序相互通信的调解器。它包含构建应用程序所需的协议、工具和子例程定义。
例如,当您登录某个应用程序时,该应用程序会调用 API 来检索您的帐户详细信息和凭据。应用程序将联系相应的服务器以接收此信息并将此数据返回给用户应用程序。Web API 是通过 HTTP 协议在 Web 上可用的 API。它可以使用 .NET 和 Java 等技术构建。
使用 API,开发人员不必从头开始创建所有内容,而是使用作为 API 公开的现有功能来提高生产力并加快上市速度。通过减少开发工作量,API 显着降低了开发成本。它还改善了整个生态系统的协作和连接,同时增强了客户体验。
有不同类型的 API:
RESTful API:轻量级 JSON 格式的具象状态传输 API。它具有高度可扩展性、可靠性并提供快速性能,使其成为最受欢迎的 API。
- SOAP:简单对象访问协议使用 XML 进行数据传输。它需要更多带宽和高级安全性。
- XML-RPC : Extensible Markup Language – Remote Procedure Calls 使用特定的 XML 格式进行数据传输。
- JSON-RPC:使用JSON格式进行数据传输。
应用层:服务器实例/云实例
服务器或云实例是 Web 应用程序架构的重要组成部分。云实例是使用公共或私有云构建、交付和托管并可通过 Internet 访问的虚拟服务器实例。它用作物理服务器,可以在多个设备之间无缝移动或在单个服务器上部署多个实例。因此,它具有高度动态性、可扩展性和成本效益。您可以在应用程序不停机的情况下自动更换服务器。使用云实例,您可以在任何环境中轻松部署和管理 Web 应用程序。
数据层:数据库
数据库是 Web 应用程序的关键组件,用于存储和管理 Web 应用程序的信息。使用函数,您可以根据用户请求搜索、过滤和排序信息,并将所需信息呈现给最终用户。它们允许基于角色的访问以维护数据完整性。
在为您的 Web 应用架构选择数据库时,大小、速度、可扩展性和结构是需要您考虑的四个方面。对于结构化数据,基于 SQL 的数据库是一个不错的选择。它们适合以数据完整性为关键要求的金融应用程序。
要处理非结构化数据,NoSQL 是一个不错的选择。它适合传入数据的性质不可预测的应用程序。Key Value 数据库将每个值与一个键相关联,适用于存储用户配置文件、评论、博客评论等的数据库。对于分析,宽列数据库是一个不错的选择。
先进且可扩展的 Web 应用程序架构
Web 应用程序架构正在不断发展。因此,组织应该主动监控这些变化并相应地重新调整架构。以下是一些需要检查的趋势:
缓存系统
缓存系统是一种本地数据存储,有助于快速访问应用程序服务器的数据,而不是每次都联系数据库。在传统设置中,数据存储在数据库中。当用户发出请求时,应用程序服务器会从数据库中请求该数据并将其呈现给用户。当再次请求相同的数据时,服务器又要进行相同的处理,重复且耗时。通过将此信息存储在临时缓存中,应用程序可以快速向用户呈现数据。
缓存系统可以设计成四种模型:
- 应用程序服务器缓存:与应用程序服务器一起的内存中缓存(对于具有单个节点的应用程序)
- 全局缓存:所有节点都访问一个缓存空间。
- 分布式缓存:缓存分布在节点之间,其中使用一致的哈希函数将请求路由到所需的数据。
- 内容分发网络 (CDN):用于分发大量静态数据。
缓存工具
Redis 和 Memcached 是两个最流行的缓存系统,它们具有相似的特性。然而,Redis 提供了一套丰富的工具,使其适用于执行各种任务。另一方面,Memcached 简单易用。
AWS 的缓存系统称为 AWS ElastiCache。此 Web 服务使管理员能够扩展和管理云中的内存数据存储服务。AWS 还提供了一个完全托管的与 Redis 兼容的内存数据存储,称为 Amazon ElastiCache for Redis,以及一个完全托管的与 Memcached 兼容的内存数据存储服务,称为 Amazon ElastiCache for Memcached。
云存储(亚马逊 S3)
在 Web 应用程序架构中,云存储是一个显而易见的需求。云存储是将数据存储在云中并通过 Internet 访问它。云服务提供商以按使用付费的订阅模式提供存储基础设施。
由于 AWS 是最受欢迎的云服务提供商,Amazon S3 是全球 Web 应用程序架构 AWS 环境中广泛使用的云存储解决方案。Amazon Simple Storage Service (S3) 是一种云存储服务,灵活、经济、耐用、安全,并提供高可用性和高可扩展性。
在 AWS 中,云存储单元称为存储对象的“桶”。Bucket创建后,部署在用户指定的地域。部署完成并将对象添加到存储桶后,用户可以选择存储类类型以及版本控制、生命周期策略、存储桶策略等功能。AWS 负责一组对象的生命周期管理,包括 IAM 策略和数据保护。
Azure 云存储是 Microsoft Azure 提供的另一种流行的云存储服务。Azure 存储的最大优点是 99.95% 的正常运行时间和高安全性的高可用性。每月每GB 0.18美元的价格,非常划算。Azure 附带一整套管理访问和开发人员工具,可帮助组织无缝协调整个业务运营。
Google Cloud Storage 是 Google 提供的一种云存储产品,价格为每月每 GB 0.02 美元。它在多个地区可用,具有高耐用性并可轻松与其他 Google 服务集成。该工具附带了很好的文档。
CDN(云端)
内容分发网络 (CDN) 是安装在不同地理位置的服务器网络,可以更快更好地向用户分发内容。用户的请求没有联系中央服务器,而是被路由到存储内容缓存版本的 CDN 服务器。因此,站点速度和性能提高,数据包丢失减少。服务器负载降低。它还可以实现受众细分和高级网络安全。
CloudFront 是一种流行的 Web 应用程序架构 aws CDN 服务。它充当分布式缓存,以提供更高的速度、更低的延迟和更好的客户体验。考虑到 AWS 的全球存在,CloudFront 为用户提供了更广泛的地理位置。CloudFront 与其他 AWS 服务(如 Amazon EC2、AWS Lambda、Amazon CloudWatch、Amazon S3 等)很好地集成,使您的工作更加轻松。它灵活、易于设置并提供高可扩展性。它还具有弹性服务和分析功能。您也可以控制对内容的访问。
Azure CDN 是来自 Microsoft Azure 云平台的流行内容交付网络,易于配置和使用,并提供低延迟。
Google 的内容分发网络称为 Cloud CDN。它利用全球分布的边缘服务器在使用位置缓存内容,以高速交付内容。
CloudFlare 是另一种流行的 CDN 服务。虽然 CloudFlare 主要提供强大的 DNS 服务,而不是传统的内容交付网络,但它充当反向代理,通过其全球数据中心网络路由流量。
负载均衡器
顾名思义,负载均衡器是一种服务,它通过根据可用性或预定义的策略将流量分布在不同的服务器上来平衡流量负载。当负载均衡器收到用户请求时,它会根据可用性和可伸缩性检索服务器的健康状况,并将请求路由到最佳服务器。负载平衡器可以是硬件组件或软件程序。
负载均衡可以通过两种方式完成:
1) TCP/IP level Load Balancing : 基于DNS的负载均衡
2) App-level Load Balancing : 基于应用负载的负载均衡
负载均衡器工具
AWS 中最初的弹性负载均衡器是AWS Classic Load Balancer。它工作在 TCP 层(第 4 层)和应用层(第 7 层)。但是,它仅在每个实例的一个端口上转发流量。
另一个很棒的 LB 是AWS Application Load Balancer ,它在应用程序层 (HTTP) 工作,可以在每个实例的多个端口上转发流量。它还提供多个域名。
多个服务器
在传统的网络架构中,您会看到一个网络服务器和一个数据库。Web 服务器侦听客户端请求并联系数据库以提供所需信息或处理业务逻辑。当并发用户增加时,Web 服务器将耗尽资源。尽管升级服务器配置有一段时间的帮助,但它提供的功能有限,同时也会导致单点故障。部署多台服务器是创建高度可扩展的 Web 架构的不错选择。
在设计多服务器架构时,组织可以将多个操作系统部署服务器连接到单个数据库或多个数据库。但是,重要的是用适当的内容复制它们。可以在指定时间安排复制。
消息队列
消息队列是一个缓冲区,它异步存储消息并促进 Web 应用程序中不同服务之间的通信。在当今的微服务环境中,软件是在更小的、模块化的、独立的构建块中开发的,这些构建块使用 RESTful API 相互通信。这些块之间的通信使用消息队列进行协调。软件组件连接到这些消息队列的末端以发送和接收消息并处理它们。消息队列提供细粒度的可伸缩性,简化解耦过程,并提高可靠性和性能。
Amazon Simple Queue Service (SQS) 是 Amazon 提供的完全托管的发布/订阅 (pub/sub) 消息队列服务。使用 AWS SQS 提供的 Web 服务 API,用户可以通过任何编程语言访问消息。消息是异步处理的,这意味着消息在队列中等待,应用程序可以稍后访问它们。
Amazon SQS 使用两种类型的队列:
- 先进先出 (FIFO):消息字符串按照发送的相同顺序进行处理。它对于过程顺序至关重要的操作很有用。
- 标准队列:消息字符串保持不变,但顺序可能会改变。它对于将消息分发到各个节点的任务很有用。
AWS SQS 支持每秒 300 条消息。每条消息都可以定制。您可以将消息保留 1 分钟到 14 天的较长时间。解耦应用程序组件的能力有助于实现高性能。它消除了管理开销,同时保持数据敏感。与其他 AWS 产品的兼容性可帮助您轻松地将其与现有基础设施集成。
Web 应用架构图
在这里,您将能够借助 Web 应用程序架构图从头到尾分析流程。重要的是要考虑将对流程采取行动的元素和资源,例如 API、云存储、技术和数据库。
Web 应用程序架构的类型
Web 应用程序的体系结构可以根据软件开发和部署模式分为不同的类别。
单体架构
单体架构是一种传统的软件开发模型——也称为 Web 开发架构——其中整个软件开发为通过传统瀑布模型的单个代码。这意味着所有组件都是相互依赖和互连的,并且每个组件都需要运行应用程序。要更改或更新特定功能,您需要更改要重写和编译的整个代码。
由于单体架构将整个代码视为一个程序,因此构建新项目、应用框架、脚本、模板和测试变得简单易行。部署也很容易。但是,随着代码越来越大,管理或更新变得困难;即使是很小的变化,您也需要经历 Web 开发架构的整个过程。由于每个元素都是相互依赖的,因此扩展应用程序并不容易。此外,它不可靠,因为单点故障可能会导致应用程序崩溃。
当您想要构建轻量级应用程序并且预算紧张时,单体架构将达到目的。但是,当您的开发团队在一个位置工作而不是远程分散时,使用整体模型是有意义的。
微服务架构
微服务架构解决了单体环境中遇到的几个挑战。在微服务架构中,代码被开发为通过 RESTful API 进行通信的松散耦合的独立服务。每个微服务都包含自己的数据库并运行特定的业务逻辑,这意味着您可以轻松开发和部署独立的服务。
由于它是松耦合的,微服务架构提供了更新/修改和扩展独立服务的灵活性。开发变得简单高效,持续交付成为可能。开发人员可以快速适应创新。对于高度可扩展和复杂的应用程序,微服务是一个不错的选择。
但是,使用运行时实例部署多个服务是一项挑战。当服务数量增加时,管理它们的复杂性也会增加。此外,微服务应用程序共享分区数据库。这意味着您应该确保受事务影响的多个数据库之间的一致性。
集装箱
容器技术是部署微服务的最佳选择。容器是对可以在物理机或虚拟机上运行的应用程序的轻量级运行环境的封装。因此,应用程序在从开发人员设备到生产环境的一致环境中运行。通过在操作系统级别抽象执行,容器化允许您在单个操作系统实例中运行多个容器。在减少开销和处理能力的同时,它也提高了效率。
容器化使开发人员能够在单个 VM 环境中添加多个应用程序组件,而不是将代码隔离到不同的 VM 中,从而获得更多的应用程序处理能力。凭借其轻量级的特性,容器运行得更快。它们灵活、可靠,最适合基于策略的微服务环境。
Docker 是最流行的容器化技术,它为容器化技术提供了一个全面的生态系统。它提供更高的性能、易于使用的技术和庞大的社区支持。
无服务器架构
无服务器架构是开发软件应用程序的模型。在此结构中,底层基础设施的供应由基础设施服务提供商管理。这意味着您只需为使用中的基础架构付费,而不是为空闲 CPU 时间或未使用的空间付费。无服务器计算降低了成本,因为资源仅在应用程序执行时使用。缩放任务由云提供商处理。此外,后端代码得到简化。它减少了开发工作和成本,并缩短了上市时间。
多媒体处理、直播、聊天机器人 CI 管道、物联网传感器消息等是无服务器计算的一些用例。
在微服务架构中,您可以使用 AWS Lambda、API Gateway 和 API Step Functions 执行无服务器计算。
AWS 拉姆达
AWS Lambda 是亚马逊提供的无服务器计算服务。Lambda 于 2014 年推出,为使用 Python、C#、Java、Node.js 等语言编写的函数提供执行环境。它会根据流量要求自动配置和删除服务器。您不必上传整个应用程序,只需上传所需的功能,然后触发它运行服务。Lambda 提供易于执行、改进的应用程序弹性和具有成本效益的解决方案。不利的一面是,无法控制环境。
API网关
API 网关是一种 API 管理工具,可让您创建、发布、保护和管理 HTTP、WebSocket 和 REST API。作为反向代理,API 网关接收各种 API 调用,执行服务聚合以完成这些调用并传递结果。API 网关可帮助您保护 API、在 API 上运行分析工具、连接计费服务或管理旧的和已删除的 API 等。在无服务器环境中,资源是根据 API 调用来配置的。API 网关可帮助您部署和管理无服务器功能。
AWS 步骤功能
AWS Step Functions 是一种 AWS 可视化工作流工具,使开发人员能够将流程分解为一系列步骤。借助这种低代码服务,IT 流程自动化、构建分布式应用程序和机器学习管道变得很容易。您可以快速构建和部署可靠且高度可扩展的应用程序,并使用更少的集成代码管理有状态和容错的工作流。
Web 应用程序架构最佳实践
以下是设计出色的 Web 应用程序架构时应遵循的一些最佳实践。
可扩展的网络服务器
无论并发用户数量、位置和时间如何,可扩展的 Web 服务器对于提供一致的应用程序性能至关重要。存在三种类型的缩放选项,即水平缩放、垂直缩放和对角缩放。垂直缩放是关于升级/降级设备配置,而水平缩放是关于增加/减少设备数量。对角缩放是关于结合两种模型。建议选择水平扩展模型,因为您不会受到配置或服务器数量的限制。此外,您可以在适用的情况下混合垂直缩放。
使用弹性基础架构适应云
随着混合云和多云环境越来越流行,适应云并主动配置资源是交付高性能 Web 应用程序的关键。弹性基础架构带有预配置的网络系统、VM 服务器、存储和计算资源,允许使用自助服务门户轻松管理环境。它提供了快速适应不断变化的市场需求和客户期望的灵活性。
不可变的基础设施
简而言之,不可变的基础架构是一旦部署就无法更改的东西。它使管理员能够使用代码自动配置资源。当要更新或修改服务器时,它们会自动被更新的服务器替换。
配置漂移是可变基础架构中的一大挑战。在复制生产环境的同时扩展和调试问题增加了这一挑战。不可变基础架构使用经过验证和版本控制的映像为每个部署配置新服务器。因此,服务器的先前状态不是问题。您可以在部署之前测试服务器。它消除了配置漂移并允许水平扩展,同时通过一致的暂存环境提供简单的回滚和恢复。
微服务和无服务器方法
微服务和无服务器计算对于 Web 应用程序开发都至关重要。然而,不同之处在于微服务架构提供了具有高可扩展性的长期解决方案,而无服务器计算提供了代码效率。无服务器功能仅在触发时运行。
通过结合这两种模型,您可以获得两全其美的优势。您可以使用 AWS Step Functions 分配触发器以将多个函数组合到一个服务中并为它们分配触发器。借助事件触发的微服务,您可以构建组合系统以获得代码效率、长期稳定性、成本效益和可扩展性。
多租户架构
- Web 应用程序现在作为 SaaS 应用程序交付。部署 SaaS 应用程序有两种模型:单租户与多租户架构。
- 单租户架构:为包含基础设施、软件和硬件生态系统的每个组织创建一个独立的环境。
- 多租户架构:具有完全集中服务和逻辑隔离的单一云环境由多个组织共享。
对于 Web 应用程序,使用多租户架构具有多种优势。组织可以为所有用户管理一个代码库,减少开销和代码冲突问题。它还通过规模经济降低了服务器基础设施成本。在减少开发工作的同时,它还缩短了上市时间。
Python/Node.js + React + AWS 是构建 SaaS Web 应用程序的新趋势。
使用 HIPAA、PCI 和 SOC2 准则保护架构
构建安全架构是任何组织的最低要求。应用安全协议和策略不仅可以保护您的数据和环境,还可以帮助您轻松管理审计任务并遵守政府法规。
- HIPAA:健康保险流通与责任法案 (HIPAA) 是健康组织必须遵守的一项重要要求。它有助于减少医疗保健欺诈,同时保护私人健康信息。
- PCI DSS:支付卡行业数据安全标准 (PCI DSS) 为处理客户敏感财务数据的金融机构定义了一套程序和政策。
- SOC 2:SOC 2 审计程序是确保您的数据由云服务提供商安全管理的一个关键方面。虽然组织不必遵守 SOC 2 指南,但最好遵循它们以保护客户数据。SOC 2 准则定义了客户数据管理所基于的五项信任服务原则。
- 可用性
- 安全
- 加工完整性
- 保密
- 隐私
在 DevOps CI/CD 环境中自动化代码部署
部署自动化是关于轻松地自动化测试和生产环境之间的代码移动过程。它使开发人员能够快速、频繁地将代码部署到生产中,而无需人工干预。AWS 以 AWS CodeDeploy 的形式提供完全托管的部署服务。它使您能够自动将代码部署到各种环境,例如 AWS Lambda、AWS Fargate、Amazon EC2 或本地。
部署自动化是 DevOps 持续集成/持续部署管道的一部分。它由三个重要阶段组成:构建、测试和部署。编写代码时,它会自动进行测试并添加到中央存储库中。这些更改经过验证并添加到应用程序中。自动化测试在不同级别运行各种测试,以确保代码没有错误。然后代码会自动部署到生产环境中。
使用基础架构即代码工具构建您的 Web 架构
基础设施即代码 (IaC) 是一种使用代码自动配置基础设施的方法。它帮助您将服务器、网络、数据库和其他 IT 资源视为软件,并使用配置文件对其进行管理。因此,您可以按需即时启动资源、管理配置一致性并消除配置偏差,同时提高软件开发效率。它还降低了软件开发成本。Terraform 和 AWS CloudFormation是两个最流行的IaC 工具。
结论
在当今竞争激烈的软件世界中,创造优质的产品和服务不足以赢得客户的信任。您向客户提供产品和服务的方式最为重要。Web 应用程序可以帮助您做到这一点。因此,组织需要创建和部署高度优化的 Web 应用程序,以经济高效地为客户提供速度和性能以及卓越的客户 UI/UX 体验。设计正确的 Web 应用程序架构在这里至关重要。