AB测试微服务
基于 Go Gin 框架 + MySQL 的轻量级 AB 测试微服务,适用于游戏服务端的实验分流与数据追踪。
项目结构
abtest/
├── main.go # 入口
├── config/ # 配置(环境变量)
├── model/ # 数据模型 & 请求/响应结构
├── dao/ # 数据访问层
├── service/ # 业务逻辑层(含哈希分流算法)
├── handler/ # HTTP Handler
├── router/ # 路由注册
└── sql/init.sql # 数据库建表脚本
快速开始
1. 初始化数据库
mysql -u root -p < sql/init.sql
2. 配置环境变量(可选,有默认值)
| 变量 |
默认值 |
说明 |
| SERVER_PORT |
8080 |
服务端口 |
| MYSQL_HOST |
127.0.0.1 |
MySQL 地址 |
| MYSQL_PORT |
3306 |
MySQL 端口 |
| MYSQL_USER |
root |
MySQL 用户 |
| MYSQL_PASSWORD |
|
MySQL 密码 |
| MYSQL_DBNAME |
abtest |
数据库名 |
3. 编译运行
go build -o abtest.exe .
./abtest.exe
API 接口
基础路径: /api/v1
实验管理
| 方法 |
路径 |
说明 |
| POST |
/experiments |
创建实验 |
| GET |
/experiments |
实验列表(支持 ?status=&page=&page_size=) |
| GET |
/experiments/:id |
获取实验详情 |
| PUT |
/experiments/:id |
更新实验(名称/描述/状态/时间) |
| DELETE |
/experiments/:id |
删除实验(级联删除变体/分配/事件) |
实验状态: 0-草稿 1-运行中 2-已暂停 3-已结束
变体管理
| 方法 |
路径 |
说明 |
| POST |
/experiments/:id/variants |
创建变体 |
| GET |
/experiments/:id/variants |
变体列表 |
| PUT |
/experiments/:id/variants/:variantId |
更新变体 |
| DELETE |
/experiments/:id/variants/:variantId |
删除变体 |
用户分流
| 方法 |
路径 |
说明 |
| POST |
/experiments/:id/assign |
为用户分配变体 |
- 基于 MD5 哈希的确定性分流,同一用户始终分到同一组
- 支持按权重(weight)设置各变体流量比例
事件追踪
| 方法 |
路径 |
说明 |
| POST |
/experiments/:id/events |
上报事件(exposure/conversion) |
实验结果
| 方法 |
路径 |
说明 |
| GET |
/experiments/:id/results |
获取实验统计(各变体曝光数、转化数、转化率) |
使用示例
# 1. 创建实验
curl -X POST http://localhost:8080/api/v1/experiments \
-H "Content-Type: application/json" \
-d '{"name": "new_ui_test", "description": "测试新UI效果"}'
# 2. 创建变体
curl -X POST http://localhost:8080/api/v1/experiments/1/variants \
-H "Content-Type: application/json" \
-d '{"name": "control", "weight": 50, "params": {"ui": "old"}}'
curl -X POST http://localhost:8080/api/v1/experiments/1/variants \
-H "Content-Type: application/json" \
-d '{"name": "treatment", "weight": 50, "params": {"ui": "new"}}'
# 3. 启动实验(设置状态为1)
curl -X PUT http://localhost:8080/api/v1/experiments/1 \
-H "Content-Type: application/json" \
-d '{"status": 1}'
# 4. 用户分流
curl -X POST http://localhost:8080/api/v1/experiments/1/assign \
-H "Content-Type: application/json" \
-d '{"user_id": "player_10001"}'
# 5. 上报曝光事件
curl -X POST http://localhost:8080/api/v1/experiments/1/events \
-H "Content-Type: application/json" \
-d '{"user_id": "player_10001", "event_type": "exposure"}'
# 6. 上报转化事件
curl -X POST http://localhost:8080/api/v1/experiments/1/events \
-H "Content-Type: application/json" \
-d '{"user_id": "player_10001", "event_type": "conversion", "event_value": 1}'
# 7. 查看实验结果
curl http://localhost:8080/api/v1/experiments/1/results