【发布时间】:2015-09-27 13:46:15
【问题描述】:
在我们使用 Spring Cloud 开发微服务期间,我们开始使用 Zuul 作为从外部到微服务的任何连接以及任何需要联系另一个微服务的微服务的代理。
一段时间后,我们得出结论,Zuul 被设计为边缘服务(仅代理从外部到微服务的流量),不应该用于微服务间的通信。尤其是 Spring Cloud 推荐使用 eureka 与另一个服务建立直接(潜在负载平衡)连接的方式,让我们反对在所有事情之间使用 Zuul。
当然,一切都按预期运行良好(就像使用 Spring Cloud 一样),但我们对如何使用此设置执行特定用例一无所知。
在部署新版本的微服务时,我们希望有一个 blue/green deployment 与旧版本和新版本。 但是,由于微服务之间没有 Zuul,两个独立服务之间的通信将继续使用旧版本,直到它从 eureka 中删除。
我们正在考虑如何实现这一目标。在下图中,我绘制了我认为可能的选项。
在图片的第一部分,Zuul 调用 eureka 获取注册中心来创建路由。服务 1 也在调用 eureka 让注册中心路由到服务 2。由于服务 2 在 eureka 注册中心中,所以路由成功。
在图片的第二部分,部署了服务2(服务2.1)的更新。它也向 eureka 注册,这使得服务 1 现在路由到服务 2 和服务 2.1。蓝/绿部署不希望这样做。
在第三部分中,展示了针对此问题的潜在解决方案,并为此目的部署了另一个 eureka 实例。此实例不支持对等,并且不会与第一个 eureka 实例同步。与第一个实例相反,这个实例的唯一目的是促进蓝/绿部署。服务 2.1 向第二个 eureka 实例注册,服务 1 的配置被更改为不是从第一个而是从第二个 eureka 实例获取其注册表。
我们面临的主要问题是这是否是一个可行的解决方案。拥有 Zuul 路由的灵活性是我们在这种情况下没有的一大优势。我们应该回到通过 Zuul 路由每个服务到服务的调用,还是有另一种更合适的解决方案(可能是某种功能区配置)?还是第二个 eureka 实例是此类部署的最佳解决方案?
任何反馈都将不胜感激。
亲切的问候, 安德烈亚斯
【问题讨论】:
-
精彩的问题和图表。你是对的,zuul 是一个边缘网关。这是我们正在研究的事情。 Netflix 使用 Asgaard 和 AWS Auto Scale Groups 进行部署。我的第一个想法是在 eureka 中升级新版本但
OUT_OF_SERVICE,然后同时将旧版本OUT_OF_SERVICE和新版本标记为UP。可以使用 spring cloud bus 来设置状态。期待更多的跟进。 -
我们不能使用实例元数据吗?它们可以在服务注册后从 Eureka 服务器动态更改(请参阅github.com/Netflix/eureka/wiki/Eureka-REST-operations - 更新元数据)。然后我们可以根据这些信息制作从 Eureka 获得的 Ribbon 过滤器实例。
标签: spring-cloud microservices netflix-eureka netflix-zuul blue-green-deployment