GrayScale灰度切量系统 【AB测试】
AB测试中的痛点
新功能上线,产品要求按照规则进行AB测试,但是规则随着业务的推进不断变化(上线前也无法完全确定)。例如:第一天要求产品价格>100的走A场景,第二天要求:在上午10到下午18之前的走B场景,第三天要求产品编码为(1001,1002,1003)的走A场景… 传统方案:修改规则后发版,这就导致开发工作量增加,频繁上线,时效性也很差。 在这种情况下GrayScale 应运而生…
介绍
com-grayscale-annotation (注解模块,快速下线是使用)
com-grayscale-client (客户端demo 依赖 com-grayscale-annotation )
com-grayscale-core (核心模块依赖 com-grayscale-annotation )
com-grayscale-dashboard (控制台,服务查看,规则配置)
GrayScale是一套轻量、高可用、配置友好的灰度程序管理器,内置20多个常用规则,用户可以按照业务场景快速开发自己的规则,离线模式满足高并发场景的需求。在实际业务场景中针对AB测试,开发一个B方法。并使用GrayScale的注解为A方法指定切量方法B,GrayScale会更具用户自定义的规则来选择执行A方法还是B方法 ,目前,GrayScale定义了3个维度的规则,服务全局开关、方法开关、方法规则 。
功能架构
- 提供标准规则库,用户可按照需求扩展
- 提供Dashboard,查看服务和规则、动态配置规则,自动同步到在线节点
- 高可用支持:规则本地持久化,规则变更后通过zookeeper监听机制动态刷新本地缓存,支持开启离线模式(直接本地获取规则不连接zk)
- 使用简单,快速接入,代码O侵入(只需一个注解+一个配置),支持更换jar包快速下线,无需修改业务代码
技术架构
如何接入?
第一步:准备zk集群
搭建好zk集群,GrayScale在zk集群中使用的根目录为 grayscale,接入请确保该目录没有被占用
第二步:Dashboard下载和启动
指定zk地址
– grayscale.zookeeper.connect-url 指定zookeeper地址.
java -jar com-grayscale-dashboard-1.0.jar grayscale.zookeeper.connect-url=127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
配置参数详解
user.username 登录名(默认:admin)
user.password: 密码(默认:123456)
grayscale.clientRegister 是否注册服务(false)控制台不注册
grayscale.zookeeper.connect-url zk集群地址(默认:127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183)
启动后访问地址: http://localhost:8888/index.html
功能预览
登录
首页
服务列表
接口服务列表
接口服务规则
接口服务规则配置
规则列表
第二步:服务接入
引入maven支持:打包com-grayscale-core (上传到自己的私服,可根据项目情况调整依赖jar版本)
<dependency><groupId>com.grayscale.core</groupId><artifactId>com-grayscale-core</artifactId><version>1.0</version></dependency>
参数配置
# 必须参数
server.port 服务端口 (默认8080)
spring.application.name 服务编码
spring.application.code 服务名称
grayscale.zookeeper.connect-url zk地址
grayscale.offlinePath 本地配置信息路劲(默认/grayscale/${spring.application.code})
grayscale.offlineMode 是否开启离线模式(默认false)
– 配置切量方法
/**
* TestController中调用sFunction1,按照GrayScale配置规则在满足条件的情况下切换到sFunction1GrayScale
* 这2个方法的形参必须一样
* @author liuli31
* @date 2022/2/9
*/
@Service
public class Server1Impl implements Server1 {@Override/*** 如不指定 grayScaleMethod 默认:该方法名+GrayScale* @GrayScaleFunction(grayScaleMethod="sFunction1GrayScale")* */@GrayScaleFunctionpublic void sFunction1(String productCode, String userId, double price, PamsVo pamsVo) {System.out.println("sFunction1=不切量");}@Overridepublic void sFunction1GrayScale(String productCode, String userId, double price, PamsVo pamsVo){System.out.println("sFunction1GrayScale=切量");}}
第三步:实例
参考:https://gitee.com/wenwang2000/grayscale
服务下线
服务快速下线:
一、把core替换成annotation 无需修改业务代码,摘除grayscale
二、关闭grayscale.zookeeper.connect-url(如项目不再需要zk)等配置
<dependency><groupId>com.grayscale.core</groupId><artifactId>com-grayscale-annotation</artifactId><version>1.0</version></dependency>
2.0 规划
- 扩展更多规则库
- 增加数据统计功能
说明:
- 由于作者时间有限,后期项目升级,博客内容未必能同步更新,请参考gitee开源项目 :grayscale
- 如果你喜欢该项目、或该项目对你有用,请在gitee上 给个start
GrayScale灰度切量系统 【AB测试】相关推荐
- 蓝绿发布金丝雀发布灰度发布滚动发布AB测试
金丝雀不是说它外形漂亮或有特点,而是说它对瓦斯很灵敏. 这些名字玄而又玄,逼格十分高大上.到底是些啥?好像不了解一下,就完全看不懂当下流行的吹哔哔技术PPT了. 一.蓝绿发布 不停老版本,部署新版本然 ...
- 蓝绿部署、金丝雀发布(灰度发布)、AB测试……
点击关注公众号,Java干货及时送达 来源 | https://www.jianshu.com/p/0df88fe4a1e3 随着微服务架构的普及,线上服务越来越多,随之而来的就是部署越来越频繁:随着 ...
- 常见的部署类型(停机部署、蓝绿部署、滚动部署、灰度部署、AB测试等)
目录 一.常见部署类型 二.停机部署 三.蓝绿部署 四.滚动部署 五.灰度部署(金丝雀) 六.AB测试 一.常见部署类型 停机部署(Big Bang / Recreate): 把现有版本的服务停机,然 ...
- 蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别...
蓝绿部署.红黑部署.AB测试.灰度发布.金丝雀发布.滚动发布的概念与区别 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangyinghong_2 ...
- 通过变量指定少量用户实现AB测试(灰度测试):split_client模块
前言 灰度测试或者AB测试,这个概念我相信大家都不陌生了,也是互联网公司常见的迭代方式.最近公司有个很老的SDK项目,完全的面向过程方式,很难维护和管理,所以决定在此基础上对此SDK项目进行重构,使用 ...
- 数据应用系列(1)-ab测试
作者/五花肉 作者介绍 前网易出口大数据产品经理一枚 负责过数据采集.bi系统.ab测试.画像平台等应用层平台搭建 酷爱健身.钟爱咖啡.喜爱摩托.热爱生活 01 为什么需要ab测试 大家在日常工作中是 ...
- AB 测试平台的设计与实现
AB 测试(以下称为「试验」),本质是把选择权交给用户,让用户决定什么是最好的.我们给参与试验的不同用户,分配不同的方案,收集用户数据并加以分析,最终确定最优方案. 试验方案的分配可抽象为一个哈希函数 ...
- 第八章 流量复制/AB测试/协程
流量复制 在实际开发中经常涉及到项目的升级,而该升级不能简单的上线就完事了,需要验证该升级是否兼容老的上线,因此可能需要并行运行两个项目一段时间进行数据比对和校验,待没问题后再进行上线.这其实就需要进 ...
- 辛普森悖论如何影响AB测试
Simpson's paradox occurs when we observe a certain trend in the aggregate data but not in the underl ...
最新文章
- hp惠普笔记本电脑黑屏大小写锁定键闪烁报错无法开机怎么办?
- 开源 免费 java CMS - FreeCMS1.7 栏目管理
- 用python写helloworld_Python Helloworld程序简单实现
- 【Java】基于Socket的C/S聊天程序
- CSS深入浅出(三)
- atm机存款场景图_被ATM机吞掉的钱
- java subset_Java中的TreeSet的subSet()方法 Java.util.TreeSet.subSet() - Break易站
- 偶然翻开旧日记本,发现了好多的情诗!!!!
- openCV5-getTickCount
- Android系统在超级终端下必会的命令大全(adb shell命令大全)
- Windows下安装HDFView
- nmake、makefile、cmake学习笔记
- c语言两矩阵相乘算法,用c语言实现两个矩阵相乘怎么做?
- Nginx+php+mysql超时问题总结
- 51单片机游戏(推箱子)
- SwiftUI 如何解决Generic parameter ‘SelectionValue‘ could not be inferred
- c语言中要让音乐暂停还用什么指令,【Android】Broadcast控制音乐暂停继续等
- ArcMAP实现矢量数据平移
- QQ群互通(QQ_Bot)程序配置教程
- android 手电筒开关,Android 系统开关,wifi、手电筒等的开关