什么是同时部署多个微服务的最佳实践?

时间:2018-04-18 04:00:43

标签: amazon-web-services elastic-beanstalk microservices continuous-deployment

如果存在影响多个服务的更改,我一直在努力同时部署多个微服务的最佳方式。

虽然我对任何一般方法感兴趣,但让我提供一个我正在遇到的具体例子。

我们公司使用AWS和Elastic Beanstalk为相对分离的网站部署微服务容器。现在我们的网络应用程序包括:

  • 以Angular编写的SPA,在S3存储桶中部署和托管(Call 它SPA)

  • 一个webapi服务,用.NET Core编写,dockerized并部署到 一个弹性的beanstalk应用程序(称之为WebAPI)

  • 集成服务,用Node.JS编写,已经过dockerized和部署 到弹性beanstalk应用程序(将其称为IntService)

SPA和WebAPI通过REST API进行通话

WebAPI和IntService松散耦合,并通过AWS SQS队列相互通信。

如果我们对这些服务中的任何一个进行了更改,我们的部署过程相当简单。例如,如果我们对WebAPI进行了更改,我们会启动一个新的弹性beanstalk应用程序环境,在那里进行部署,然后交换URL(基本的蓝绿色部署)。

但是,如果有影响多项服务的变更,我正在努力采用正确的方法。例如,假设有一项功能需要更改WebAPI和IntService。由于每个都在他们自己的回购中,他们每个都有自己的CI和CD管道彼此独立。

如果只部署了一个服务,整个应用程序可能会中断。人们如何处理这种类型的部署?您是否克隆了WebAPI和IntService环境,部署它们,然后交换两个URL,只是确保您几乎同时执行它以最小化只有一个服务处于活动状态的时间窗口?

或者,我们正在考虑使用API​​网关。但这是否意味着我们每次要部署时都会创建一个新的API网关阶段?如果我们这样做,蓝色部署“交换”实际上是否在API网关中发生?

很抱歉,如果这令人困惑,但我只是试图绕过我想象的微服务相当普遍的问题。

1 个答案:

答案 0 :(得分:1)

这就是我所说的在汽车行驶时更换车轮。

微服务的重点是让它们分离,这样你就可以自己发布任何给定的部分。

因此,您必须进行向后兼容的增量更改。

这与您更改数据库的方式类似。假设您要删除布尔列并将其替换为en enum。你这样做不是通过一次更改数据库和所有代码,因为这不仅会导致部署问题,而且如果出现问题并且你必须回滚会怎样?相反,您最好先添加新列,然后更改一些代码以开始写入两列,然后更改所有使用者,最后删除旧列。每个都是独立的,独立的,向后兼容的变化。

简而言之,我怀疑有一些神奇的部署方法可以用来同时部署多个具有依赖关系的独立系统(至少在没有接受停机时间的情况下)。

解决方案是将更改分解为在向后兼容的小型更改中进行细分,直到完成并最终清理/删除旧代码。

这个BTW,是系统积累技术债务的原因。随着时间的推移和系统的复杂性增加,主要的升级可能难以分解和实施,所以你不得不做出妥协,需要时间来清理。

无论如何,也许其他人可以描述一些黑魔法,但正如我所说,这不是部署问题,而是架构问题。

希望有所帮助