Azure设计模式之网关路由模式
网关路由模式
使用单个端点将请求路由到多个服务。当希望在单个端点上公开多个服务并路由请求到相应服务时,此模式非常有用。
问题背景
当客户端需要使用多个服务时,为每个服务分别设置一个端点并让客户端管理每个端点的访问会很复杂。例如,电商应用可能会提供如搜索、审阅、购物车、结帐和订单历史等服务。每个服务都有一个与客户端交互的API,客户端必须知道具体端点(地址)才能连接到服务。如果API发生变化,客户端也必须随之更新。如果将服务重构为两个或多个单独的服务,则必须同时改服务和客户端的代码。
解决方案
在一组应用程序、服务前面放置一个网关。在应用程序层将请求路由到相关实例节点。
使用此模式时,客户端应用程序只需了解并与某端点通信。如果服务被整合或分解,则客户端并不一定需要更新。它可以继续向网关发出请求,只需要改路由。
网关还能帮助从客户端抽象出后端服务,使得网关后面的后端服务被更改的同时保持客户端调用的简单性。客户端调用可以被路由到处理客户端行为的任何服务,即在不更改客户端的情况下在网关后面进行添加、拆分和重组服务。
该模式还能够通过管理更新来简化部署。当部署新版本服务时,可以与现有版本并行部署。有了路由,就可以控制向客户端提供的服务版本,从而可以灵活地使用各种发布策略,无论是增量、并行还是完全更新。部署新服务后发现任何问题都可以通过在网关进行配置更改来快速还原,而不会影响到客户端。
问题和注意事项
网关服务可能会引入单点故障。需要在设计时考虑到可用性要求。在实现时,也要考虑恢复和容错能力。
网关服务可能会成为瓶颈。确保网关具有足够的性能来处理负载,并可以随压力增长自行扩展。
对网关执行负载测试,以确保不为服务带来级联失败。
网关的路由级别是7。在IP、端口、报头或 URL之上。
何时使用此模式
在以下情况下可使用此模式:
客户端需要访问多个服务,可将其部署在网关后方。
希望使用单个端点来简化客户端应用程序的调用。
需要将来自外部寻址端点的请求路由到内部虚拟端点, 例如将VM上的端口暴露为集群的虚拟IP地址。
当应用只使用了一个或两个服务时, 此模式可能不合适。
例子
本例使用Nginx作为路由器,下面是一个服务器的配置文件,它将在不同虚拟目录中应用程序的请求路由到不同计算机。
相关阅读
为前端创建专门的后端服务(https://docs.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends)
网关聚合模式( https://docs.microsoft.com/en-us/azure/architecture/patterns/gateway-aggregation)
网关卸载模式( https://docs.microsoft.com/en-us/azure/architecture/patterns/gateway-offloading)
使用单个端点将请求路由到多个服务。当希望在单个端点上公开多个服务并路由请求到相应服务时,此模式非常有用。
问题背景
当客户端需要使用多个服务时,为每个服务分别设置一个端点并让客户端管理每个端点的访问会很复杂。例如,电商应用可能会提供如搜索、审阅、购物车、结帐和订单历史等服务。每个服务都有一个与客户端交互的API,客户端必须知道具体端点(地址)才能连接到服务。如果API发生变化,客户端也必须随之更新。如果将服务重构为两个或多个单独的服务,则必须同时改服务和客户端的代码。
解决方案
在一组应用程序、服务前面放置一个网关。在应用程序层将请求路由到相关实例节点。
使用此模式时,客户端应用程序只需了解并与某端点通信。如果服务被整合或分解,则客户端并不一定需要更新。它可以继续向网关发出请求,只需要改路由。
网关还能帮助从客户端抽象出后端服务,使得网关后面的后端服务被更改的同时保持客户端调用的简单性。客户端调用可以被路由到处理客户端行为的任何服务,即在不更改客户端的情况下在网关后面进行添加、拆分和重组服务。
该模式还能够通过管理更新来简化部署。当部署新版本服务时,可以与现有版本并行部署。有了路由,就可以控制向客户端提供的服务版本,从而可以灵活地使用各种发布策略,无论是增量、并行还是完全更新。部署新服务后发现任何问题都可以通过在网关进行配置更改来快速还原,而不会影响到客户端。
问题和注意事项
网关服务可能会引入单点故障。需要在设计时考虑到可用性要求。在实现时,也要考虑恢复和容错能力。
网关服务可能会成为瓶颈。确保网关具有足够的性能来处理负载,并可以随压力增长自行扩展。
对网关执行负载测试,以确保不为服务带来级联失败。
网关的路由级别是7。在IP、端口、报头或 URL之上。
何时使用此模式
在以下情况下可使用此模式:
客户端需要访问多个服务,可将其部署在网关后方。
希望使用单个端点来简化客户端应用程序的调用。
需要将来自外部寻址端点的请求路由到内部虚拟端点, 例如将VM上的端口暴露为集群的虚拟IP地址。
当应用只使用了一个或两个服务时, 此模式可能不合适。
例子
本例使用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;
}
}
相关阅读
为前端创建专门的后端服务(https://docs.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends)
网关聚合模式( https://docs.microsoft.com/en-us/azure/architecture/patterns/gateway-aggregation)
网关卸载模式( https://docs.microsoft.com/en-us/azure/architecture/patterns/gateway-offloading)