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