20

在我们使用 Spring Cloud 开发微服务期间,我们开始使用 Zuul 作为从外部到微服务的任何连接的代理,以及任何需要联系另一个微服务的微服务。

一段时间后,我们得出结论,Zuul 被设计为边缘服务(仅代理从外部到微服务的流量),不应该用于微服务间的通信。尤其是 Spring Cloud 推荐使用 eureka 与另一个服务建立直接(潜在的负载平衡)连接的方式,使我们反对在一切之间使用 Zuul。

当然,一切都按预期运行良好(就像使用 Spring Cloud 一样),但我们对如何使用此设置执行某个用例一无所知。

在部署新版本的微服务时,我们希望对旧版本和新版本进行蓝/绿部署。但是,由于微服务之间没有 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 实例是此类部署的最佳解决方案?

任何反馈将不胜感激。

亲切的问候,安德烈亚斯

4

1 回答 1

6

通过在元数据中设置版本号,您可以轻松地使您的 Svc1 获取最新版本的 Svc2,即始终获取具有最新版本号的实例。请参阅此要点作为指南。

于 2015-07-17T15:21:05.050 回答