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

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

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

二、现代应用发布有哪些模式?
  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等进行数据迁移同步,保证底层数据的一致性,从而可以进行比较全面的灰度发布验证。

相关文章
|
测试技术 应用服务中间件 数据库
灰度发布的系统架构设计
互联网产品需要快速迭代开发上线,又要保证质量,保证刚上线的系统,一旦出现问题可以很快控制影响面,就需要设计一套灰度发布系统。
灰度发布的系统架构设计
|
1月前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
13天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
22天前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
35 3
|
1月前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
12天前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
117 68
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
14天前
|
设计模式 负载均衡 监控
探索微服务架构下的API网关设计
在微服务的大潮中,API网关如同一座桥梁,连接着服务的提供者与消费者。本文将深入探讨API网关的核心功能、设计原则及实现策略,旨在为读者揭示如何构建一个高效、可靠的API网关。通过分析API网关在微服务架构中的作用和挑战,我们将了解到,一个优秀的API网关不仅要处理服务路由、负载均衡、认证授权等基础问题,还需考虑如何提升系统的可扩展性、安全性和可维护性。文章最后将提供实用的代码示例,帮助读者更好地理解和应用API网关的设计概念。
45 8
|
1月前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
48 1
服务架构的演进:从单体到微服务的探索之旅
|
19天前
|
消息中间件 运维 Kubernetes
后端架构演进:从单体到微服务####
本文将探讨后端架构的演变过程,重点分析从传统的单体架构向现代微服务架构的转变。通过实际案例和理论解析,揭示这一转变背后的技术驱动力、挑战及最佳实践。文章还将讨论在采用微服务架构时需考虑的关键因素,包括服务划分、通信机制、数据管理以及部署策略,旨在为读者提供一个全面的架构转型视角。 ####
31 1
|
21天前
|
弹性计算 运维 开发者
后端架构优化:微服务与容器化的协同进化
在现代软件开发中,后端架构的优化是提高系统性能和可维护性的关键。本文探讨了微服务架构与容器化技术如何相辅相成,共同推动后端系统的高效运行。通过分析两者的优势和挑战,我们提出了一系列最佳实践策略,旨在帮助开发者构建更加灵活、可扩展的后端服务。