有关 N 层体系结构的注意事项

已完成

我们已经了解了 N 层体系结构的构成,并且部署了一个三层体系结构示例。 现在我们来探讨一下这种体系结构样式的一些优势和挑战,以及在性能和安全性方面对其进行优化的最佳做法。

优势

这种体系结构样式得益于它的简洁性。 它是一种定义完善的常用体系结构模式,既可用于本地部署,也可用于云部署,并且适用于各种应用程序。

它是一种与平台无关的体系结构,适用于部署在 Windows 或 Linux 上的应用程序。 正如我们在示例环境中所示,可以在任何层级使用 PaaS 或 IaaS 服务。

将应用程序分为多个层级后,可以单独缩放、更新或升级每个层级。 如果对我们网站的请求增加,我们可以在不影响其他层级的情况下添加更多 Web 服务器来处理负载。 同样,如果对我们数据层的请求增加,我们可以缩放数据库,使其具有更多容量来处理请求。

网络分离是该体系结构的自然副产品。 由于应用程序分为多个层级,我们应该隔离每个层级,只允许必要的网络访问。 呈现层可以向 Internet 公开,数据库可以在多个网络层后面受到全面保护,而我们的应用程序将照常运行。 通过保护各层级之间的网络访问,我们缩小了应用程序的受攻击面并提高了它的安全性。

挑战和注意事项

在将应用程序分成多个层级时,请避免产生仅执行数据库操作的中间层。 每个层级都应有特定的价值。 额外的层级会增加复杂性、处理时间、滞后时间,最终给用户带来更长的延迟。

由于每个应用程序级域的 API 不会分成单独的服务,因此它们必须一起缩放。 如果单个应用程序方法需要更多处理能力或需要处理比其他方法更多的请求,则在横向扩展应用层以处理负载时,必须将其作为一个整体而不是单个服务进行扩展。

在某些情况下,可以将应用程序开发为 N 层体系结构,但仍作为整体应用程序进行部署。 通过完全分离每个层级,应独立部署每个层级。 完全分隔涉及删除共享依赖项,而更多地依赖各层级之间的 API 调用。 只要操作正确,便可确保应用程序部署的灵活性。

N 层体系结构中的应用程序通常部署在 VM 上。 这是一个好的开端,但让应用程序演变为使用 PaaS 服务将在安全性、可伸缩性和管理等方面带来诸多好处。 这种演变通常都被忽略了,导致 N 层体系结构仍然驻留在 VM 上。

N 层是一种经典的体系结构样式,但在许多情况下,它已被其他现代设计模式所取代,例如微服务体系结构。 你可以花些时间来评估其他体系结构,看它们是否更适合你的应用程序,这通常很值得一做。

有关 N 层体系结构的最佳做法

可通过执行以下操作来确保 N 层体系结构以最佳状态运行。 下图直观地展示了如何对 N 层体系结构进行改进。

Visualization of N-tier architecture.

优化性能

让我们看看如何在性能和安全性方面优化 N 层体系结构。

自动缩放

将应用程序分为多个层级后,可以使用自动缩放等云功能来适应系统负载。 当用户或请求数增加时,可在多个层级使用自动缩放功能来添加更多资源,以处理请求。 当请求数减少时,自动缩放功能会减少计算资源,同时也会减少你的开支。 借助自动缩放功能,可轻松确保用户获得最佳体验并将成本维持在较低水平。 Azure 虚拟机规模集可用于基于 VM 的工作负载,而许多 PaaS 服务(如 Azure 应用服务)内置了自动缩放功能。

负载均衡

在使用自动缩放功能横向扩展应用程序时,使用负载均衡成为了体系结构必不可少的一部分。 借助负载均衡,当你向层级添加更多计算资源时,它们将添加到负载均衡器分布区中,以利用额外的处理能力。 相反,当系统发生故障时,会将它从负载中移除,以便最大限度地减少性能不佳或错误请求对用户造成的影响。 这可确保用户请求转到处于正常状态的系统。 Azure 负载均衡器是网络功能的内置功能,而应用程序网关提供了功能更丰富的 HTTP 负载均衡解决方案。

消息传递

在层级之间使用消息传递服务会对性能(特别是对本质上异步的请求)产生积极影响。 服务将消息放入队列中,一直到处理完毕,从而抵消下游负载的影响。 如果发生系统中断,消息传送服务将确保消息仍得到处理。 消息保留在队列中,并在系统重新联机后接受处理。 Azure 有多种消息传递解决方案可供选择,具体取决于你的需求。 如果需要使用消息传递服务,可以考虑 Azure 服务总线、Azure 存储队列和 Azure 事件中心。

缓存数据

对经常访问且更改率较低的数据使用缓存,或对不需要长期保留的数据(如会话状态)使用缓存。 缓存系统位于两个层级之间,并减少了这些类型的数据的数据检索时间。 用于 Redis 的 Azure 缓存是一种非常适合此方案的 PaaS 服务。

优化安全性

优化应用程序的安全性通常是一项永远“完成”不了的工作。即使应用程序分为多个层级,仍必须将精心规划的安全实践融入到体系结构中。 添加的层级越多,需要保护的对象就越多,而且引入系统的复杂性就越高。 可通过执行以下操作来确保体系结构为应用程序提供一个安全的运行环境。

网络隔离

在 VM 上运行 N 层体系结构时,请确保每个层级都在其自己的子网中。 此子网充当安全边界,允许你通过网络访问控制列表来隔离连接。 子网还通过确保子网中的新系统收到相同的规则来简化管理。 在 Azure 中,这可以通过网络安全组 (NSG) 以本机方式实现。 应考虑对 PaaS 服务执行类似的操作,但网络集成功能因服务而异,应分别进行评估。 最佳做法是确保每个层级只能与其下一层级通信。 呈现层只能与应用层通信,而应用层只能与数据层通信。 通过最大程度减少这种连接,可提供一种分层的方法来确保网络安全,并改善体系结构的整体安全状况。

Web 应用程序防火墙

在各子网之间实行安全隔离后,你需要确保公开的前端是安全的,并且只允许访问所需的内容。 只应向入站 Internet 流量公开呈现层。 在呈现层前面添加 Web 应用程序防火墙 (WAF) 技术将增强此层级的安全性。 WAF 会检查流量是否存在恶意活动,确保通信加密,并在出现异常情况时向你发出警报。 在 Azure 中,应用程序网关是一个 HTTP 负载均衡器,具有可启用的内置 WAF。

知识检查

1.

以下哪种方法有可能提高 N 层体系结构上应用程序的性能,同时保持成本优化?

2.

以下哪一项操作可以提高应用程序的安全性?