GrayScale灰度切量系统 【AB测试】

GrayScale是一款用于解决AB测试中规则频繁变动问题的灰度程序管理器,它提供了动态规则配置、高可用支持和离线模式。用户可以通过Dashboard动态配置规则,实现服务快速接入和下线,降低了开发工作量和对业务代码的侵入。未来计划扩展更多规则库和增加数据统计功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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")
  * */
 @GrayScaleFunction
 public void sFunction1(String productCode, String userId, double price, PamsVo pamsVo) {
   System.out.println("sFunction1=不切量");
 }

 @Override
 public 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
### 使用卷积神经网络 (CNN) 实现灰度图像自动上色 #### 准备工作 为了使用 CNN 对灰度图像进行上色,需要准备好相应的数据集。这通常涉及收集大的彩色图像及其对应的灰度版本作为训练样本[^2]。 ```python import os from PIL import Image import numpy as np import matplotlib.pyplot as plt # 定义函数用于加载并转换图片至灰度模式 def load_image_as_grayscale(path): img = Image.open(path).convert('L') return np.asarray(img) # 加载一张示例图片查看其灰度形式 example_img_path = 'path_to_example_colorful_image.jpg' gray_scale_example = load_image_as_grayscale(example_img_path) plt.imshow(gray_scale_example, cmap='gray') plt.show() ``` #### 构建模型架构 构建适合于色彩化的 CNN 模型时,可以采用编码器-解码器结构。该结构先通过一系列下采样操作提取特征,在此过程中逐渐减少空间分辨率;之后再经过多次反向传播过程恢复原始尺寸的同时预测每像素的颜色值[^1]。 ```python import tensorflow as tf from tensorflow.keras.layers import Conv2D, UpSampling2D, InputLayer from tensorflow.keras.models import Sequential model = Sequential([ InputLayer(input_shape=(None, None, 1)), # 输入为单通道的灰度图 # 编码部分 Conv2D(64, kernel_size=3, strides=2, padding="same", activation='relu'), Conv2D(128, kernel_size=3, strides=2, padding="same", activation='relu'), # 解码部分 UpSampling2D(size=(2, 2)), Conv2D(64, kernel_size=3, padding="same", activation='relu'), UpSampling2D(size=(2, 2)), Conv2D(2, kernel_size=3, padding="same"), # 输出两个通道表示ab颜色分 ]) ``` #### 训练与评估 完成上述准备工作后就可以开始编译并训练这个模型了。需要注意的是,由于目标是从给定的一张灰度照片估计出完整的LAB色彩空间中的a*和b*成分,因此损失函数的选择至关重要——这里推荐均方误差(MSE)。 ```python # 假设已经定义好了train_generator 和 val_generator 来提供批的数据流 optimizer = tf.keras.optimizers.Adam() model.compile(optimizer=optimizer, loss=tf.keras.losses.MeanSquaredError()) history = model.fit(train_generator, epochs=epochs_num, validation_data=val_generator) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值