单体应用下的服务发布
在单体服务架构中,服务一般划分为前端、接入网关、后端逻辑层、数据存储层;其中逻辑层一般只包括少量服务,业务的迭代也主要集中在这一层。
单体应用发布时一般在网关处做流量控制,基于蓝绿或者金丝雀等发布策略实现应用的发布,
在蓝绿发布中,有两个环境同时存在:蓝色环境和绿色环境,它们分别代表了旧版本和新版本的应用程序
-
蓝色环境(Blue Environment): 蓝色环境是当前稳定版本的应用程序所在的环境。在此环境中,用户流量正常运行,并且应用程序稳定运行。
-
绿色环境(Green Environment): 绿色环境是新版本的应用程序所在的环境。在绿色环境中,新版本的应用程序已经部署并准备好接受流量。然而,在初始阶段,绿色环境中的应用程序不会接收任何用户流量。
-
切换流量: 在蓝绿发布的核心部分,将流量从蓝色环境切换到绿色环境。这通过在接入网关的配置来实现。切换后,用户流量开始流向绿色环境,他们开始使用新版本的应用程序。
-
验证和测试: 在绿色环境中,您可以进行必要的验证和测试,确保新版本的应用程序在生产环境中正常工作。这可以包括性能测试、安全性测试和用户体验测试。
-
回滚和切换: 如果在绿色环境中发现问题,您可以随时切换回蓝色环境,恢复到之前的稳定版本。这种能力使得您能够在出现问题时快速回滚,降低风险。
-
平滑过渡: 一旦在绿色环境中确认新版本没有问题,您可以逐步增加绿色环境的流量份额,同时减少蓝色环境的流量。这样,用户会逐渐过渡到新版本,而不会在短时间内面临大规模的变化。
-
完全切换: 最终,当绿色环境的流量份额增加到足够高的程度,且您对新版本的可靠性和性能充满信心时,您可以完全切换到绿色环境,停用蓝色环境。
除了蓝绿发布之外,还有金丝雀发布策略,通过选择小部分用户将流量切换到新的版本,测试新版本的稳定性、性能和用户体验。这种策略主要包括以下步骤:
-
选择目标用户群: 金丝雀发布的第一步是选择一小部分用户或用户群体作为目标。这可以是特定的用户组、少量特权用户或者随机选择的一小部分用户。
-
新版本引入: 新版本的应用程序或功能会在这个目标用户群中进行部署和启用。这些用户会开始使用新版本,而其他用户仍然使用旧版本。
-
监测和评估: 在金丝雀发布期间,您应该密切监测新版本的性能、稳定性和用户体验。这可以包括指标如响应时间、错误率、页面加载时间等。
-
逐步扩展: 如果新版本在目标用户群中表现良好,您可以逐步扩大金丝雀发布的范围,将更多的用户引入新版本。这可以通过逐步增加新版本的用户比例来实现。
-
回滚策略: 如果在金丝雀发布过程中发现问题,以迅速将受影响的用户切换回旧版本。这是确保系统稳定性的重要一环。
-
用户反馈: 您可以收集来自金丝雀用户的反馈,了解他们对新版本的感受。这些反馈可以帮助您做出调整和改进。
-
全面发布或回滚: 最终,如果新版本在金丝雀发布阶段表现良好,您可以考虑将新版本推广到所有用户。或者,如果问题无法解决,您可以回滚到旧版本。
微服务架构下的灰度发布
微服务架构下,单体服务被拆分为多个微服务,一个版本迭代中可能对多个服务同时发布,此时的灰度策略跟单体服务有几个不同:
1. 除了需要在网关处做灰度策略,还需要在微服务调用之间实现灰度
2. 微服务之间的调用灰度实现方式问题,可以基于注册中心+服务发现SDK方式,也可以基于代理(中心代理或者sidecar代理)方式,本文以代理方式为例说明
3. 微服务调用链路的灰度方式要统一,主要是统一按照相同的标识做灰度策略,比如特定的请求头部
组件说明
1. 服务治理控制面用于实现灰度策略配置管理、下发
2. 接入网关负责流量接入,并且将请求分发到第一跳微服务;接收控制面下发的策略
3. 中心网关负责微服务内部调用的转发和灰度策略执行;接收控制面下发的策略
要实现微服务架构下的全链路灰度,我们首先考虑全链路要基于相同的灰度标识做流量策略,比如可以基于同一个请求头部
1. 在接入网关层,基于请求头部配置路由策略到第一跳微服务
2. 在微服务内部,同样基于请求头部配置路由策略,策略执行是在中心网关处
3. 调用链路内需要透传路由标识,该功能可以基于链路追踪实现;一般情况下链路追踪的实现都要求在链路内透传请求的traceid,我们基于链路追踪提供的机制,同时透传路由标识,这样可以在微服务之间的每一跳都使用相同的标识进行路由控制