从Google线上故障,谈灰度发布的重要性

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本文介绍配置灰度发布的多种方案,包括基于IP、设备、标签、流量比例、区域及时段等策略,并重点解析Nacos支持的IP和标签灰度能力。通过注册配置中心如Nacos或Apollo,结合标签、命名空间实现安全发布,建议复杂场景在Nacos基础上二次开发扩展。


○ IP 地址灰度:基于服务实例 IP 地址进行灰度发布
○ 设备特征灰度:根据设备类型(如 iOS/Android)进行灰度
● 基于规则的灰度发布
○ 白名单/黑名单:通过维护特定名单控制配置应用范围
○ 标签灰度:给服务实例添加标签,根据标签决定配置版本
○ 业务规则灰度:基于业务场景或特定条件进行灰度
● 基于流量的灰度发布
○ 比例灰度:按照一定比例的流量应用新配置
○ 区域灰度:根据地理位置或区域进行灰度发布
○ 时间窗口灰度:在特定时间段内进行灰度发布
● 基于架构的灰度发布
○ 服务网格灰度:利用服务网格技术控制配置分发
○ 网关灰度:在 API 网关层面实现配置灰度
○ 配置中心灰度:通过配置中心直接控制配置分发

业务做配置灰度有哪些方案

基于注册配置中心的配置灰度发布能力

目前业界主流的配置中心有 Nacos、Apollo、Disconf、ETCD 等,其中支持配置灰度发布的主要有 Nacos 和 Apollo。

Nacos 目前支持两种灰度方式,基于 IP 灰度和基于标签灰度,支持某个版本的配置只对某些监听者生效。此外,用户还可在 Nacos 标签灰度的基础上扩展 SPI,以贴合自己的业务场景,比如实现设置多值标签、自定义应用标签 SPI、多版本并行灰度等。

Apollo 的配置灰度发布能力相对简单一些,仅支持基于 IP 的灰度能力,也能基于注册配置中心的能力做二次开发扩展自定义配置灰度发布。

基于注册配置中心的能力做二次开发扩展自定义配置灰度发布

对于业务复杂的用户,有复杂的灰度场景,可能需要基于配置中心的基本能力做二次开发。比如阿里巴巴集团基于 Nacos 开发了基于单元/机房的灰度、基于用户 ID 的灰度等功能。

业务自研产品支持配置灰度发布

对于少数业务非常复杂的用户,市场上的配置中心无法满足需求,则需要自研相关方案,比如运行环境很特殊的场景。

对于大多数用户来说,方案一采用 Nacos 或 Apollo 基本能满足配置灰度的需求。少部分用户可能需要基于配置中心做二次开发,建议在 Nacos 的标签灰度之上开发更复杂的方案。

如何基于 Nacos 实现配置灰度

Nacos 配置灰度介绍

Nacos 作为一个动态服务发现、配置管理和服务管理平台,提供了强大的配置灰度发布功能,帮助开发者安全地进行配置变更。本节将介绍 Nacos 配置灰度发布的基本概念、功能特性和使用场景。

Nacos 配置灰度发布的核心功能

● 基于 IP 的灰度发布:通过指定服务实例的 IP 地址,将新配置仅推送到特定的服务实例,其余实例保持原有配置不变。
● 基于应用标签的灰度发布:通过为服务实例添加标签,根据标签属性决定配置的推送范围,支持更灵活的灰度策略。
● 命名空间隔离:利用 Nacos 的命名空间(Namespace)机制,创建独立的灰度环境,与生产环境完全隔离。
● 配置标识区分:通过在 dataId 或 group 中添加特定标识,区分灰度配置和正式配置,便于管理和追踪。

image.png

使用 MSE Nacos 进行配置灰度发布

上一节讲述了 Nacos 配置灰度的核心能力,本节讲述基于 IP 的灰度发布和基于标签灰度的具体用法
基于 IP 的灰度发布

