# 后端服务开发文档 ## 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. **开发建议**:代码规范、测试策略和部署建议 通过本文档,开发人员可以快速了解系统架构,掌握开发和部署流程,确保系统的稳定性和可靠性。