Files
Web_BLS_ProjectConsole/docs/redis-integration-protocol.md
XuJiacheng 7ac3949dfa feat: 重构项目心跳为Redis LIST并更新相关文档
重构项目心跳数据结构为Redis LIST,更新相关文档和OpenSpec规范。主要变更包括:
- 将项目心跳从STRING改为LIST类型
- 更新后端服务以支持LIST操作
- 同步更新文档和OpenSpec规范
- 统一后端端口为3001
- 添加部署指南和Windows部署文档

修复前端API请求路径,移除硬编码的localhost地址。添加PM2和Nginx配置文件模板,完善部署流程文档。更新Redis集成协议文档,明确LIST数据结构和外部项目对接规范。
2026-01-17 18:36:52 +08:00

254 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Redis 对接协议(供外部项目 AI 生成代码使用)
本文档定义"外部项目 ↔ BLS Project Console"之间通过 Redis 交互的 **Key 命名、数据类型、写入方式、读取方式与数据格式**
注:本仓库对外暴露的 Redis 连接信息如下(供对方直接连接以写入心跳/日志):
- 地址:`10.8.8.109`
- 端口:默认 `6379`
- 密码:无(空)
- 数据库:固定 `15`
示例(环境变量):
```
REDIS_HOST=10.8.8.109
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=15
```
示例redis-cli
```
redis-cli -h 10.8.8.109 -p 6379 -n 15
```
> 约束:每个需要关联本控制台的外部项目,必须在同一个 RedisDB15
> - 更新 `项目心跳`(项目列表 + 心跳信息)
> - 追加 `${projectName}_项目控制台`(日志队列)
> - 命令下发为 HTTP API 调用(不通过 Redis 下发命令)
## 1. 命名约定
令:
- `projectName`:外部项目名称(建议只用字母数字下划线 `A-Za-z0-9_`;如使用中文也可,但需保证统一且 UTF-8
固定后缀:
- 控制台:`${projectName}_项目控制台`
示例projectName = `订单系统`
- `订单系统_项目控制台`
## 2. 外部项目需要写入的 2 个 Key
说明:当前控制台左侧“项目选择列表”只读取 `项目心跳`LIST。因此外部项目必须维护该 Key否则项目不会出现在列表中。
### 2.1 `项目心跳`
- Redis 数据类型:**LIST**
- 写入方式(推荐 FIFO`RPUSH 项目心跳 <json>`
- value每个列表元素为“项目心跳记录”的 JSON 字符串
示例(与当前代码读取一致;下面示例表示“逻辑结构”):
```json
[
{
"projectName": "BLS主机心跳日志",
"apiBaseUrl": "http://127.0.0.1:3000",
"lastActiveAt": 1768566165572
}
]
```
示例Redis 写入命令):
```
RPUSH 项目心跳 "{\"projectName\":\"BLS主机心跳日志\",\"apiBaseUrl\":\"http://127.0.0.1:3000\",\"lastActiveAt\":1768566165572}"
```
字段说明(每条心跳记录):
- `projectName`:项目名称(用于拼接日志 Key`${projectName}_项目控制台`
- `apiBaseUrl`:目标项目对外提供的 API 地址(基地址,后端将基于它拼接 `apiName`
- `lastActiveAt`:活跃时间戳(毫秒)。建议每 **3 秒**刷新一次。
在线/离线判定BLS Project Console 使用):
-`now - lastActiveAt > 10_000ms`,则认为该应用 **离线**
- 否则认为 **在线**
建议:
- `lastActiveAt` 使用 `Date.now()` 生成(毫秒)
- 建议对 `项目心跳` 做长度控制(可选):例如每次写入后执行 `LTRIM 项目心跳 -2000 -1` 保留最近 2000 条
去重提示:
- `项目心跳` 为 LIST 时,外部项目周期性 `RPUSH` 会产生多条重复记录
- BLS Project Console 后端会按 `projectName` 去重,保留 `lastActiveAt` 最新的一条作为项目状态
### 2.2 `${projectName}_项目控制台`
- Redis 数据类型:**LIST**(作为项目向控制台追加的"消息队列/日志队列"
- 写入方式(推荐 FIFO`RPUSH ${projectName}_项目控制台 <json>`
value推荐格式一条 JSON 字符串,表示"错误/调试信息"或日志记录。
推荐 JSON Schema字段尽量保持稳定便于控制台解析
```json
{
"timestamp": "2026-01-12T12:34:56.789Z",
"level": "info",
"message": "连接成功",
"metadata": {
"module": "redis",
"host": "127.0.0.1"
}
}
```
字段说明:
- `timestamp`ISO-8601 时间字符串
- `level`:建议取值 `info|warn|error|debug`(小写)
- `message`:日志文本
- `metadata`:可选对象(附加信息)
## 3. 项目列表管理(重要)
### 3.1 项目列表结构
`项目心跳` 为 LIST列表元素为 JSON 字符串;其“逻辑结构”如下:
```json
[
{
"projectName": "订单系统",
"apiBaseUrl": "http://127.0.0.1:4001",
"lastActiveAt": 1760000000000
},
{
"projectName": "用户服务",
"apiBaseUrl": "http://127.0.0.1:4002",
"lastActiveAt": 1760000000001
}
]
```
### 3.2 外部项目对接建议
外部项目应当:
1. 定期写入 `项目心跳`RPUSH 自己的心跳记录;允许产生多条记录,由控制台按 projectName 去重)
2. 追加 `${projectName}_项目控制台` 日志
## 4. 命令下发方式HTTP API 控制)
由 BLS Project Console 后端根据目标项目心跳里的 `apiBaseUrl` 直接调用目标项目 HTTP API。
### 4.1 控制台输入格式
一行文本按空格拆分:
- 第一个 token`apiName`(接口名/路径片段)
- 剩余 token参数列表字符串数组
示例:
- `reload`
- `reload force`
- `user/refreshCache tenantA`
### 4.2 目标项目需要提供的 API
后端默认使用 `POST` 调用:
- `POST {apiBaseUrl}/{apiName}`
请求体JSON示例
```json
{
"commandId": "cmd-1700000000000-abc123",
"timestamp": "2026-01-13T00:00:00.000Z",
"source": "BLS Project Console",
"apiName": "reload",
"args": ["force"],
"argsText": "force"
}
```
字段说明:
- `commandId`:唯一命令标识符
- `timestamp`命令发送时间ISO-8601 格式)
- `source`:命令来源标识
- `apiName`API 接口名
- `args`:参数数组
- `argsText`:参数文本(空格连接)
返回建议:
- 2xx 表示成功
- 非 2xx 表示失败(控制台会展示 upstreamStatus 与部分返回内容)
### 4.3 在线/离线判定
发送命令前,系统会检查项目在线状态:
-`项目心跳` 列表读取 `lastActiveAt`
-`now - lastActiveAt > 10_000ms`,则认为该应用 **离线**,拒绝发送命令
- 否则认为 **在线**,允许发送命令
## 5. 与本项目代码的对应关系
- **后端 `/api/projects`**:只从 `项目心跳`LIST读取项目列表返回所有项目及其在线状态
- **后端 `/api/commands`**:从 `项目心跳` 中查找目标项目的 `apiBaseUrl/lastActiveAt`,在线时调用目标项目 API
- **后端 `/api/logs`**:读取 `${projectName}_项目控制台`LIST并基于 `项目心跳` 中该项目的 `lastActiveAt` 计算在线/离线与 API 地址信息
## 6. 兼容与错误处理建议
- JSON 解析失败:外部项目应记录错误,并丢弃该条消息(避免死循环阻塞消费)。
- 消息过长:建议控制单条消息大小(例如 < 64KB
- 字符编码:统一 UTF-8。
- 心跳超时:建议外部项目每 3 秒更新一次心跳,避免被误判为离线。
## 7. 数据迁移工具(旧数据导入)
如果需要从旧格式迁移到新格式,可使用以下 API
```bash
POST /api/projects/migrate
Content-Type: application/json
{
"deleteOldKeys": false,
"dryRun": false
}
```
参数说明:
- `deleteOldKeys`:是否删除旧格式键(默认 false
- `dryRun`:是否仅模拟运行(默认 false
返回示例:
```json
{
"success": true,
"message": "数据迁移完成",
"migrated": 2,
"projects": [...],
"listKey": "项目心跳",
"deleteOldKeys": false
}
```