一、前言
随着近几年得物的业务和技术的快速发展,我们不管是在面向C端场景还是B端供应链;业务版本的迭代更新,技术架构的不断升级;不管是业务稳定性还是架构稳定性,业务灰度的能力对我们来说都是一项重要的技术保障,越来越受到我们业务研发的关注。然而,传统的灰度发布服务往往过于定制化,缺乏灵活性和通用性,无法满足不断变化的业务需求,往往灰度的场景可能通过代码硬编码或者简单的配置中心配置。在这样的背景下,本文将介绍一种全新的、轻量级的灰度平台,它将为大家的业务带来全新的灰度体验。
二、总体架构设计
整体架构模块的概览
主要由如下模块组成:
-
灰度运营平台:为用户提供增删查改的灰度发布管理和UI界面;
-
灰度服务端:为灰度运营平台提供标准的增删查改功能、权限控制、灰度场景管理和应用接入命名空间;
-
Nacos&Ark: 提供高性能的灰度配置读取和存储服务;
-
灰度SDK: 为研发提供轻量级高性能的灰度判断API和配置服务。
功能特性说明:
-
系统灰度开关可以在后台运营页面上进行可视化管理;
-
配置类型可以支持多种开关、灰度、业务配置;
-
配置的值可以采用富文本形式来进行编辑;
-
能够支持自定义维度白名单的方式进行灰度;
-
能够支持自定义多个分组的方式进行灰度;
-
能够支持自定义分组实验的方式进行灰度;
-
能够支持按照指定维度以一定比例进行灰度;
-
能够支持自定义维度进行灰度配置;
-
能够支持历史配置一键回滚和追溯配置;
-
能够方便灰度配置信息进行生命周期管理。
适用的场景:
三、灰度服务关键设计
我们参考上面的总体架构设计可知,灰度配置的存储不是关键,复用已有的Nacos等或者自研的配置服务中心即可,重点是在SDK和灰度数据结构的设计上。
灰度数据类型设计
首先我们针对不同的场景可能会遇到不同的数据类型灰度,不同的数据类型在规则处理中可能也有特点场景的实现,所以先定义灰度数据类型参考如下:
/**
* 版本号
*/
VERSION("version"),
/**
* 字符串类型
*/
STRING("string"),
/**
* 集合类型
*/
SEGMENT("segment"),
/**
* 数字类型
*/
NUMBER("number"),
/**
* 非法规则
*/
NONE("none"),
;
灰度规则设计
有了灰度数据类型的定义,我们需要针对不同的字段数据类型使用不同的灰度规则,如包含关系、完全匹配、正则表达式等。于是就可以自定义各种规则,根据实际的业务场景抽象,规则完全可以再自定义。
IS_IN("in"),
IS_NOT_IN("notIn"),
REGEX("regex"),
NREGEX("nregex"),
EQ("eq"),
NEQ("neq"),
EQUAL_TO("="),
NOT_EQUAL_TO("!="),
GREATER_THAN(">"),
GREATER_OR_EQUAL(">="),
LESS_THAN("<"),
LESS_OR_EQUAL("<="),
NONE("none"),
灰度类型实现的规则对应级联关系:
简单灰度触发器模型
根据上面定义的数据结构和灰度规则,很容易抽象出我们需要定义的灰度模型,简单数据结构参考如下:
@Data
@NoArgsConstructor
public class Toggle implements Serializable {
/**
* 默认不配置该字段,如果启用该字段fullGray=1,则全量开关不进行后续的版本判断
*/
private Integer fullGray = 0;
/**
* 是否生效;1:生效;0:不生效
*/
private Integer enabled = 1;
/**
* 规则列表,每一项都是或的关系
*/
private List<Rule> rules;
/**
* 规则列表
* 每一项是或的关系
*/
@Data
public static class Rule implements Serializable {
/**
* 规则字段条件,每一项是且的关系
*/
private List<Condition> conditions;
}
/**
* 条件列表