Nacos 配置中心变更利器:自定义标签灰度

作者:柳遵飞

配置中心被广泛使用

配置中心是 Nacos 的核心功能之一,接入配置中心,可以实现不重启线上应用的情况下动态改变程序的运行期行为,在整个软件生命周期中,可以极大降低了软件构建及部署的成本,提升效率,为业务发展提速。配置中心在各个领域都有着非常广泛的应用。

上图列举了 Nacos 的一些非常常见的使用场景,覆盖了微服务领域,高可用领域,前端生态,数据库领域等等,可以看出其中有一些非常关键的场景都是靠配置中心来完成的,比如流量调度,路由规则,应急预案,一些业务的关键开关,数据库的一些数据源配置等等,这些数据的正确性直接影响线上业务运行的稳定性。

配置变更的风险

动态变更配置带来软件迭代效率的提升,同时也会带来一定的稳定性风险,对线上配置的误操作,可能导致线上程序执行出错,进而对业务产生影响,在对变更没有进行完善的流程管控的情况下,动态配置变更从某种角度上来说会扩大线上稳定性问题的敞口,业界由于配置变更导致的故障时有发生,因此对于配置的变更管控是非常必要的。

出于稳定性考虑,变更都需具有可灰度,可监控,可回滚三个基本要求。

  • 可灰度: 要求任何变更都可以控制其生效范围,在变更过程中可逐步扩大生效范围。
  • 可监控: 要求对业务的各项指标都有可视化展示,可正确清晰地反应业务的运行状态。
  • 可回滚: 在变更期间,如观测到业务异常,可以快速使业务回退至变更前的状态。

灰度发布是配置中心用于控制配置变更风险的一个非常重要且基础的功能。

一个规范的配置变更流程如下所示:

先选取一部分低风险应用服务器作为第一个版本的灰度,下发新配置,观察服务器的系统及业务指标,确认业务正常后,逐步扩大灰度范围,直至发布正式版本完成整体的配置变更流程,如果期间业务出现异常,选择终止灰度,先前已灰度的服务器也同时回滚至变更前的配置,以快速恢复业务。

基于 IP 灰度的局限

在之前的版本中,Nacos 提供了基于 IP 地址的灰度方式,用户在发布正式版本配置前,可以选择一些 IP 地址下发新配置进行验证,确认业务正常,观察期过后,选择全量发布。

对于一些小型应用,基于 IP 灰度的方式已经可以满足诉求,而对于一些中大型应用,一个配置可能会被大量的应用节点订阅,这些应用节点可能归属于不同的业务应用,这些应用在应用系统中扮演不同的角色,对线上业务的影响面也截然不同。当应用节点 IP 数量较大时,易用性会大大降低,IP 地址是底层基础网络设施决定,无法和业务应用做直接的关联,在扩大灰度范围时,需要自行筛选不同业务特点的节点IP列表,此外在 K8s 容器化部署下,节点重启之后 IP 可能会发生变化而导致灰度失效。

自定义标签灰度

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

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

以下我们将介绍应用如何接入自定义标签灰度的能力。

版本要求

自定义标签灰度是新上线的功能,因此对客户端和服务端版本均有一定的要求。

  • 开源 Nacos-Client 版本在 2.3.2 及以上支持自定义应用标签灰度,您需要升级客户端版本至 2.3.2 及以上。
  • MSE Nacos 版本在 2.2.3.3 及以上支持应用标签灰度,您需要升级引擎版本至 2.2.3.3 及以上。

设置应用标签

在完成客户端和服务端版本升级之后,您可以通过以下方式设置应用的标签,应用标签为 key-value 格式。可以通过 properties、JVM 参数、环境变量三种方式指定。

nacos.config.gray.label 是 Nacos 内置的默认配置灰度标签。你可以通过设置 nacos.config.gray.label={value} 参数设置标签值。

//1.properties属性设置标签
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "{server addr}");
//other properties
properties.put("nacos.config.gray.label","yourgrayname");

ConfigFactory.createConfigService(properties);

// 2.通过JVM参数设置标签
-Dnacos.config.gray.label={value}