基于 IP 的灰度发布是一种基础的灰度方式,可以通过选择 IP 地址列表来确定需要灰度的机器,在一些小型业务系统中,这种方式可以满足灰度的需求,能够大大降低配置推送的风险,减少因配置出错导致的故障。

  1. 登录 MSE 注册配置中心管理控制台,并在顶部菜单栏选择地域,选择目标 Nacos 实例;
    https://mse.console.aliyun.com/
  2. 在目标配置的操作列单击编辑。在编辑配置面板,发布方式选择基于 IP 灰度发布。
    image.png

  3. 单击应用节点 IP 输入框,在 IP 地址列表中选择待灰度推送的 IP 地址。您也可以选择手动输入 IP 地址,手动输入支持 IP 地址补全。
    image.png

  4. 修改完配置后,单击发布灰度。在配置内容对比对话框中确认当前正式版本内容和本次发布内容,然后单击发布。

image.png

基于标签的灰度发布
为了解决基于 IP 灰度的局限性,MSE Nacos 对灰度发布进行了功能升级,支持了自定义标签灰度的能力,结合原先的 IP 灰度,可以给业务提供更加灵活更加易用的灰度发布能力,为业务稳定性保驾护航。

自定义标签灰度允许应用侧根据其实际场景给不同的节点设置不同的标签,比如给节点设置应用,机房,环境等标签,比如在阿里集团内部,同一个应用在线下环境中有不同的项目开发分支,就给对应的开发分支部署的节点打上项目分支的标签,借助标签灰度的能力实现不同的项目环境下发不同的配置内容。
image.png

在 MSE Nacos 2.2.3.3 及以上版本中,支持基于应用标签灰度的方式进行灰度发布,您可以在客户端对应用节点进行标签设置并针对标签进行灰度发布。

  1. 客户端设置应用标签
    通过以下方式设置应用的标签,应用标签为 key-value 格式。可以通过 properties,JVM 参数和环境变量三种方式指定。相同 key 的情况下,默认优先级:properties > JVM 参数 > env 环境变量,nacos.config.gray.label 是 Nacos 内置的默认配置灰度标签。
    //1.properties形式传入
    Properties properties = new Properties();
    properties.put(PropertyKeyConst.SERVER_ADDR, "your endpoint");
    properties.put("project.name", "your app name");
    properties.put("nacos.config.gray.label","yourgrayname");

//2.JVM参数设置设置启动参数
-Dnacos.config.gray.label=yourgrayname
nacos_config_gray_label=yourgrayname

//3.env环境变量指定设置环境变量
String dataId = "gray_test_dataid";
String group = "test-group";
configService.addListener(dataId, group, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("receiveConfig:" + configInfo);
}
});

  1. 服务端发布标签灰度
    ● 查看监听者标签
    客户端完成应用标签注入后,可以通过服务端查看配置的监听者列表,查看每个监听者携带的标签。
    image.png

● 发布灰度标签配置

单击编辑配置,选择基于标签灰度发布,然后选择应用节点当前存在的标签键值对,可以看到选择的键值对所匹配到的节点数。
image.png

发布灰度标签版本后,在监听查询可以看到当前客户端所匹配的配置版本。在配置详情可以看到当前灰度版本的详情。

在进行第一批灰度观察后,可以通过扩大编辑标签的值范围来逐步扩大灰度,直到进行全量发布,单击全量发布后,将停止对应的灰度版本。如果在灰度过程中发现业务异常,可以单击停止灰度进行一键自动回滚。

Nacos 标签灰度除了提供基本灰度能力外,还可以衍生出更高阶的用法,如设置多值标签、自定义应用标签 SPI、多版本并行灰度等。

总结

Google Cloud 在 2025 年 6 月 12 日的全球性故障事件为我们提供了宝贵的教训。一个简单的空指针异常,由于缺乏适当的错误处理和灰度发布策略,导致了全球范围的服务中断,影响了数百万用户和企业。这一事件再次证明,即使是技术巨头也不能忽视配置灰度发布的重要性。

