将共享或专用服务功能卸载到网关代理。 此模式可以通过将共享服务功能(如 SSL 证书的使用)从应用程序的其他部分移动到网关,简化应用程序开发。
上下文和问题
一些功能通常跨多个服务使用,并且这些功能需要配置、管理和维护。 与每个应用程序部署一起分发的共享或特殊化服务会增加管理开支和部署错误的可能性。 对共享功能的任何更新必须跨共享该功能的所有服务部署。
正确处理安全问题(令牌验证、加密、SSL 证书管理)和其他复杂任务可能需要具备高度专业技能的团队成员。 例如,应用程序所需的证书必须在所有应用程序实例上配置和部署。 对于每个新部署,必须管理证书以确保它未过期。 任何即将到期的通用证书必须针对每个应用程序部署进行更新、测试和验证。
其他通用服务(如身份验证、授权、日志记录、监视或限制)可能很难在大量部署中进行实施和管理。 可能更好的做法是合并此类型功能,以便减少开销和降低错误概率。
解决方案
将一些功能卸载到网关,尤其是横切关注点(如证书管理、身份验证、SSL 终端、监视、协议转换或限制)。
下图显示终止入站 SSL 连接的网关。 它代表网关上游的 HTTP 服务器中的原始请求程序请求数据。
此模式的优点包括:
通过消除对分发和维护支持资源的需求,简化服务的部署,如 Web 服务器证书和安全网站的配置。 通过简化配置,简化管理、可伸缩性和服务升级。
允许专业团队实施需要专业技能的功能,如安全性。 这样一来,核心团队可专注于应用程序功能,而这些特殊化横切关注点可交给相关专家解决。
提供请求和响应记录和监视的一致性。 即使未正确检测服务,也可以通过配置网关来确保最低级别的监视和记录。
问题和注意事项
- 确保网关高度可用并可弹性应对故障。 运行多个网关实例以避免单一故障点。
- 确保网关可满足应用程序和终结点的容量和缩放要求。 确保网关不会成为应用程序的瓶颈,并具有足够的可缩放性。
- 仅卸载由整个应用程序使用的功能,如安全性或数据传输。
- 切勿将业务逻辑卸载到网关。
- 如果需要跟踪事务,请考虑生成用于记录的关联 ID。
何时使用此模式
在以下情况下使用此模式:
- 应用程序部署具有共享关注点,如 SSL 证书或加密。
- 应用程序部署中的一个常用功能,可能具有不同的资源要求,例如内存资源、存储容量或网络连接。
- 希望将问题(如网络安全、限制或其他网络限制问题)的责任转移到一个更专业的团队。
如果此模式跨服务引入耦合度,则它可能不适合。
工作负荷设计
架构师应评估如何在其工作负荷的设计中使用“网关卸载模式”,以解决 Azure Well-Architected Framework 支柱中涵盖的目标和原则。 例如:
支柱 | 此模式如何支持支柱目标 |
---|---|
可靠性设计决策有助于工作负荷在发生故障后复原,并确保它在发生故障后恢复到正常运行状态。 | 将此职责卸载给网关可以降低后端节点上应用程序代码的复杂性。 在某些情况下,卸载会用可靠的平台提供的功能完全取代功能。 - RE:01 简单性和效率 |
安全设计决策有助于确保工作负荷数据和系统的机密性、完整性和可用性。 | 将网关添加到请求流后,便可以集中使用安全功能,如 Web 应用程序防火墙和与客户端的 TLS 连接。 平台提供的任何卸载功能都已提供增强的安全性。 - SE:06 网络控制措施 - SE:08 强化资源 |
成本优化的重点是维持和提高工作负载的投资回报率。 | 此模式使你能够将花费在每个节点上的资源成本重定向到网关实现中。 集中式处理模型的成本通常低于分布式模型的成本。 - CO:14 合并 |
卓越运营有助于通过标准化流程和团队凝聚力来实现工作负荷质量。 | 在此模式中,卸载功能的配置和维护是从单点开始的,而不是从多个节点进行管理。 - OE:04 工具和流程 |
性能效率通过在缩放、数据和代码方面进行优化, 帮助工作负载高效地满足需求。 | 向请求流程添加一个卸载网关可以减少每个节点的资源使用,因为功能集中在网关上。 可以独立于应用程序代码来优化卸载功能的实现。 卸载平台提供的功能很可能已经具有很高的性能。 - PE:03 选择服务 |
与任何设计决策一样,请考虑对可能采用此模式引入的其他支柱的目标进行权衡。
示例
将 Nginx 用作 SSL 卸载设备,以下配置将终止入站 SSL 连接,并将连接分布到三个上游 HTTP 服务器之一。
upstream iis {
server 10.3.0.10 max_fails=3 fail_timeout=15s;
server 10.3.0.20 max_fails=3 fail_timeout=15s;
server 10.3.0.30 max_fails=3 fail_timeout=15s;
}
server {
listen 443;
ssl on;
ssl_certificate /etc/nginx/ssl/domain.cer;
ssl_certificate_key /etc/nginx/ssl/domain.key;
location / {
set $targ iis;
proxy_pass http://$targ;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
}
在 Azure 上,这可以通过设置应用程序网关上的 SSL 终端来实现。