Java 蓝绿色部署,具有多个带内部调用的微服务

Java 蓝绿色部署,具有多个带内部调用的微服务,java,amazon-web-services,spring-boot,microservices,blue-green-deployment,Java,Amazon Web Services,Spring Boot,Microservices,Blue Green Deployment,我有8个spring boot micro服务,它们在内部相互调用。其他微服务的调用dns,在每个服务的application.properties文件中定义 假设微服务A由A->A.mydns.com和B->B.mydns.com等表示 因此,基本上每个微服务都由一个ELB和两个HA代理(分发)组成 在两个区域中)和4个应用服务器(分布在两个区域中) 目前,我正在创建新的绿色服务器(仅适用于应用服务器),并从HA代理级别切换实时流量。在这种情况下,虽然新版本的微服务正在测试中,但它也向实时客户

我有8个spring boot micro服务,它们在内部相互调用。其他微服务的调用dns,在每个服务的application.properties文件中定义

假设微服务A由A->A.mydns.com和B->B.mydns.com等表示

因此,基本上每个微服务都由一个ELB和两个HA代理(分发)组成 在两个区域中)和4个应用服务器(分布在两个区域中)

目前,我正在创建新的绿色服务器(仅适用于应用服务器),并从HA代理级别切换实时流量。在这种情况下,虽然新版本的微服务正在测试中,但它也向实时客户公开

理想情况下,方法应该是,为每个微服务创建整个服务器结构,包括ELB和HA代理,对吗?

但是为什么我要面对用测试dns来测试它的挑战呢。我可以将ELB映射到测试dns但是外部微服务dns如何硬编码在application.properties文件中?

在这种情况下,我应该采取什么方法

理想情况下,方法应该是,为每个微服务创建整个服务器结构,包括ELB和HA代理,对吗

这不一定是真的。部署(蓝绿色或金丝雀色,无论您的部署策略是什么)应该是针对其消费者的(在您的案例中是其他7个微服务)。这意味着,与其他服务交互的服务DNS名称(或IP)应该保持不变。IMHO,在部署微服务的情况下,你不应该考虑生态系统中的其他服务,只要你遵守你的合同;毕竟,这就是“微”服务的全部意义所在。正如其他SOer所指出的,如果您不能在不更改其他服务的情况下部署您的一个微服务,那么这不是一个微服务,它只是一个通过http进行讨论的整体

我建议你阅读这篇文章

我在这里引用相关部分

ELB后面有多个EC2实例 如果您是通过负载平衡器提供内容,那么 这项技术将不起作用,因为您无法将弹性IP与 厄尔布斯。在这个场景中,当前的蓝色环境是一个EC2池 实例和负载平衡器将请求路由到任何正常的 池中的实例。要在同一车辆后面执行蓝绿色切换 负载平衡器您需要用一组新的 包含新版本软件的EC2实例。有 有两种方法可以做到这一点——自动化一系列API调用或使用 自动缩放组

还有其他类似的创意方式

使用路由53的DNS重定向 而不是向用户公开弹性IP地址或长ELB主机名 用户,您可以拥有所有面向公众的URL的域名。 在AWS之外,您可以通过更改 DNS中的CNAME记录。在AWS中,您可以使用Route53实现相同的功能 结果。使用Route53,可以创建托管分区并定义资源 记录集,用于告诉域名系统如何为其路由流量 这个领域

回答另一个问题

但是,外部微服务dns是如何硬编码的呢 在application.properties文件中

若你们正在做这件事,我建议你们阅读关于这个应用的文章;尤其是那部分。如果您还没有查看服务发现选项,那么也应该查看服务发现选项


我有一种感觉,你们这里有的是一个意大利面,不是那么微小的服务。如果这是一个绿地项目,并且您的时间线预算允许,我建议您考虑将应用程序与其基础设施一起进行容器化(一个词:Dockerzing),并使用任何容器编排技术,如kubernetes、Docker swarm或AWS ECS(最简单的,前提是您已经在AWS陆地上),我知道这超出了这个问题的范围,只是一个建议。

我建议将您的微服务对接(使用spring boot轻松),然后将ECS(弹性容器服务)和ELB(弹性负载平衡器)与应用程序负载平衡器一起使用。(可以是内部的,也可以是面向互联网的)

然后,当您部署新版本时,ECS和ELB将利用您的微服务
/health
端点

然后,您可以在spring boot中实现一个更复杂的
HealthIndicator
,以确定应用程序是否健康(并因此准备好接收输入请求)。只有当新应用程序运行正常时,它才会投入使用,而旧应用程序才会进入睡眠状态


然后在
测试环境
上测试您的所有业务逻辑,由于Docker,您在所有环境上运行的映像完全相同,因此在部署到生产环境时不需要运行(任何)测试。(因为它已经过测试,如果它启动了,你就可以开始了)。

一般来说,对于B/G测试,你不会对新功能使用不同的dns,而是定义规则,例如每100个用户都会被发送到新功能,或者只有来自某个地区或办公室的IP才能访问新功能,等等

假设您使用的是AWS,您应该能够在ELBs前面为基于上下文的路由创建一个ALB,在该ALB中,您应该能够为到B或G的路由定义规则。在这种情况下,您必须单独运行环境(可能使用相同的DB)


对于更复杂的规则,您可以在spring boot应用程序中使用leanplum或omniture等工具。使用这种方法,您只有一个环境承载旧的和新的功能,稍后您将删除过时的代码

我个人会选择一条更简单的路线,使用绿色部署的测试DNS条目,然后在您完全验证后将其替换为实时DNS条目