通过本文的分析,我们可以清晰地看到,如果 Google Cloud 采用了类似 Nacos 的配置灰度发布策略,可能会避免全球性服务中断,通过小范围验证发现问题,控制影响范围,并能快速回滚配置。

相关文章
|
1天前
|
Java 调度
线程池
线程池通过复用线程提升性能,避免频繁创建销毁的开销。Java中Executor框架提供Executors工厂类创建线程池,核心实现为ThreadPoolExecutor和ScheduledThreadPoolExecutor,分别支持普通任务和定时调度,助力高效并发编程。
|
1天前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会进行类型擦除,所有泛型信息被移除,替换为原始类型(如Object或限定类型)。例如,List<String>和List<Integer>在运行时均为List。类型检查在编译期完成,基于引用而非实际对象。擦除导致反射可绕过泛型限制、无法使用基本类型、instanceof失效等问题,并影响多态实现,需通过桥方法等机制解决。静态成员不能使用类的泛型参数,因其实例化依赖对象创建,而静态上下文无此支持。
|
1天前
|
XML Java 数据格式
@Configuration
被 `@Configuration` 标注的类视为Spring配置类,相当于XML配置文件。结合 `@Bean` 可注册Bean实例,通过 `AnnotationConfigApplicationContext` 加载配置类,启动IOC容器并管理Bean生命周期,配置类本身也会被作为Bean加载。
|
1天前
|
SQL 关系型数据库 Java
3.分页
本文介绍了五种分页实现方式:MyBatis自带RowBounds内存分页、PageHelper插件分页、SQL原生分页、数组分页及拦截器分页。前两者属逻辑分页,查全量数据后处理,小数据量高效但内存开销大;后三者为物理分页,直接在数据库层分页,适合大数据量场景。推荐优先使用物理分页以提升性能与系统稳定性。(238字)
|
1天前
|
Java 数据库连接 mybatis
2.映射关系(1-1 1-n n-n)
MyBatis中通过resultMap实现一对一、一对多、多对一及多对多映射。一对一用于属性与字段映射;一对多通过`<collection>`关联主表与子表,如用户拥有多个角色;多对一通过`<association>`关联,如博客属于作者;多对多借助中间类实现,如用户与部门双向关联,均通过嵌套映射完成复杂数据结构封装。
|
1天前
|
缓存 Java 数据库连接
1.常见配置
MyBatis配置优先级:方法参数 > resource/url > properties体内。核心属性包括缓存、延迟加载、主键生成等。支持多环境配置,通过environments指定,默认使用default环境。事务管理支持JDBC和MANAGED,与Spring集成时由Spring接管。详细配置参考官方Java API文档。
|
1天前
|
存储 NoSQL 关系型数据库
4-MongoDB索引知识
MongoDB索引通过B树结构提升查询效率,避免全表扫描。支持单字段、复合、地理空间、文本及哈希索引,优化等值、范围、排序及全文检索,显著提升大数据量下的查询性能。
|
1天前
|
存储 JSON NoSQL
3-MongoDB常用命令
本文介绍如何使用MongoDB存储文章评论数据,涵盖数据库与集合的创建、删除,文档的增删改查、批量操作、投影查询、分页排序等功能,结合实际示例说明CRUD操作及注意事项,帮助快速掌握MongoDB基本用法。
|
1天前
|
存储 NoSQL Linux
2-MongoDB单机部署
本文介绍MongoDB在Windows和Linux系统的安装启动方法,包括下载、解压、配置数据目录及启动方式(命令行或配置文件)。支持设置环境变量、修改端口、日志与存储路径,并通过mongo shell或Compass图形化工具连接。Linux下还需配置防火墙与关闭服务,确保数据库稳定运行。
|
1天前
|
监控 算法 Unix
Thread.sleep(0) 到底有什么用(读完就懂)
Thread.Sleep用于让线程暂停执行一段时间,不参与CPU竞争。Sleep(1000)并不保证精确唤醒时间,取决于系统调度;Sleep(0)则触发立即重新计算线程优先级,让出CPU给其他线程,常用于避免界面假死。