// 3.通过环境变量设置标签
nacos_config_gray_label={value}
  • properties 属性传入的标签只对当前 ConfigService 对象生效,作用范围最小。
  • 通过 JVM 参数设置标签,对当前进程内的所有 ConfigService 生效。
  • 通过环境变量设置标签,对当前节点上的所有 ConfigService 生效。
  • 当三种方式设置的标签 key 存在重复时,读取的优先级为 properties>JVM参数>环境变量。

发布标签灰度

成功设置应用标签,对应用进行重启后,可以通过 MSE Nacos 控制台查看配置的监听查询界面,在其中的应用节点标签一列中看到客户端设置的标签 key-value。

在客户端成功设置标签之后,在 MSE 控制台打开配置编辑界面,在发布方式中选择“基于标签灰度发布”,设置灰度版本名称,选择标签键及标签值,可以看到预期匹配到的应用节点数量以及节点列表,在界面右侧配置内容框中编辑配置内容,点击“发布灰度”完成配置发布。

发布成功后,打开配置详情页,点击配置内容 Tab,可以看到有“正式”和“Beta”两个版本。

切换至监听查询界面,可以看到对应的业务节点当前的匹配的版本,展示的版本为 Beta({灰度版本名称}),md5 为对应版本的 md5,推送状态为推送成功。

此外,在推送轨迹界面也可以看到标签发布以及客户端查询灰度版本的轨迹,在节点的配置推送轨迹详情中可以看到具体推送的配置版本。

在发布标签灰度时,我们可以选择编辑灰度配置选择多个标签值来实现逐步扩大灰度范围的目的。以下我们简单介绍几种常见的用法:

  1. 将应用 A 下的机器都设置 nacos.config.gray.label=A 的标签,将应用 B 下的机器设置 nacos.config.gray.label=B 的标签,在进行灰度发布时,我们可以先发布规则为 nacos.config.gray.label=A 的灰度版本对应用 A 的节点进行灰度,而后编辑灰度规则为 nacos.config.gray.label=A,B 将应用 B 的节点也纳入灰度范围。

  2. 通过环境来设置标签,比如将线上环境的机器分为不同的分组,设置nacos.config.gray.label=gray1,nacos.config.gray.label=gray2,nacos.config.gray.label=gray3 来区分不同的灰度环境,将线上正式的机器设置nacos.config.gray.label=online,在对 nacos.config.gray.label 进行标签发布来实现不同环境逐步扩大灰度的能力。

完成灰度版本发布后,观察业务侧的监控指标,度过观察期后,我们可以在灰度版本编辑界面中的应用节点标签值编辑匹配的值,扩大灰度规则覆盖的节点范围,确保所有灰度节点指标正常后,可以点击全量发布将当前灰度的配置内容发布为正式版本,成功发布正式版本后,当前的灰度版本将会终止。

多标签灰度

以上,我们使用 nacos 内置的标签 nacos.config.gray.label 作为示例,对于一些中小型应用来说已经可以满足自定义灰度的需求,但对于相对复杂的中大型应用,单个标签可能无法应对业务侧的复杂性。实际上,MSE 并没有对标签 key 做强制的约束,业务应用可以自行选择其他的标签 key 作为灰度,并且也支持给应用设置多个标签,以下我们将介绍如何给业务节点设置多个标签键值对。

和设置单个标签类似,客户端可以在 properties 及 JVM 参数,环境变量中设置多个标签。在 properties 和 JVM 参数中通过 nacos.app.conn.labels 来设置多个标签,(示例:nacos.app.conn.labels=k1=v1,k2=v2,k3=v3),在环境变量中指定 nacos_app_conn_labels 参数(nacos_app_conn_labels=k1=v1,k2=v2,k3=v3)注入应用的多个标签。

//1.properties形式传入
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "your endpoint");
properties.put("project.name", "your app name");
properties.put("nacos.app.conn.labels","app=demo,site=hangzhou-c,otherkey=othervaue");

//2.JVM参数设置
设置启动参数-Dnacos.app.conn.labels=app=demo,site=hangzhou-c,otherkey=othervaue

//3.env环境变量指定
设置环境变量 nacos_app_conn_labels=app=demo,site=hangzhou-c,otherkey=othervaue

NacosConfigService configService = new NacosConfigService(properties);

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);
        }
});

