如何在生产中为基于微服务的应用程序部署多个版本的应用程序

How to deploy multiple version of an application in production for microservice based application


是否可以同时在生产中部署多个版本的服务。根据我的假设,这应该是基于 microservice/api 的项目或移动项目的常见模式。我想知道你是怎么做到的,以及行业中针对此类问题的常见模式是什么。如果您的回答围绕 AWS 环境或 Kubernetes 环境进行,那将很有帮助。
提前致谢。

假设您通过 HTTP REST API 公开服务,一般标准是始终将您的服务 URL 与版本作为基线。

例如,

/v1/account/getUserInfo

如果您需要发布新版本,请公开它:

/v2/account/getUserInfo

其中 v2 可以 运行 跨越代码库的不同分支。

Is it possible to have multiple versions of service(s) deployed in production at the same time

是的,这是可能的。这个想法是让所有 used 微服务同时在生产环境中(v1、v2 ...)并关闭不再使用的版本。为此,您应该以某种方式知道某个版本何时不再使用。

据我所知,你必须选择:

  1. 对于每个新版本,您都会创建一个连接到相同(现已升级)微服务的新端点(如 /v2/someApiCall),并逐渐指示客户端使用新端点;当不再使用旧端点时,您将其删除;这是首选方式。

  2. 对于每个新版本,您都会创建一个与旧微服务共享相同持久性的新微服务;您应该避免使用此解决方案; Netflix在罕见情况下使用这种策略,因为更换老消费者的成本太高。

您可以在 Building microservices by Sam Newman 的第 62 页阅读更多内容。

使用 AWS API 网关,您可以部署多个版本的代码并从映射模板在它们之间切换,如 here. You might also want to look into stage variables 所述。

我已经写了关于此的博文:Multi-version Service Discovery using Spring Cloud Netflix Eureka and Ribbon,但主要关注 Spring Cloud Netflix 组件/库。

但我们的想法是在新主机/VPS/容器中部署新版本的工件/二进制文件,并让服务注册到注册服务器(Eureka、Consul、....)并包含有关它支持的 API 版本(v1、v2、...)的元数据。客户端应用程序会发现哪个主机/容器/...提供所需的 API 版本。