当我们使用台式机、笔记本电脑或移动设备,打开浏览器并输入网站地址,浏览器会显示所需信息,然后我们在网站上执行相应的操作。
你有没有想过计算机如何检索这些信息以及在后台发生了什么?它是一种底层 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 设计、仪表板、通知、配置设置、布局和交互元素发挥作用的地方。
以下是一些最常用的前端技术栈:
.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):用于分发大量静态数据。
在 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 : 基于应用负载的负载均衡
先进先出 (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 执行无服务器计算。
可扩展的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 应用程序架构至关重要。
作者:洛逸
本文为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。