除了通过参数设置之外,如果标签的读取逻辑比较复杂,也可以选择通过实现自定义 SPI 接口来设置标签。Nacos-Client 定义了自定义应用标签的 SPI,实现 com.alibaba.nacos.common.labels.LabelsCollector 接口,并将具体实现类在 META-INF/services 发布为 SPI。

package your.demo.test;

import com.alibaba.nacos.common.labels.LabelsCollector;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * TestLabelsCollector.
 *
 * @author yourname
 */
public class TestLabelsCollector implements LabelsCollector {

    @Override
    public String getName() {
        return "testlables";
    }

    @Override
    public Map<String, String> collectLabels(Properties properties) {
        Map<String, String> labels = new HashMap<>();
        labels.put("test", "implements your lables logic");
        return labels;
    }


    @Override
    public int getOrder() {
        return 1;
    }
}

应用可以自行设置标签的键值对,但为了尽量避免应用使用标签灰度时遇到异常,Nacos 对标签的键值也对做了一些约束。

  • 标签键值 key-value 允许使用的字符包括英文字母大小写、数字、下划线“_”、横杠“-”和点“.”。如果传入其他格式的标签将被忽略处理。如果通过参数 nacos.app.conn.labels 指定多个键值对时,格式必须遵循 k1=v1,k2=v2,k3=v3 格式。如果传入 k1=v1,k2,那么 k2 参数将会被忽略,最终解析成 k1=v1。
  • MSE 对单个应用节点的标签键值对数量上限也有一定限制,最大支持 10 个标签键值对,超过上限时,会随机剔除多余的键值对,请合理规划应用标签数量。

当前在标签灰度界面设置匹配规则时,可以选择多个标签值匹配多种类型的节点列表,但为了降低功能的复杂度,暂未开放在一个灰度规则中匹配多个标签键,比如通过设置 k1=v1&&k2=v2 表达式来进一步细化灰度范围,也不支持在一个灰度版本中设置规则为 k1=v1||k2=v2 来扩大灰度范围。

多灰度版本并行

MSE Nacos 支持在一个配置下发布多个灰度版本,比如对匹配 k1=v1 的节点下发 graycontent1 的配置内容,同时对 k1=v2 的节点下发 graycontent2 的配置内容。我们可以在配置编辑界面 Tab 页点击+来创建新的灰度版本。

成功创建多个灰度版本后,我们在配置的编辑界面和详情界面可以看到多个灰度版本并排展示。

一个配置发布了多个灰度版本时,灰度的标签键值对可能匹配到完全不重合的节点列表,但也可能匹配到同一个应用节点,此时需要关注一个匹配的优先级问题。

对于一个配置来说,可能存在多个配置的版本,包括正式版本,基于 IP 的灰度版本,基于标签的灰度版本,其中基于标签的灰度可以发布多个版本。当一个配置存在多个版本,并且应用侧的标签被多个灰度版本的规则匹配到时,Nacos 服务端将以如下的优先级规则进行匹配。基于 IP 的灰度版本>基于标签的灰度版本>正式版本,多个基于标签的灰度版本之间将以优先级 priority 字段排序,优先级 priority 值越大,优先级越高,优先级 priority 值相同时,将灰度名称的字符顺序匹配,建议将不同的规则设置为不同优先级。

MSE 对一个配置所发布的最大灰度版本数量也有一定限制,默认最大支持 5 个标签灰度的版本,超过上限时,灰度发布将被拦截。

在配置编辑界面和详情界面,各个灰度版本的展示顺序是按照以上的优先级逻辑进行展示,可以通过界面直观地看到各个版本的优先级。如果我们想提高某个灰度版本的优先级,可以在编辑页面修改优先级的数值,点击发布即可。

多灰度版本并行时,选择其中一个灰度版本进行全量发布,可以将当前灰度的配置内容发布为正式版本,成功发布正式版本后,当前的灰度版本将会终止,但此时其他并行的灰度版本不会被终止,它们的规则所覆盖的节点仍将接收对应灰度版本的配置内容。

结语

以上我们完成了对 MSE Nacos 应用自定义标签灰度的功能介绍,欢迎大家升级版本进行试用,如果使用期间遇到问题或者对配置的灰度有更多的使用场景,欢迎联系我们。

