搭建具备灰度发布能力的技术架构

简介: 随着微服务架构的普及,服务数量激增,版本更新频繁,如果缺少灰度的能力,容易对现有的生产运行业务造成影响,并且新上线的系统和功能也需要灰度的能力来验证可行性和效果,简而言之,无论是对于系统运行稳定安全还是对于验证业务效果,灰度发布/验证的能力都是现代软件架构所必须的。本文讨论并建议了几种灰度发布的实现机制。
一、为什么需要具备灰度发布能力?

随着微服务架构的普及,服务数量激增,版本更新频繁,如果缺少灰度的能力,容易对现有的生产运行业务造成影响,并且新上线的系统和功能也需要灰度的能力来验证可行性和效果,简而言之,无论是对于系统运行稳定安全还是对于验证业务效果,灰度发布/验证的能力都是现代软件架构所必须的。

二、现代应用发布有哪些模式?
  1. 蓝绿发布
  • 定义
    蓝绿发布,是在生产环境稳定集群之外,额外部署一个与稳定集群规模相同的新集群,并通过流量控制,逐步引入流量至新集群直至100%,原先稳定集群将与新集群同时保持在线一段时间,期间发生任何异常,可立刻将所有流量切回至原稳定集群,实现快速回滚。直到全部验证成功后,下线旧集群,流量全部切换到新的集群。
  • 优点
    老版本应用不需要停机,可以实现快速回退。
  • 缺点
    需要两倍的机器资源用于部署相同规模的集群。
  1. 滚动发布
  • 定义
    取出应用集群中的一个或者多个应用实例停止服务并进行新版本的更新,然后将新版本投入使用,通过逐个替换实例来逐步部署新版本的应用,直到所有实例都被替换完成为止。例如第一批次10%的实例更新版本,第二批次30%的实例更新版本,最后一批次60%的实例更新版本。一般来说前面的批次需要比较长的验证时间,在验证通过风险降低以后逐步放大更新的比例。滚动发布期间,新旧版本共存。
  • 优点
    用户体验平滑、自动化程度高,无需额外的资源投入。
  • 缺点
    由于滚动更新的过程一般分成多个批次,需要等待验证的时间间隔较长,发布和回退的时间比较长;按照批次更新,需要平滑的流量过度机制,发布工具复杂。
  1. 灰度发布
  • 定义
    灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。与蓝绿发布有明显区别的是蓝绿发布需要两倍的机器资源,其主要目的在于安全的发布应用,而灰度发布的目的在于小流量的测试来获得一定的验证结论。
    金丝雀发布名称的由来:17世纪,英国矿井工人发现金丝雀对于瓦斯十分敏感,于是下井时都会带上一只金丝雀作为瓦斯危险程度的提示指标。
    一般情况下,灰度发布是额外部署一个金丝雀的服务实例为新版本,如果验证金丝雀实例验证通过,则一次性更新其他的版本,发布期间新旧版本共存。
    灰度发布.png
  • 优点
    部署新的金丝雀版本进行验证,对于用户体验影响较小,只影响灰度部分的用户流量,资源的损耗比较小。
  • 缺点
    占用少量的资源。
三、前端应用的灰度发布
  1. 使用nginx upstram或者split_clients使用nginx upstram模块或者或者split_clients模块实现前端应用按照一定的比例进行分流,从而实现灰度,具体可以参考文章:《使用nginx split_clients实现AB测试》。
  • 优点
    路由配置简单,不引入新的组件。
  • 缺点
    配置不够灵活,逐步调整灰度的比例时需要人工介入,分流和发布流程割裂。
  1. 开源组件ABTestingGatewayABTestingGateway 是一个可以动态设置分流策略的灰度发布系统,工作在7层负载,基于nginxngx-lua 开发,使用 redis 作为分流策略数据库,可以实现动态分流调度功能。

ABTestingGateway.png

  • 优点:
  • 支持多种分流方式,目前包括iprange、uidrange、uid尾数和指定uid分流
  • 动态设置分流策略,即时生效,无需重启
  • 可扩展性,提供了开发框架,开发者可以灵活添加新的分流方式,实现二次开发
  • 高性能,压测数据接近原生nginx转发
  • 灰度系统配置写在nginx配置文件中,有页面可以方便管理员配置
  • 适用于多种场景:灰度发布、AB测试和负载均衡等
  • 缺点:
  • 引入了新的组件,包括nginx-lua和redis,架构变得复杂,维护起来比较困难。
  • 分流和发布流程割裂。
  1. 由服务端进行灰度决策返回前端资源灰度策略保存在服务后端,每次请求发往后端,由后端应用根据策略决策返回不同版本的对应的前端资源,这种方式需要独立开发后端的策略配置服务,并且前后端耦合比较高。
  • 优点
    可以比较灵活的配置,可以配置多版本并行。
  • 缺点
  • 不适用于前后端分离的应用
  • 分流和发布流程割裂。
