【问题标题】:How to route in between microservices using Spring Cloud & Netflix OSS如何使用 Spring Cloud 和 Netflix OSS 在微服务之间进行路由
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 谢谢!这帮助我解决了 Netflix 堆栈的其他一些问题。在某些地方,缺少文档。像这样的要点很有帮助。
  • 我不想打破咒语,但这对我来说似乎是一个重大的黑客攻击。如果出现问题,我们将如何回滚到以前的版本?
猜你喜欢
  • 2017-02-03
  • 1970-01-01
  • 2017-07-07
  • 2015-07-20
  • 1970-01-01
  • 2019-03-26
  • 2019-09-11
  • 1970-01-01
  • 2018-11-03
相关资源
最近更新 更多