|
|
# 后端服务开发文档
|
|
|
|
|
|
## 1. 项目结构
|
|
|
|
|
|
```
|
|
|
backend/
|
|
|
├── src/
|
|
|
│ ├── api/ # API路由
|
|
|
│ ├── config/ # 配置管理
|
|
|
│ ├── services/ # 业务服务
|
|
|
│ │ └── datasource/ # 数据源实现
|
|
|
│ ├── app.ts # 应用入口
|
|
|
│ └── index.ts # 导出模块
|
|
|
├── python_service/ # Python TQAPI服务
|
|
|
│ ├── api/ # Python API路由
|
|
|
│ ├── main.py # Python服务入口
|
|
|
│ └── tqapi_service.py # TQAPI服务实现
|
|
|
├── config.json # 配置文件
|
|
|
├── package.json # Node.js依赖
|
|
|
└── tsconfig.json # TypeScript配置
|
|
|
```
|
|
|
|
|
|
## 2. 核心功能
|
|
|
|
|
|
### 2.1 数据源管理
|
|
|
|
|
|
- **TQDataSource**:使用Python服务获取天勤量化数据
|
|
|
- **MockDataSource**:提供模拟数据,用于测试
|
|
|
- **DataSourceFactory**:数据源工厂,负责创建和管理数据源实例
|
|
|
|
|
|
### 2.2 Python TQAPI服务
|
|
|
|
|
|
- **功能**:与天勤量化SDK交互,提供期货市场数据
|
|
|
- **API端点**:合约列表、合约详情、K线数据、Tick数据
|
|
|
- **端口配置**:支持动态端口配置
|
|
|
|
|
|
### 2.3 集成服务
|
|
|
|
|
|
- **自动启动**:当使用TQSDK数据源时,自动启动Python服务
|
|
|
- **端口同步**:确保Python服务端口与Node.js连接端口一致
|
|
|
|
|
|
## 3. 关键修改
|
|
|
|
|
|
### 3.1 Python服务管理器修改
|
|
|
|
|
|
**文件**:`backend/src/services/datasource/PythonServiceManager.ts`
|
|
|
|
|
|
**修改内容**:
|
|
|
- 从配置中读取 `pythonPort`,默认8000
|
|
|
- 启动Python服务时传递端口参数
|
|
|
- 确保Python服务与Node.js服务端口一致
|
|
|
|
|
|
**关键代码**:
|
|
|
```typescript
|
|
|
// 从配置中读取端口,默认8000
|
|
|
const port = config.dataSource?.tqsdk?.pythonPort || 8000;
|
|
|
|
|
|
// 启动Python服务,传递端口参数
|
|
|
this.pythonProcess = spawn('python', [pythonServicePath, '--port', port.toString()], {
|
|
|
cwd: path.join(__dirname, '../../../python_service'),
|
|
|
stdio: 'inherit',
|
|
|
shell: true
|
|
|
});
|
|
|
```
|
|
|
|
|
|
### 3.2 Python服务入口修改
|
|
|
|
|
|
**文件**:`backend/python_service/main.py`
|
|
|
|
|
|
**修改内容**:
|
|
|
- 添加命令行参数解析
|
|
|
- 支持通过 `--port` 参数设置服务端口
|
|
|
- 默认端口为8000
|
|
|
|
|
|
**关键代码**:
|
|
|
```python
|
|
|
# 解析命令行参数
|
|
|
parser = argparse.ArgumentParser(description="天勤量化 API 服务")
|
|
|
parser.add_argument("--port", type=int, default=8000, help="服务端口,默认8000")
|
|
|
parser.add_argument("--host", type=str, default="0.0.0.0", help="服务主机,默认0.0.0.0")
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
# 启动服务
|
|
|
print(f"启动天勤量化 API 服务,监听 {args.host}:{args.port}")
|
|
|
uvicorn.run(app, host=args.host, port=args.port)
|
|
|
```
|
|
|
|
|
|
### 3.3 TQDataSource修改
|
|
|
|
|
|
**文件**:`backend/src/services/datasource/TQDataSource.ts`
|
|
|
|
|
|
**修改内容**:
|
|
|
- 从配置中读取 `pythonPort`,默认8000
|
|
|
- 动态构建Python服务URL,使用配置的端口
|
|
|
- 确保与Python服务端口一致
|
|
|
|
|
|
**关键代码**:
|
|
|
```typescript
|
|
|
// 从配置中读取端口,默认8000
|
|
|
const port = config.pythonPort || 8000;
|
|
|
this.config = {
|
|
|
// 其他配置...
|
|
|
pythonServiceUrl: config.pythonServiceUrl || `http://127.0.0.1:${port}/api`
|
|
|
};
|
|
|
```
|
|
|
|
|
|
### 3.4 应用启动逻辑修改
|
|
|
|
|
|
**文件**:`backend/src/app.ts`
|
|
|
|
|
|
**修改内容**:
|
|
|
- 在启动时检查配置,自动启动Python服务
|
|
|
- 确保服务启动顺序正确
|
|
|
|
|
|
**关键代码**:
|
|
|
```typescript
|
|
|
// 启动前检查是否需要启动Python TQAPI服务
|
|
|
async function startServer() {
|
|
|
try {
|
|
|
// 检查配置,是否使用TQSDK数据源
|
|
|
if (config.dataSource?.defaultDataSource === 'tqsdk' ||
|
|
|
(config.dataSource?.tqsdk && config.dataSource.tqsdk.enabled)) {
|
|
|
console.log('检测到使用TQSDK数据源,准备启动Python服务...');
|
|
|
const pythonStarted = await pythonServiceManager.start();
|
|
|
if (!pythonStarted) {
|
|
|
console.warn('Python服务启动失败,可能会影响TQSDK数据获取');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 启动Express服务器
|
|
|
app.listen(port, () => {
|
|
|
console.log(`服务器运行在 http://localhost:${port}`);
|
|
|
});
|
|
|
} catch (error) {
|
|
|
console.error('启动服务器时出错:', error);
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
## 4. 配置说明
|
|
|
|
|
|
### 4.1 配置文件结构
|
|
|
|
|
|
**文件**:`config.json`
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"server": {
|
|
|
"port": 3007
|
|
|
},
|
|
|
"dataSource": {
|
|
|
"tqsdk": {
|
|
|
"enabled": true,
|
|
|
"username": "你的天勤账号",
|
|
|
"password": "你的天勤密码",
|
|
|
"timeout": 30000,
|
|
|
"retries": 3,
|
|
|
"maxConnections": 5,
|
|
|
"pythonPort": 8000
|
|
|
},
|
|
|
"defaultDataSource": "tqsdk"
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 4.2 关键配置项
|
|
|
|
|
|
| 配置项 | 类型 | 默认值 | 说明 |
|
|
|
|--------|------|--------|------|
|
|
|
| `server.port` | number | 3007 | Node.js服务端口 |
|
|
|
| `dataSource.tqsdk.enabled` | boolean | true | 是否启用TQSDK数据源 |
|
|
|
| `dataSource.tqsdk.username` | string | "" | 天勤量化账号 |
|
|
|
| `dataSource.tqsdk.password` | string | "" | 天勤量化密码 |
|
|
|
| `dataSource.tqsdk.pythonPort` | number | 8000 | Python服务端口 |
|
|
|
| `dataSource.defaultDataSource` | string | "tqsdk" | 默认数据源 |
|
|
|
|
|
|
## 5. 启动方法
|
|
|
|
|
|
### 5.1 依赖安装
|
|
|
|
|
|
#### Node.js 依赖
|
|
|
|
|
|
在 `backend` 目录下执行:
|
|
|
|
|
|
```bash
|
|
|
npm install
|
|
|
```
|
|
|
|
|
|
#### Python 依赖
|
|
|
|
|
|
在 `backend/python_service` 目录下执行:
|
|
|
|
|
|
```bash
|
|
|
pip install -r requirements.txt
|
|
|
```
|
|
|
|
|
|
### 5.2 启动服务
|
|
|
|
|
|
#### 方法一:使用启动脚本
|
|
|
|
|
|
执行 `start_services.bat` 脚本:
|
|
|
|
|
|
```bash
|
|
|
./start_services.bat
|
|
|
```
|
|
|
|
|
|
#### 方法二:手动启动
|
|
|
|
|
|
1. **启动 Node.js 服务**:
|
|
|
```bash
|
|
|
cd backend
|
|
|
npm run dev
|
|
|
```
|
|
|
|
|
|
2. **启动 Python 服务**(自动启动,无需手动):
|
|
|
- 当使用TQSDK数据源时,Node.js服务会自动启动Python服务
|
|
|
|
|
|
### 5.3 服务验证
|
|
|
|
|
|
- **Node.js 服务**:访问 http://localhost:3007/health
|
|
|
- **Python TQAPI 服务**:访问 http://localhost:8000/health
|
|
|
|
|
|
## 6. 注意事项
|
|
|
|
|
|
### 6.1 端口配置
|
|
|
|
|
|
- **端口一致性**:确保 `config.json` 中的 `pythonPort` 与 Python 服务实际使用的端口一致
|
|
|
- **端口冲突**:避免使用已被其他程序占用的端口
|
|
|
- **默认端口**:如果未配置 `pythonPort`,默认使用8000
|
|
|
|
|
|
### 6.2 依赖管理
|
|
|
|
|
|
- **Python版本**:建议使用 Python 3.7+
|
|
|
- **Node.js版本**:建议使用 Node.js 16+
|
|
|
- **依赖更新**:定期更新依赖包,确保安全性和稳定性
|
|
|
|
|
|
### 6.3 数据源配置
|
|
|
|
|
|
- **天勤账号**:确保天勤量化账号正确且已激活
|
|
|
- **网络连接**:确保网络连接正常,能够访问天勤量化服务器
|
|
|
- **备用方案**:当TQSDK数据源不可用时,可切换到MockDataSource
|
|
|
|
|
|
### 6.4 错误处理
|
|
|
|
|
|
- **Python服务启动失败**:检查Python是否安装,依赖是否完整
|
|
|
- **TQSDK连接失败**:检查网络连接,账号密码是否正确
|
|
|
- **数据获取失败**:检查合约代码是否正确,网络连接是否稳定
|
|
|
|
|
|
### 6.5 性能优化
|
|
|
|
|
|
- **连接池**:合理设置 `maxConnections`,避免连接过多
|
|
|
- **超时设置**:设置合理的 `timeout`,避免请求等待时间过长
|
|
|
- **重试机制**:通过 `retries` 配置,提高数据获取的可靠性
|
|
|
|
|
|
## 7. 故障排查
|
|
|
|
|
|
### 7.1 常见问题
|
|
|
|
|
|
#### 问题1:Python服务启动失败
|
|
|
|
|
|
**症状**:
|
|
|
- Node.js服务启动时提示Python服务启动失败
|
|
|
- 日志显示Python相关错误
|
|
|
|
|
|
**解决方案**:
|
|
|
- 检查Python是否安装:`python --version`
|
|
|
- 检查Python依赖:`pip install -r requirements.txt`
|
|
|
- 检查端口是否被占用:`netstat -ano | findstr :8000`
|
|
|
|
|
|
#### 问题2:TQSDK连接失败
|
|
|
|
|
|
**症状**:
|
|
|
- 日志显示"连接到天勤服务器失败"
|
|
|
- 数据获取API返回错误
|
|
|
|
|
|
**解决方案**:
|
|
|
- 检查天勤账号密码是否正确
|
|
|
- 检查网络连接是否正常
|
|
|
- 尝试手动登录天勤量化客户端,确认账号状态
|
|
|
|
|
|
#### 问题3:端口不一致
|
|
|
|
|
|
**症状**:
|
|
|
- 日志显示"fetch failed"错误
|
|
|
- 提示连接到错误端口
|
|
|
|
|
|
**解决方案**:
|
|
|
- 检查 `config.json` 中的 `pythonPort` 配置
|
|
|
- 确保Python服务实际使用的端口与配置一致
|
|
|
- 重启服务,确保配置生效
|
|
|
|
|
|
### 7.2 日志查看
|
|
|
|
|
|
- **Node.js日志**:在启动Node.js服务的终端中查看
|
|
|
- **Python日志**:在启动Python服务的终端中查看
|
|
|
- **API日志**:通过访问API端点,查看返回结果和错误信息
|
|
|
|
|
|
## 8. 开发建议
|
|
|
|
|
|
### 8.1 代码规范
|
|
|
|
|
|
- **TypeScript**:使用TypeScript编写Node.js代码,提高代码质量
|
|
|
- **ESLint**:使用ESLint检查代码风格,确保代码一致性
|
|
|
- **注释**:为关键代码添加注释,提高可维护性
|
|
|
|
|
|
### 8.2 测试策略
|
|
|
|
|
|
- **单元测试**:为核心功能编写单元测试
|
|
|
- **集成测试**:测试不同组件之间的集成
|
|
|
- **Mock数据**:使用MockDataSource进行测试,避免依赖外部服务
|
|
|
|
|
|
### 8.3 部署建议
|
|
|
|
|
|
- **环境变量**:使用环境变量存储敏感信息
|
|
|
- **配置管理**:使用配置文件管理不同环境的配置
|
|
|
- **监控告警**:添加监控和告警机制,及时发现问题
|
|
|
|
|
|
### 8.4 扩展性
|
|
|
|
|
|
- **模块化**:保持代码模块化,便于扩展和维护
|
|
|
- **接口设计**:设计清晰的接口,便于添加新功能
|
|
|
- **数据源扩展**:通过DataSourceFactory,可以方便地添加新的数据源实现
|
|
|
|
|
|
## 9. 总结
|
|
|
|
|
|
本开发文档提供了AI期货分析系统后端服务的详细说明,包括:
|
|
|
|
|
|
1. **项目结构**:清晰的目录结构和文件组织
|
|
|
2. **核心功能**:数据源管理、Python TQAPI服务和集成服务
|
|
|
3. **关键修改**:端口配置、服务集成和启动逻辑
|
|
|
4. **配置说明**:详细的配置项和默认值
|
|
|
5. **启动方法**:多种启动方式和服务验证
|
|
|
6. **注意事项**:端口配置、依赖管理和错误处理
|
|
|
7. **故障排查**:常见问题和解决方案
|
|
|
8. **开发建议**:代码规范、测试策略和部署建议
|
|
|
|
|
|
通过本文档,开发人员可以快速了解系统架构,掌握开发和部署流程,确保系统的稳定性和可靠性。
|