# marketserver
**Repository Path**: trackerchain/marketserver
## Basic Information
- **Project Name**: marketserver
- **Description**: 期货行情服务
- **Primary Language**: Go
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-10-09
- **Last Updated**: 2025-10-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# MarketServer - 期货行情服务系统




**一个基于 Go 语言开发的高性能期货行情服务系统**
## 📖 项目简介
MarketServer 是一个专为期货交易场景设计的实时行情服务系统,提供完整的命令行工具和 WebSocket 实时数据推送服务。系统采用模块化设计,支持多种期货合约的实时行情数据生成、分发和管理。
### 🎯 核心特性
- 🚀 **实时行情推送**: 基于 WebSocket 的高性能实时数据推送
- 📊 **期货合约管理**: 支持多种期货合约的行情数据生成和管理
- 📈 **K线数据服务**: 支持多时间周期K线数据生成和实时推送 (1分钟、5分钟、日线等)
- 🔐 **用户管理系统**: 完整的用户注册、认证和权限管理
- 🔑 **API KEY 验证**: 基于 JWT Token 的安全认证机制
- ⚙️ **灵活配置系统**: 完整的配置管理,支持交易所连接、风控参数等
- 🔧 **命令行工具**: 基于 Cobra 的强大 CLI 工具,操作简单直观
- 🌐 **Web 管理界面**: 内置 Web 界面,方便监控和测试
- 📊 **模拟数据生成**: 内置智能行情数据生成器,支持真实市场波动模拟
- 📝 **企业级日志系统**: 基于 Logrus + Lumberjack 的结构化日志,支持文件轮转和多级别输出
## 🏗️ 系统架构
```
MarketServer
├── CLI 命令行工具
│ ├── 服务器管理 (server)
│ ├── 订阅服务 (subscribe)
│ ├── 用户管理 (user)
│ ├── 配置管理 (config)
│ └── 版本信息 (version)
├── 用户管理系统
│ ├── 用户注册/登录 (Service)
│ ├── JWT Token 认证 (JWT)
│ ├── API KEY 管理 (Database)
│ └── 权限控制 (Models)
├── WebSocket 服务
│ ├── 连接管理 (Hub)
│ ├── API KEY 验证 (Auth)
│ ├── 实时推送 (Server)
│ ├── Tick数据生成 (Generator)
│ └── K线数据生成 (KlineGenerator)
├── 日志系统
│ ├── 结构化日志 (Logrus)
│ ├── 文件轮转 (Lumberjack)
│ ├── 多输出支持 (Console + File)
│ └── 日志级别控制 (Info/Warn/Error/Debug)
└── Web 管理界面
├── 状态监控
├── 测试工具
└── API 接口
```
### 🛠️ 技术栈
- **编程语言**: Go 1.24.7
- **Web框架**: Gorilla WebSocket
- **命令行工具**: Cobra CLI
- **配置管理**: Viper
- **数据库**: SQLite3
- **身份认证**: JWT (golang-jwt/jwt)
- **日志系统**: Logrus + Lumberjack
- **UUID生成**: Google UUID
- **并发处理**: Go Goroutines + Channels
## 🚀 快速开始
### 环境要求
- Go 1.24.7 或更高版本
- Windows/Linux/macOS 操作系统
### 安装步骤
```bash
# 1. 克隆项目
git clone
cd marketserver
# 2. 安装依赖
go mod tidy
# 3. 构建可执行文件
go build -o marketserver.exe .
# 4. 验证安装
./marketserver.exe --help
```
### 快速启动
```bash
# 1. 启动期货行情服务器
./marketserver.exe server start
# 2. 创建测试用户 (新终端窗口)
./marketserver.exe user create --email test@example.com --name "测试用户"
# 3. 查看用户信息和API KEY
./marketserver.exe user get --email test@example.com
# 4. 访问管理界面测试WebSocket连接
# 浏览器打开: http://localhost:8081
```
### 完整使用示例
```bash
# 步骤1: 启动服务器
./marketserver.exe server start
# 步骤2: 创建用户并获取API KEY
./marketserver.exe user create --email trader@example.com --name "交易员"
# 输出示例:
# 用户创建成功!
# 用户ID: 1
# 邮箱: trader@example.com
# 姓名: 交易员
# API密钥: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
# 状态: 启用
# 步骤3: 使用API KEY连接WebSocket (JavaScript示例)
```
```javascript
// 使用API KEY连接WebSocket
const apiKey = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // 从步骤2获取
const ws = new WebSocket(`ws://localhost:8081/ws?api_key=${apiKey}`);
ws.onopen = function() {
console.log("连接成功");
// 订阅沪铜期货Tick行情
ws.send(JSON.stringify({
action: "subscribe",
symbol: "CU2501",
type: "tick"
}));
};
ws.onmessage = function(event) {
const data = JSON.parse(event.data);
console.log("收到数据:", data);
};
```
## 📋 命令参考
### 🖥️ 服务器管理 (server)
```bash
# 启动服务器
./marketserver.exe server start
./marketserver.exe server start --port 8080 --ws-port 8081 --host 0.0.0.0
# 停止服务器
./marketserver.exe server stop
# 查看服务器状态
./marketserver.exe server status
```
**参数说明:**
- `--port, -p`: HTTP 服务器端口 (默认: 8080)
- `--ws-port, -w`: WebSocket 服务器端口 (默认: 8081)
- `--host`: 服务器监听地址 (默认: localhost)
- `--log-level`: 日志级别 (默认: info)
### 👥 用户管理 (user)
```bash
# 创建新用户
./marketserver.exe user create --email user@example.com --name "用户名"
# 查看用户列表
./marketserver.exe user list
./marketserver.exe user list --page 1 --size 10 --verbose
# 查看用户详情
./marketserver.exe user get --id 1
./marketserver.exe user get --email user@example.com
# 更新用户信息
./marketserver.exe user update --id 1 --name "新用户名"
./marketserver.exe user update --id 1 --status disabled
# 删除用户
./marketserver.exe user delete --id 1
# 重置用户API密钥
./marketserver.exe user reset-key --id 1
./marketserver.exe user reset-key --email user@example.com
```
**参数说明:**
- `--email, -e`: 用户邮箱地址 (必填,用于创建和查询)
- `--name, -n`: 用户姓名 (必填,用于创建)
- `--id`: 用户ID (用于查询、更新、删除)
- `--status`: 用户状态 (enabled/disabled)
- `--page`: 分页页码 (默认: 1)
- `--size`: 每页大小 (默认: 10)
- `--verbose, -v`: 显示详细信息
**用户状态:**
- `enabled`: 启用状态,可以正常使用API
- `disabled`: 禁用状态,无法使用API
### 📡 订阅服务 (subscribe)
```bash
# 订阅指定合约Tick行情
./marketserver.exe subscribe start --contract CU2501
./marketserver.exe subscribe start --url ws://localhost:8081/ws
# 订阅指定合约K线数据
./marketserver.exe subscribe start --contract CU2501 --type kline --period 1m
./marketserver.exe subscribe start --contract CU2501 --type kline --period 5m
./marketserver.exe subscribe start --contract CU2501 --type kline --period 1d
# 订阅所有合约Tick行情
./marketserver.exe subscribe start
# 订阅所有合约K线数据
./marketserver.exe subscribe start --contract ALL --type kline --period 1m
# 列出可用合约
./marketserver.exe subscribe list
```
**订阅类型说明:**
- `--type tick`: 订阅实时Tick行情数据 (默认)
- `--type kline`: 订阅K线数据
**K线周期参数 (--period):**
- `1m`: 1分钟K线
- `5m`: 5分钟K线
- `15m`: 15分钟K线
- `30m`: 30分钟K线
- `1h`: 1小时K线
- `1d`: 日K线
- `1w`: 周K线
- `1M`: 月K线
### ⚙️ 配置管理 (config)
```bash
# 查看所有配置
./marketserver.exe config get
# 查看特定配置
./marketserver.exe config get server.port
# 设置配置
./marketserver.exe config set server.port 9090
# 列出配置项
./marketserver.exe config list
# 重置配置
./marketserver.exe config reset server.port --force
```
**可用子命令:**
- `get`: 获取配置值
- `list`: 列出所有配置项
- `reset`: 重置配置
- `set`: 设置配置值
### 📦 版本信息 (version)
```bash
# 显示版本信息
./marketserver.exe version
./marketserver.exe version --detailed
```
## 🔌 WebSocket API
### 连接地址
```
ws://localhost:8081/ws
```
### 🔐 API KEY 验证
WebSocket 连接需要提供有效的 API KEY 进行身份验证:
```javascript
// 连接时在URL中提供API KEY
const ws = new WebSocket('ws://localhost:8081/ws?api_key=YOUR_API_KEY');
// 或者在连接建立后发送认证消息
const authMessage = {
"action": "auth",
"api_key": "YOUR_API_KEY"
};
ws.send(JSON.stringify(authMessage));
```
**获取 API KEY:**
```bash
# 创建用户时会自动生成API KEY
./marketserver.exe user create --email user@example.com --name "用户名"
# 重置现有用户的API KEY
./marketserver.exe user reset-key --email user@example.com
```
**认证响应:**
```json
{
"type": "auth_success",
"message": "认证成功",
"user": {
"id": 1,
"email": "user@example.com",
"name": "用户名"
}
}
```
### 消息格式
**订阅Tick行情:**
```json
{
"action": "subscribe",
"symbol": "CU2501",
"type": "tick"
}
```
**订阅K线数据:**
```json
{
"action": "subscribe",
"symbol": "CU2501",
"type": "kline",
"period": "1m"
}
```
**订阅所有合约Tick行情:**
```json
{
"action": "subscribe",
"symbol": "",
"type": "tick"
}
```
**订阅所有合约K线数据:**
```json
{
"action": "subscribe",
"symbol": "ALL",
"type": "kline",
"period": "1m"
}
```
**取消订阅:**
```json
{
"action": "unsubscribe",
"symbol": "CU2501",
"type": "tick"
}
```
### 数据格式
**Tick行情数据:**
```json
{
"type": "data",
"data": {
"symbol": "CU2501",
"name": "沪铜2501",
"price": 74520.0,
"change": 120.0,
"changePercent": 0.16,
"volume": 15420,
"openInterest": 89650,
"timestamp": "2024-01-15T14:30:00Z"
}
}
```
**K线数据:**
```json
{
"type": "kline",
"data": {
"symbol": "CU2501",
"name": "沪铜2501",
"period": "1m",
"timestamp": "2024-01-15T14:30:00Z",
"open": 74500.0,
"high": 74580.0,
"low": 74480.0,
"close": 74520.0,
"volume": 1542,
"amount": 0.85,
"change": 20.0,
"changePercent": 0.027
}
}
```
**响应消息:**
```json
{
"type": "success",
"message": "订阅成功: CU2501"
}
```
## 🌐 HTTP API
### 基础地址
```
http://localhost:8081/api/
```
### 接口列表
| 接口 | 方法 | 描述 |
|------|------|------|
| `/api/contracts` | GET | 获取所有期货合约列表 |
| `/api/status` | GET | 获取服务器状态信息 |
| `/api/users` | GET | 获取用户列表 (需要管理员权限) |
| `/api/users/{id}` | GET | 获取指定用户信息 |
| `/api/users` | POST | 创建新用户 |
| `/api/users/{id}` | PUT | 更新用户信息 |
| `/api/users/{id}` | DELETE | 删除用户 |
| `/api/users/{id}/reset-key` | POST | 重置用户API密钥 |
| `/` | GET | 管理界面首页 |
| `/test` | GET | WebSocket 测试页面 |
### 示例响应
**合约列表 (`/api/contracts`):**
```json
{
"success": true,
"data": [
{
"symbol": "CU2501",
"name": "沪铜2501",
"basePrice": 74400.0,
"lastPrice": 74520.0
}
]
}
```
**服务状态 (`/api/status`):**
```json
{
"success": true,
"data": {
"running": true,
"port": 8081,
"clients": 3,
"generator": true,
"contracts": 6,
"websocket_url": "ws://localhost:8081/ws",
"api_url": "http://localhost:8081/api/"
}
}
```
## ⚙️ 配置说明
### 服务器配置
- `server.host`: 服务器监听地址 (默认: localhost)
- `server.port`: HTTP 服务器端口 (默认: 8080)
- `server.log_level`: 日志级别 (默认: info)
### 日志系统配置
- `log.level`: 日志级别 (debug/info/warn/error,默认: info)
- `log.file.enabled`: 是否启用文件日志 (默认: true)
- `log.file.path`: 日志文件路径 (默认: logs/marketserver.log)
- `log.file.max_size`: 单个日志文件最大大小 (默认: 100MB)
- `log.file.max_backups`: 保留的备份文件数量 (默认: 10)
- `log.file.max_age`: 日志文件保留天数 (默认: 30天)
- `log.file.compress`: 是否压缩旧日志文件 (默认: true)
- `log.console.enabled`: 是否启用控制台输出 (默认: true)
- `log.format`: 日志格式 (text/json,默认: text)
### 数据库配置
- `database.path`: SQLite 数据库文件路径 (默认: ./data/users.db)
### 用户管理配置
- `jwt.secret`: JWT Token 签名密钥 (必须配置)
- `jwt.expiry`: Token 过期时间 (默认: 24h)
- `user.default_status`: 新用户默认状态 (默认: enabled)
## 📁 项目结构
```
marketserver/
├── main.go # 程序入口
├── cmd/ # 命令定义
│ ├── root.go # 根命令
│ ├── server.go # 服务器管理命令
│ ├── subscribe.go # 订阅服务命令
│ ├── user.go # 用户管理命令
│ ├── config.go # 配置管理命令
│ └── version.go # 版本信息命令
├── user/ # 用户管理模块
│ ├── models.go # 用户数据模型
│ ├── database.go # 数据库操作
│ ├── service.go # 用户服务层
│ └── jwt.go # JWT Token 处理
├── websocket/ # WebSocket 服务
│ ├── server.go # WebSocket 服务器
│ ├── hub.go # 连接管理中心
│ ├── generator.go # 行情数据生成器
│ └── types.go # 数据类型定义
├── logger/ # 日志系统模块
│ └── logger.go # 日志配置和封装
├── data/ # 数据目录
│ └── users.db # SQLite 用户数据库
├── logs/ # 日志文件目录
│ ├── marketserver.log # 当前日志文件
│ ├── marketserver.log.1 # 轮转备份文件
│ └── ... # 其他备份文件
├── go.mod # Go 模块文件
├── go.sum # 依赖校验文件
└── README.md # 项目文档
```
## 🔧 开发指南
### 本地开发
```bash
# 运行开发服务器
go run main.go server start
# 运行测试
go test ./...
# 代码格式化
go fmt ./...
# 静态检查
go vet ./...
```
### 构建发布
```bash
# 构建 Windows 版本
GOOS=windows GOARCH=amd64 go build -o marketserver.exe .
# 构建 Linux 版本
GOOS=linux GOARCH=amd64 go build -o marketserver .
# 构建 macOS 版本
GOOS=darwin GOARCH=amd64 go build -o marketserver .
```
## 🐛 故障排除
### 常见问题
**Q: WebSocket 连接失败**
```bash
# 检查服务器是否启动
./marketserver.exe server status
# 检查端口是否被占用
netstat -an | findstr :8081
```
**Q: 配置修改不生效**
```bash
# 重启服务器
./marketserver.exe server stop
./marketserver.exe server start
```
**Q: 行情数据不更新**
```bash
# 检查数据生成器状态
./marketserver.exe server status
```
**Q: API KEY 验证失败**
```bash
# 检查用户状态
./marketserver.exe user get --email user@example.com
# 重置API密钥
./marketserver.exe user reset-key --email user@example.com
```
**Q: 用户创建失败**
```bash
# 检查邮箱格式是否正确
# 检查用户是否已存在
./marketserver.exe user list | grep "user@example.com"
```
**Q: JWT Token 相关错误**
```bash
# 检查JWT密钥配置
./marketserver.exe config get jwt.secret
# 设置JWT密钥 (如果未配置)
./marketserver.exe config set jwt.secret "your-secret-key"
```
### 日志查看
服务器运行时会输出详细的日志信息,包括:
- WebSocket 连接状态
- 客户端订阅情况
- 行情数据推送记录
- 错误和异常信息
**日志文件位置:**
```bash
# 查看当前日志文件
tail -f logs/marketserver.log
# 查看日志文件列表
ls -la logs/
# 查看压缩的历史日志
zcat logs/marketserver.log.1.gz
```
**日志级别说明:**
- `DEBUG`: 调试信息,详细的程序执行流程
- `INFO`: 一般信息,正常的业务操作记录
- `WARN`: 警告信息,可能的问题但不影响运行
- `ERROR`: 错误信息,需要关注的异常情况
**Q: 日志文件过大或磁盘空间不足**
```bash
# 检查日志文件大小
du -h logs/
# 手动清理旧日志文件
rm logs/marketserver.log.*.gz
# 调整日志轮转配置
./marketserver.exe config set log.file.max_size 50 # 改为50MB
./marketserver.exe config set log.file.max_backups 5 # 只保留5个备份
```
**Q: 日志级别调整**
```bash
# 设置为调试级别 (输出更详细信息)
./marketserver.exe config set log.level debug
# 设置为错误级别 (只输出错误信息)
./marketserver.exe config set log.level error
# 重启服务器使配置生效
./marketserver.exe server stop
./marketserver.exe server start
```
## 📄 许可证
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
## 🤝 贡献指南
欢迎提交 Issue 和 Pull Request!
1. Fork 本项目
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request
## 📞 联系方式
如有问题或建议,请通过以下方式联系:
- 提交 Issue: [GitHub Issues](https://github.com/your-repo/marketserver/issues)
- 邮箱: your-email@example.com
---
**⭐ 如果这个项目对你有帮助,请给它一个 Star!**