网关路由模式
使用一个端点将请求按照路由分发到多个服务上去。该模式用于希望将多个服务通过一个单独的端点暴露出去,并将请求按路由分发给适当的服务时。
背景与问题
当客户端需要消费多个服务时,为每个服务建一个单独的端点并由客户端去管理每个端点是非常有挑战性的。例如,某个电子商务应用可能会提供多个服务,如搜索、评论、购物车、付款和订单历史等。
每个服务都有不同的API,客户端需要与之交互,客户端必须知道每个端点才能连接到服务。如果某个端点修改或更新了,客户端也得跟着更新。如果将某个服务重构为两个或多个独立服务,代码就必须同时在服务端和客户端作出修改。
解决方案
在一组应用、服务或部署程序前面放一个网关。使用第7层应用路由将请求按路由发送给适当的实例。
使用该模式,客户端应用只需知道一个单独的端点并与之通信。如果服务被合并或分解,客户端并不需要随之更新。客户端仍然可以继续向网关发送请求,只有路由发生了变化。
网关还能让你从客户端的角度对后端服务进行抽象,允许你在保持客户端调用简单的情况下同时允许网关后面的后端服务发生变更。客户端调用可以被路由给任何一个或几个需要处理期望的客户端行为的服务,允许你添加、拆分和重新组织网关后面的服务,而不需修改客户端。
该模式对部署也有帮助,允许你管理更新是如何推出给用户的。当你的服务的某个新版本被部署后,还可以并行地部署旧版本的服务。你可以通过路由控制将哪个版本的服务展示给用户,这给予你使用不同发布策略的灵活性,是否增量、并行或全部发布。新服务部署后所发现的任何问题都可以被快速回滚,只需要在网关上修改配置即可,而不会影响到客户端。
问题与注意事项
- 网关服务可能会引入单点故障。确保在设计时就考虑到可用性需求。在实现时考虑可恢复性与故障容错能力。
- 网关服务可能会成为瓶颈。确保网关具有足够的性能以处理负载,并能够容易随着预期增长一致扩展。
- 对网关进行负载测试,以确保你不会为服务引入级联性故障。
- 网关路由位于第7层。可以基于IP、端口、header或URL来实现。
何时使用该模式
在以下场景使用该模式:
- 一个客户端需要消费可以通过网关访问的多个服务时。
- 希望通过使用单一端点来简化客户端应用。
- 需要将请求通过路由从外部可寻址的端点分发给内部的虚拟端点,比如在虚拟机上暴露出一些端口指向集群的虚拟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;
}
}