四、后端应用的灰度发布
  1. 使用nginx upstram或者split_clients
    同前端应用分流类似,可以使用nginx的负载均衡或者客户端分流模块进行分流。
  2. 使用API网关实现灰度
    可以在API网关编写filter,在filter中根据一定的策略进行分流转发,例如根据用户id、根据请求头参数、url参数等,在spring cloud体系中一般是基于ribbon进行转发。
  3. Spring Cloud Gray组件
    Spring Cloud Gray 是一套开源的微服务灰度路由解决方案,是面向于spring cloud体系架构的,它抽象出了spring-cloud-gray-webui提供策略配置页面,spring-cloud-gray-server负责灰度决策、灰度追踪等信息的管理以及持久化,spring-cloud-gray-client定义了一套灰度路由决策模型,灰度信息追踪模型,以及和spring-cloud-gray-server的基本通信功能。
    spring cloud gray组件既可以支持灰度发布,还可以支持蓝绿发布。
    gray.png
    整体架构如上所示,webui提供策略配置,client端从admin获取灰度策略,从注册中心获取到所有的服务实例,根据灰度策略进行灰度分流。

gray-all.png

spring cloud gray类似的方案整体比较完善,有对应的平台可以进行方便的操作,也支持比较细力度的灰度流程,需要比较关注的是引入了一整套的灰度发布的平台,需要多出额外的维护成本,并且一般情况下公司内部都会有自己的发布系统,比较难直接引入在发布流程中使用,这也是上面一直提到的发布和灰度流程割裂的情况,从组件不耦合的角度来看,灰度组件独立是很好的,但也有不少的公司是希望能够结合发布系统在统一的流程管理里面去实现灰度的发布和验证,这也是比较好理解的。针对这种情况建议有条件的可以根据spring cloud gray的实现方案进行内部开发。

五、预发布/沙箱灰度发布

以上的各类方案都是针对前端、后端应用的单独灰度发布方案,在底层数据库结构变更等场景下也不适用,无法实现全流程的灰度,在有条件的情况下,建议搭建独立预发布/沙箱环境,从前端入口、静态资源、后端应用、数据库等全面部署一整套全新的环境,此环境数据库可以通过一些数据库迁移工具如canal等进行数据迁移同步,保证底层数据的一致性,从而可以进行比较全面的灰度发布验证。

相关文章
|
测试技术 应用服务中间件 数据库
灰度发布的系统架构设计
互联网产品需要快速迭代开发上线,又要保证质量,保证刚上线的系统,一旦出现问题可以很快控制影响面,就需要设计一套灰度发布系统。
灰度发布的系统架构设计
|
8天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
1月前
|
缓存 监控 API
探索微服务架构中的API网关模式
【10月更文挑战第5天】随着微服务架构的兴起,企业纷纷采用这一模式构建复杂应用。在这种架构下,应用被拆分成若干小型、独立的服务,每个服务围绕特定业务功能构建并通过HTTP协议协作。随着服务数量增加,统一管理这些服务间的交互变得至关重要。API网关作为微服务架构的关键组件,承担起路由请求、聚合数据、处理认证与授权等功能。本文通过一个在线零售平台的具体案例,探讨API网关的优势及其实现细节,展示其在简化客户端集成、提升安全性和性能方面的关键作用。
70 2
|
1月前
|
存储 缓存 监控
探索微服务架构中的API网关模式
【10月更文挑战第1天】探索微服务架构中的API网关模式
85 2
|
5天前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;
|
7天前
|
缓存 监控 API
探索微服务架构中的API网关模式
随着微服务架构的兴起,API网关成为管理和服务间交互的关键组件。本文通过在线零售公司的案例,探讨了API网关在路由管理、认证授权、限流缓存、日志监控和协议转换等方面的优势,并详细介绍了使用Kong实现API网关的具体步骤。
24 3
|
8天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
43 4
|
7天前
|
存储 缓存 监控
探索微服务架构中的API网关模式
探索微服务架构中的API网关模式
22 2
|
7天前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
35 1
|
14天前
|
监控 Cloud Native Java
云原生架构下微服务治理策略与实践####
【10月更文挑战第20天】 本文深入探讨了云原生环境下微服务架构的治理策略,通过分析当前技术趋势与挑战,提出了一系列高效、可扩展的微服务治理最佳实践方案。不同于传统摘要概述内容要点,本部分直接聚焦于治理核心——如何在动态多变的分布式系统中实现服务的自动发现、配置管理、流量控制及故障恢复,旨在为开发者提供一套系统性的方法论,助力企业在云端构建更加健壮、灵活的应用程序。 ####
61 10
下一篇
无影云桌面