admin_backend/sdk/abtest/readme.md
2026-04-16 10:20:16 +08:00

3.8 KiB
Raw Permalink Blame History

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