相关链接:

[1] Nacos 官网

https://nacos.io

[2] Nacos Github 主仓库

https://github.com/alibaba/nacos

[3] 生态组仓库

https://github.com/nacos-group

[4] MSE 配置灰度发布

https://help.aliyun.com/zh/mse/user-guide/configure-canary-release

Nacos 多语言生态仓库:

[1] Nacos-GO-SDK

https://github.com/nacos-group/nacos-sdk-go

[2] Nacos-Python-SDK

https://github.com/nacos-group/nacos-sdk-python

[3] Nacos-Rust-SDK

https://github.com/nacos-group/nacos-sdk-rust

[4] Nacos C# SDK

https://github.com/nacos-group/nacos-sdk-csharp

[5] Nacos C++ SDK

https://github.com/nacos-group/nacos-sdk-cpp

[6] Nacos PHP-SDK

https://github.com/nacos-group/nacos-sdk-php

[7] Rust Nacos Server

https://github.com/nacos-group/r-nacos

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918588.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于RK3568J多网口电力可信物联网关解决方案

前言 随着工业物联网的普及和功能越来越强大&#xff0c;边缘计算网关应运而生。 边缘计算有效降低了云端服务器的负载、大大降低了带宽的占用&#xff0c;同时也为本地化的区域自治提供了便利条件。 边缘计算网关&#xff0c;完美地发挥了“边”与“端” 结合优势&#xff0c…

无人机飞手入门指南

无人机飞手入门指南旨在为初学者提供一份全面的学习路径和实践建议&#xff0c;帮助新手快速掌握无人机飞行技能并了解相关法规知识。以下是一份详细的入门指南&#xff1a; 一、了解无人机基础知识 1. 无人机构造&#xff1a;了解无人机的组成部分&#xff0c;如机身、螺旋桨…

网络传输:网卡、IP、网关、子网掩码、MAC、ARP、路由器、NAT、交换机

