使用单个终结点将请求路由到多个服务或多个服务实例。 希望执行以下操作时,此模式非常有用:
- 在单个终结点上公开多个服务,并根据请求路由到适当的服务
- 出于负载均衡或可用性目的,在单个终结点上公开同一服务的多个实例
- 在单个终结点上公开同一服务的不同版本,并跨不同版本路由流量
上下文和问题
当客户端需要使用多个服务和/或多个服务实例时,必须在添加或移除服务时更新客户端。 请考虑以下方案。
- 多个不同的服务 - 一个电子商务应用程序可提供搜索、评价、购物车、结账和订单历史记录等服务。 每个服务都有一个客户端必须与之交互的不同 API,客户端必须了解每个终结点,以便连接到服务。 如果一个 API 发生变化,那么客户端也必须更新。 如果将一个服务重构为两个或多个单独的服务,则必须在服务和客户端中更改代码。
- 同一服务的多个实例 - 系统可能需要在同一区域或不同区域中运行同一服务的多个实例。 可运行多个实例来实现负载均衡或满足可用性要求。 每次启动或关闭实例来匹配需求时,都必须更新客户端。
- 同一服务的多个版本 - 作为部署策略的一部分,可与现有版本一起部署服务的新版本。 这称为蓝绿部署。 在这些情况下,每次路由到新版本和现有终结点的流量百分比发生变化时,都必须更新客户端。
解决方案
在一组应用程序、服务或部署前放置网关。 使用应用层 7 路由将请求路由到相应实例。
通过此模式,客户端应用程序只需了解单个终结点并与单个终结点通信。 下面说明了网关路由模式如何解决“上下文和问题”部分中概述的三种方案。
多个不同的服务
在客户端使用多个服务的情况下,网关路由模式非常有用。 如果服务被合并、分解或取代,客户端不一定需要更新。 它可以继续向网关发出请求,只有路由会更改。
使用网关,还可以从客户端提取后端服务,保持客户端调用的简单性,同时在网关后的后端服务中启用更改。 客户端调用可以被路由到任何需要处理预期的客户端行为的服务,无需更改客户端即可在网关后面添加、拆分和重组服务。
同一服务的多个实例
弹性是云计算的关键。 可启动服务来满足不断增长的需求,或在需求较低时关闭服务来节省成本。 注册和注销服务实例的复杂性封装在网关中。 客户端不知道服务数量的增减。
可在一个或多个区域部署服务实例。 Geode 模式详细介绍了多区域主动-主动部署如何降低延迟并提高服务的可用性。
同一服务的多个版本
可使用这种模式来进行部署,从而管理向用户推出更新的方式。 部署了新版本的服务后,它可以与现有版本并行部署。 通过路由,可以控制向客户端提供哪种版本的服务,能够灵活地使用各种发布策略,无论是递增、并行还是完整的推出更新都可以。 通过在网关上进行配置更改可以快速还原部署新服务后发现的任何问题,不会影响客户端。
问题和注意事项
- 网关服务可能会造成单一故障点。 请确保它设计合理,符合用户的可用性需求。 在实施中,请考虑复原能力和容错能力。
- 网关服务可能会造成瓶颈。 请确保网关有足够的性能来处理负载,并且可以根据增长预期轻松扩展。
- 对网关执行负载测试,确保不会对服务造成连锁故障。
- 网关路由是第 7 级。 它可以基于 IP、端口、标头或 URL。
- 网关服务可以是全局服务,也可以是区域服务。 Azure Front Door 是一个全局网关,而 Azure 应用程序网关是一个区域网关。 如果解决方案需要多区域部署服务,请使用全局网关。 如果你有需要精细控制流量均衡方式的区域工作负载,请考虑使用 应用程序网关。 例如,你想要均衡虚拟机之间的流量。
- 网关服务是放在它后面的服务的公共终结点。 请考虑使服务只能通过网关或专用虚拟网络访问来限制对后端服务的公用网络访问。
何时使用此模式
在以下情况下使用此模式:
- 客户端需要使用可在网关后访问的多个服务。
- 你希望通过使用单个终结点来简化客户端应用程序。
- 需要将请求从外部可寻址的终结点路由到内部虚拟终结点,例如对集群虚拟 IP 地址公开 VM 上的端口。
- 客户端需要使用在多个区域中运行的服务来获得延迟或可用性优势。
- 客户端需要使用数量不定的服务实例。
- 你想要实现一个部署策略,使客户端同时访问服务的多个版本。
当存在某个简单应用程序仅使用一两个服务时,此模式可能不适用。
工作负荷设计
架构师应评估如何在其工作负荷的设计中使用“网关路由模式”,以解决 Azure Well-Architected Framework 支柱中涵盖的目标和原则。 例如:
支柱 | 此模式如何支持支柱目标 |
---|---|
可靠性设计决策有助于工作负荷在发生故障后复原,并确保它在发生故障后恢复到正常运行状态。 | 网关路由支持仅将流量路由到系统中运行正常的节点。 - RE:05 冗余 - RE:10 运行状况监视 |
卓越运营有助于通过标准化流程和团队凝聚力来实现工作负荷质量。 | 使用网关路由可以将请求与后端分离,这反过来又使后端能够支持高级部署模型、平台转换,以及传输中域名解析和加密的单一管理点。 - OE:04 工具和流程 - OE:11 安全部署实践 |
性能效率通过在缩放、数据和代码方面进行优化, 帮助工作负载高效地满足需求。 | 使用网关路由可以在系统中的各个节点之间分配流量,以平衡负载。 - PE:05 缩放和分区 |
与任何设计决策一样,请考虑对可能采用此模式引入的其他支柱的目标进行权衡。
示例
使用 Nginx 作为路由器,以下为服务器的一个简单示例配置文件,将驻留在不同虚拟目录上的应用程序的请求路由到后端不同的计算机。
server {
listen 80;
server_name domain.com;
location /app1 {
proxy_pass http://10.0.3.10:80;
}
location /app2 {
proxy_pass http://10.0.3.20:80;
}
location /app3 {
proxy_pass http://10.0.3.30:80;
}
}
可使用以下 Azure 服务来实现网关路由模式:
- 应用程序网关实例,它提供区域第 7 层路由。
- Azure Front Door 实例,它提供全局第 7 层路由。