目录 网卡IP网络地址主机地址子网子网掩码网关默认网关 MACARPARP抓包分析 路由器NATNAPT 交换机 网卡 网卡(Network Interface Card&#xff0c;简称NIC)&#xff0c;也称网络适配器。 OSI模型&#xff1a; 1、网卡工作在OSI模型的最后两层&#xff0c;物理层和数据链路层。物…

多账号登录管理器(淘宝、京东、拼多多等)

目录 下载安装与运行 解决什么问题 功能说明 目前支持的平台 功能演示 登录后能保持多久 下载安装与运行 下载、安装与运行 语雀 解决什么问题 多个账号的快捷登录与切换 功能说明 支持多个电商平台支持多个账号的登录保持支持快捷切换支持导入导出支持批量删除支持…

你可以通过以下步骤找到并打开 **Visual Studio 开发者命令提示符**:

你可以通过以下步骤找到并打开 Visual Studio 开发者命令提示符&#xff1a; 1. 通过开始菜单查找 打开 开始菜单&#xff08;点击屏幕左下角的 Windows 图标&#xff09;。在搜索框中输入 Developer Command Prompt。你应该看到以下几种选项&#xff08;具体取决于你的 Visu…

版本控制【Git Bash】【Gitee】

目录 一、什么是版本控制&#xff1f; 二、版本控制的种类&#xff1a; 1、本地版本控制 2、集中版本控制 3、分布式版本控制 三、下载Git Bash 四、Git Bash 配置 五、Git Bash使用 1、切换目录&#xff1a;cd 2.查看当前文件路径&#xff1a;pwd 3.列出当前目录下文件…

大数据-226 离线数仓 - Flume 优化配置 自定义拦截器 拦截原理 拦截器实现 Java

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

【3D Slicer】的小白入门使用指南九

定量医学影像临床研究与实践 任务 定量成像教程 定量成像是从医学影像中提取定量测量的过程。 本教程基于两个定量成像的例子构建: - 形态学:缓慢生长肿瘤中的小体积变化 - 功能:鳞状细胞癌中的代谢活动 第1部分:使用变化跟踪模块测量脑膜瘤的小体积变化第2部分:使用PET标…

Visual Studio 圈复杂度评估

VisualStudio自带的有工具 之后就可以看到分析结果

计算机毕业设计 | SpringBoot+vue城镇保障性住房管理 公租房系统(附源码+论文)

1&#xff0c;绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理城镇保障性住房管理系统的相关信…

Cherno OpenGL(28 ~ 33)

批量渲染-介绍 在这里我们将在一个drawcall打包多个几何体。即 batch geometry。 我们在这里将聚焦于2d渲染&#xff0c;我们如何渲染一堆2d的quads或者说rectangles呢&#xff1f; 一种情况是比如一个2d游戏有很多个tile组成&#xff0c;要去渲染这些tile&#xff1b;另一种…

物联网——UNIX时间戳、BKP备份寄存器、RTC时钟

RTC时钟 Unix时间戳 UTC/GMT 时间戳转换 时间戳转换 BKP简介 RTC框图 RTC基本结构 硬件供电电路 RTC操作注意事项 接线图&#xff08;读写备份寄存器和实时时钟&#xff09;

EPANET供水系统水力和水质模拟,管网系统水龄模拟、余氯模拟、消毒副产物模拟、失效分析、弹性分析等

EPANET 是美国环保综述开发的用于供水系统水力和水质模拟的软件工具&#xff0c;可以视作是SWMM模型&#xff08;主要用于排水系统&#xff09;的姊妹软件。它主要用于供水系统的设计、操作和分析&#xff0c;适用于包括城市、工业区和农村地区各种规模的供水系统分析。在水力模…

51单片机基础04 LCD1602时序;Proteus仿真单片机、总线、网络标号等;

目录 一、LCD显示字符 1、写指令 &#xff08;1&#xff09;、LCD状态配置 &#xff08;2&#xff09;、显示开关与光标 2、写数据 &#xff08;1&#xff09;、设置地址 &#xff08;2&#xff09;、设置数据 3、初始化代码 &#xff08;1&#xff09;、初始化流程 …

OceanBase 闪回查询

前言 在OB中&#xff0c;drop表可以通过 回收站 或者 以往的备份恢复来还原单表。当delete数据时&#xff0c;由于delete操作的对象不会进入回收站&#xff0c;此时需要通过闪回查询功能查看delete的数据&#xff0c;以便后续恢复 本次实验版本为 OceanBase 4.2.1.8&#xff0…

小版本大不同 | Navicat 17 新增 TiDB 功能

近日&#xff0c;Navicat 17 迎来了小版本更新。此次版本新增了对 PingCap 公司的 TiDB 开源分布式关系型数据库的支持&#xff0c;进一步拓展了 Navicat 的兼容边界。即日起&#xff0c;Navicat 17 所有用户可免费升级至最新版本&#xff0c;通过 Navicat 工具实现 TiDB 数据库…

SpringBoot开发——SpringBoot3.3 实现停止/重启定时任务

文章目录 一、运行效果二、项目结构三、功能实现1、项目依赖配置(pom.xml)2、配置文件(application.yaml)3、创建 TaskSchedulerProperties 配置类4、定时任务的实现5、任务管理器的实现6、控制器的实现7、启动应用程序类8、视图控制器9、前端页面(Thymeleaf + Bootstrap)…

【大数据技术基础 | 实验十一】Hive实验:新建Hive表

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;启动Hive&#xff08;二&#xff09;创建表&#xff08;三&#xff09;显示表&#xff08;四&#xff09;显示表列&#xff08;五&#xff09;更改表&#xff08;六&am…

c++ 后端

基础知识 1. 指针、引用2. 数组3. 缺省参数4. 函数重载5. 内联函数6. 宏7. auto8. const9. 类和对象10. 类的6个默认成员函数11. 初始化列表12. this指针13. C/C的区别14. C 三大特性15. 结构体内存对齐规则16. explicit17. static18. 友元类、友元函数19. 内部类20. 内存管理&…

[C++]:C++11(一)

1. 统一列表初始化 1.1 C11 之前的初始化方式 在 C11 标准中&#xff0c;引入了一个非常实用且强大的特性——统一列表初始化&#xff08;Uniform Initialization&#xff09;&#xff0c;它为我们在初始化各种类型的对象时提供了一种统一且方便的语法形式&#xff0c;极大地…