This is an automated email from the ASF dual-hosted git repository. lizhimins pushed a commit to branch rocketmq-studio in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git
commit ef1596d0f15d45583dca9969155b095cc2104633 Author: lizhimins <[email protected]> AuthorDate: Wed Jul 8 10:12:00 2026 +0800 docs: add deployment config and bilingual README - Add Docker Compose deployment setup - Add Nginx reverse proxy configuration - Add deployment scripts and env templates - Add API specification document - Write bilingual README (English + Chinese) - Add project overview, architecture, and quick start guide --- README.md | 56 ++ README_zh.md | 56 ++ deploy/.env.example | 8 + deploy/README.md | 28 + deploy/deploy.sh | 185 +++++ deploy/docker-compose.yml | 24 + deploy/nginx.conf | 20 + docs/api-spec.md | 1696 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 2073 insertions(+) diff --git a/README.md b/README.md new file mode 100644 index 0000000..b4260eb --- /dev/null +++ b/README.md @@ -0,0 +1,56 @@ +# RocketMQ Studio + +**English** | [中文](README_zh.md) + +> Cross-cluster · Cross-architecture · Cross-cloud unified RocketMQ management platform + +RocketMQ Studio is a unified management platform for RocketMQ, supporting multi-cluster, multi-architecture, and multi-cloud environments. It provides instance management, cluster operations, Topic / Consumer Group CRUD, ACL permission control, message query and tracing, dead letter queue handling, monitoring alerts, audit logs, and an AI assistant. + +## Quick Start + +```bash +cd deploy && docker compose up -d --build +``` + +Visit **http://127.0.0.1:6789** after startup. + +**Studio ports:** Frontend 6789 (Nginx), Backend 8888 (Spring Boot) + +**RocketMQ ports:** NameServer 9876, Broker 10911, Proxy Remoting 8080, Proxy gRPC 8081 + +## Features + +| Module | Capabilities | +|--------|--------------| +| **Dashboard** | Global statistics for clusters, brokers, topics, and consumer groups with TPS trends | +| **Instances** | Multi-instance access (Proxy / Direct mode), instance CRUD | +| **Clusters** | Cluster details, Broker / NameServer / Proxy node operations, hot config updates | +| **K8s Certs** | TLS / mTLS / ServiceAccount certificate management and renewal | +| **Topics** | Topic CRUD, route viewer, consumer list, multi-type support (Normal / FIFO / Delay / Transaction / Lite) | +| **Consumer Groups** | Consumer group CRUD, consumption progress, subscription details, offset reset, config import/export | +| **ACL** | ACL rules and user management, v1 / v2 dual version support | +| **Messages** | Query by Topic / MsgId / Key / time range, message trace visualization | +| **Dead Letter Queue** | DLQ message viewing and batch resend | +| **Clients** | Producer / Consumer online connection list, protocol and language version stats | +| **Alert Rules** | Multi-dimensional alert rules (disk / lag / TPS / node offline), DingTalk / email / SMS notifications | +| **System Alerts** | System-level alert viewing, acknowledgment, and cleanup | +| **Audit Logs** | Operation audit log query, filter by type / time / result, history cleanup | +| **AI Assistant** | SSE streaming chat, supports query / diagnose / manage / general modes, MCP tool integration | +| **Settings** | General preferences, LLM config, datasource management | + +## Tech Stack + +- **Frontend** — React 18 + TypeScript + Vite + Ant Design + Tailwind CSS +- **Backend** — Java 21 + Spring Boot 3.5 + Hexagonal Architecture (ArchUnit enforced) +- **Deployment** — Docker multi-stage builds, Nginx reverse proxy, Docker Compose or `deploy.sh` for remote deployment + +## Development Guidelines + +- **Code Style** — ESLint + Prettier for frontend, Husky pre-commit hook for auto-check +- **Commit Format** — Conventional Commits (`feat:` / `fix:` / `refactor:` / `chore:` / `docs:` / `perf:`) +- **Architecture Tests** — `mvn test` runs ArchUnit hexagonal architecture constraint checks +- **i18n** — New frontend text must include both Chinese and English translations (`web/src/i18n/`) + +## License + +[Apache License 2.0](LICENSE) diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..a2a9319 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,56 @@ +# RocketMQ Studio + +[English](README.md) | **中文** + +> 跨集群 · 跨架构 · 跨云的 RocketMQ 统一管控平台 + +RocketMQ Studio 是一个面向多集群、多架构、多云环境的 RocketMQ 管控平台,提供实例管理、集群运维、Topic / 消费组 CRUD、ACL 权限管控、消息查询与轨迹追踪、死信队列处理、监控告警、审计日志以及 AI 智能助手等一站式能力。 + +## 一键构建 & 运行 + +```bash +cd deploy && docker compose up -d --build +``` + +启动后访问 **http://127.0.0.1:6789** 即可使用。 + +**Studio 服务端口:** 前端 6789(Nginx)、后端 8888(Spring Boot) + +**RocketMQ 服务端端口:** NameServer 9876、Broker 10911、Proxy Remoting 8080、Proxy gRPC 8081 + +## 功能概览 + +| 模块 | 能力 | +|------|------| +| **监控面板** | 集群/ Broker / Topic / 消费组全局统计,TPS 趋势图 | +| **实例管理** | 多实例接入(Proxy / Direct 模式),实例 CRUD | +| **集群管理** | 集群详情、Broker / NameServer / Proxy 节点运维、集群配置热更新 | +| **K8s 证书** | TLS / mTLS / ServiceAccount 证书管理与续期 | +| **Topic 管理** | Topic CRUD、路由查看、消费者列表、多类型支持(Normal / FIFO / Delay / Transaction / Lite) | +| **消费组管理** | 消费组 CRUD、消费进度、订阅详情、位点重置、配置导入导出 | +| **ACL 权限** | ACL 规则与用户管理,支持 v1 / v2 双版本 | +| **消息查询** | 按 Topic / MsgId / Key / 时间范围查询,消息轨迹可视化 | +| **死信队列** | DLQ 消息查看与批量重发 | +| **客户端连接** | Producer / Consumer 在线连接列表,协议与语言版本统计 | +| **告警规则** | 多维度告警规则配置(磁盘 / 堆积 / TPS / 节点离线),支持钉钉 / 邮件 / 短信通知 | +| **系统告警** | 系统级告警查看、确认与清理 | +| **审计日志** | 操作审计日志查询、按类型 / 时间 / 结果过滤、历史清理 | +| **AI 助手** | SSE 流式对话,支持查询 / 诊断 / 管控 / 通用多模式,MCP 工具集成 | +| **系统设置** | 通用偏好设置、LLM 配置、数据源管理 | + +## 技术栈 + +- **前端** — React 18 + TypeScript + Vite + Ant Design + Tailwind CSS +- **后端** — Java 21 + Spring Boot 3.5 + 六边形架构(ArchUnit 约束) +- **部署** — Docker 多阶段构建,Nginx 反向代理,支持 Docker Compose 本地运行或 `deploy.sh` 远程部署 + +## 开发规范 + +- **代码风格** — 前端通过 ESLint + Prettier 统一格式,Husky pre-commit hook 自动检查 +- **Commit 格式** — 遵循 Conventional Commits(`feat:` / `fix:` / `refactor:` / `chore:` / `docs:` / `perf:`) +- **架构测试** — 后端 `mvn test` 自动运行 ArchUnit 六边形架构约束检查 +- **国际化** — 新增前端文案需同时提供中英文翻译(`web/src/i18n/`) + +## License + +[Apache License 2.0](LICENSE) diff --git a/deploy/.env.example b/deploy/.env.example new file mode 100644 index 0000000..16b8e6e --- /dev/null +++ b/deploy/.env.example @@ -0,0 +1,8 @@ +# RocketMQ Studio Docker Environment +# Remote deployment target +REMOTE_HOST=101.37.235.82 +REMOTE_USER=root +REMOTE_PATH=/opt/rocketmq-studio + +# Frontend public port +PUBLIC_PORT=6789 diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 0000000..c02c26a --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,28 @@ +# 部署 + +## 一键部署 + +```bash +./deploy/deploy.sh # 部署 server + web +./deploy/deploy.sh server # 仅部署后端 +./deploy/deploy.sh web # 仅部署前端 +``` + +脚本自动完成:本地构建 → 导出镜像 → SCP 传输 → 远程加载 → 重启容器 → 验证 + +## 配置 + +编辑 `deploy/.env` 修改部署目标: + +```env +REMOTE_HOST=101.37.235.82 +REMOTE_USER=root +REMOTE_PATH=/opt/rocketmq-studio +PUBLIC_PORT=8080 +``` + +## 前置条件 + +- 本地安装 Docker +- 远程机器可通过 SSH 免密登录 +- 远程机器已安装 Podman(Alibaba Cloud Linux 3 默认提供) diff --git a/deploy/deploy.sh b/deploy/deploy.sh new file mode 100755 index 0000000..a67c810 --- /dev/null +++ b/deploy/deploy.sh @@ -0,0 +1,185 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ─── RocketMQ Studio 一键部署脚本 ─── +# 用法: +# ./deploy/deploy.sh # 部署 server + web +# ./deploy/deploy.sh server # 仅部署 server +# ./deploy/deploy.sh web # 仅部署 web + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + +# 加载配置 +if [[ -f "$SCRIPT_DIR/.env" ]]; then + set -a + # shellcheck disable=SC1091 + source "$SCRIPT_DIR/.env" + set +a +fi + +[[ -n "${REMOTE_HOST:-}" ]] || err "REMOTE_HOST 未配置,请在 deploy/.env 中设置" +REMOTE="${REMOTE_USER:-root}@$REMOTE_HOST" +REMOTE_PATH="${REMOTE_PATH:-/opt/rocketmq-studio}" +NETWORK="${PODMAN_NETWORK:-rocketmq-studio}" +TMP_DIR="/tmp/rocketmq-studio-deploy" + +TARGET="${1:-all}" # all | server | web + +# ─── 颜色输出 ─── +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +NC='\033[0m' + +log() { echo -e "${GREEN}[✓]${NC} $*"; } +info() { echo -e "${CYAN}[→]${NC} $*"; } +warn() { echo -e "${YELLOW}[!]${NC} $*"; } +err() { echo -e "${RED}[✗]${NC} $*"; exit 1; } + +# ─── 前置检查 ─── +check_prereqs() { + info "检查前置条件..." + command -v docker >/dev/null 2>&1 || err "docker 未安装" + command -v ssh >/dev/null 2>&1 || err "ssh 未安装" + command -v scp >/dev/null 2>&1 || err "scp 未安装" + ssh -o ConnectTimeout=5 -o BatchMode=yes "$REMOTE" "echo ok" >/dev/null 2>&1 \ + || err "无法 SSH 连接到 $REMOTE(请确认免密登录已配置)" + log "前置条件通过" +} + +# ─── 构建镜像 ─── +build_server() { + info "构建 rocketmq-server 镜像..." + docker build -t rocketmq-server:latest "$PROJECT_DIR/server" + log "rocketmq-server 镜像构建完成" +} + +build_web() { + info "构建 rocketmq-web 镜像..." + docker build -t rocketmq-web:latest "$PROJECT_DIR/web" + log "rocketmq-web 镜像构建完成" +} + +# ─── 导出 & 传输 ─── +transfer_images() { + mkdir -p "$TMP_DIR" + local images=() + + if [[ "$TARGET" == "all" || "$TARGET" == "server" ]]; then + images+=("rocketmq-server:latest") + fi + if [[ "$TARGET" == "all" || "$TARGET" == "web" ]]; then + images+=("rocketmq-web:latest") + fi + + local tarball="$TMP_DIR/rocketmq-studio-images.tar.gz" + info "导出镜像: ${images[*]}" + docker save "${images[@]}" | gzip > "$tarball" + log "镜像导出完成 ($(du -h "$tarball" | cut -f1))" + + info "传输到 $REMOTE:$REMOTE_PATH ..." + ssh "$REMOTE" "mkdir -p $REMOTE_PATH" + scp "$tarball" "$REMOTE:$REMOTE_PATH/" + log "传输完成" + + # 同步部署配置文件 + info "同步部署配置..." + scp "$SCRIPT_DIR/docker-compose.yml" "$REMOTE:$REMOTE_PATH/" + scp "$SCRIPT_DIR/nginx.conf" "$REMOTE:$REMOTE_PATH/" + log "配置同步完成" +} + +# ─── 远程加载 & 启动 ─── +deploy_remote() { + local tarball="$REMOTE_PATH/rocketmq-studio-images.tar.gz" + + info "远程加载镜像..." + ssh "$REMOTE" "gunzip -c $tarball | podman load" + log "镜像加载完成" + + # 确保网络存在 + ssh "$REMOTE" "podman network exists $NETWORK 2>/dev/null || podman network create $NETWORK" + + if [[ "$TARGET" == "all" || "$TARGET" == "server" ]]; then + info "重启 rocketmq-server..." + ssh "$REMOTE" " + podman rm -f rocketmq-server 2>/dev/null || true + podman run -d \ + --name rocketmq-server \ + --network $NETWORK \ + --restart unless-stopped \ + -p 8888:8888 \ + rocketmq-server:latest + " + log "rocketmq-server 已启动" + fi + + if [[ "$TARGET" == "all" || "$TARGET" == "web" ]]; then + info "重启 rocketmq-web..." + ssh "$REMOTE" " + podman rm -f rocketmq-web 2>/dev/null || true + podman run -d \ + --name rocketmq-web \ + --network $NETWORK \ + --restart unless-stopped \ + -p ${PUBLIC_PORT:-6789}:80 \ + rocketmq-web:latest + " + log "rocketmq-web 已启动" + fi +} + +# ─── 验证 ─── +verify() { + info "验证部署..." + sleep 3 + + local status + status=$(ssh "$REMOTE" "podman ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'" 2>&1) + echo "$status" + + echo "" + local http_code + http_code=$(ssh "$REMOTE" "curl -sf -o /dev/null -w '%{http_code}' --max-time 5 http://localhost:${PUBLIC_PORT:-6789}" 2>/dev/null || echo "000") + if [[ "$http_code" == "200" ]]; then + log "前端响应正常 (HTTP $http_code)" + else + warn "前端返回 HTTP $http_code" + fi + + echo "" + log "部署完成 → http://${REMOTE_HOST}:${PUBLIC_PORT:-6789}" +} + +# ─── 清理临时文件 ─── +cleanup() { + rm -rf "$TMP_DIR" +} + +# ─── 主流程 ─── +main() { + echo "═══════════════════════════════════════════" + echo " RocketMQ Studio 部署" + echo " 目标: $TARGET | 远程: $REMOTE:$REMOTE_PATH" + echo "═══════════════════════════════════════════" + echo "" + + check_prereqs + + case "$TARGET" in + server) build_server ;; + web) build_web ;; + all) build_server && build_web ;; + *) err "用法: $0 [all|server|web]" ;; + esac + + transfer_images + deploy_remote + verify + cleanup +} + +trap cleanup EXIT +main diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml new file mode 100644 index 0000000..1fe68bd --- /dev/null +++ b/deploy/docker-compose.yml @@ -0,0 +1,24 @@ +name: rocketmq-studio + +services: + rocketmq-server: + build: + context: ../server + dockerfile: Dockerfile + image: rocketmq-server:latest + container_name: rocketmq-server + restart: unless-stopped + expose: + - "8888" + + rocketmq-web: + build: + context: ../web + dockerfile: Dockerfile + image: rocketmq-web:latest + container_name: rocketmq-web + restart: unless-stopped + ports: + - "6789:80" + depends_on: + - rocketmq-server diff --git a/deploy/nginx.conf b/deploy/nginx.conf new file mode 100644 index 0000000..165c0f9 --- /dev/null +++ b/deploy/nginx.conf @@ -0,0 +1,20 @@ +server { + listen 80; + server_name _; + + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/ /index.html; + } + + location /api/ { + resolver 10.89.0.1 valid=10s; + set $backend http://rocketmq-server:8888; + proxy_pass $backend; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} diff --git a/docs/api-spec.md b/docs/api-spec.md new file mode 100644 index 0000000..581e8d0 --- /dev/null +++ b/docs/api-spec.md @@ -0,0 +1,1696 @@ +<!-- +请更新 docs/api-spec.md 接口文档,基于以下数据源: +1. 读取 web/src/mock/ 下所有 .ts 文件,提取每个文件的 interface/type 定义和 mock 数据的字段、类型、示例值 +2. 读取 web/src/pages/ 下所有页面组件,提取: + - Table columns 定义(title、dataIndex、render 函数) + - 表单字段(Form.Item 的 name、label、component、validation) + - 过滤/搜索参数 + - CRUD 操作(按钮、modal、调用逻辑) + - 分页配置(pageSize、showSizeChanger) +3. 读取 web/src/api/ 下所有 API 客户端文件,提取已有的 endpoint URL 和参数 +4. 读取 web/src/constants/ 下的枚举映射(如 TOPIC_TYPE_MAP、STATUS_MAP) +5. 将以上信息整合为 GET+POST 风格 API 文档,每个接口包含: + - HTTP Method + Path + - Query Parameters / Path Parameters / Request Body(字段、类型、必填、说明) + - Response data 字段定义(字段、类型、说明、示例值) + - 枚举值在附录 A 统一列出 +6. 保持接口速查表与实际接口数量一致 +7. 如果前端新增了页面或 mock 数据,在对应模块章节下新增接口 +8. 如果前端删除了页面或字段,同步移除对应接口或字段 +--> + +# RocketMQ Studio API 接口规范 + +> 本文档基于前端页面所需展示的全部数据和格式编写,用于指导后端 Java 代码开发。 +> +> Base URL: `/api` +> Content-Type: `application/json` +> 认证方式: `Authorization: Bearer <token>` + +## 接口设计风格 + +本项目采用 **GET + POST** 风格(非完整 RESTful),具体规则如下: + +- **GET** 用于所有查询/读取操作 +- **POST** 用于所有写入/操作类接口(创建、更新、删除、重启等) +- URL 路径使用动词标识操作类型:`/create`、`/update`、`/delete`、`/toggle`、`/restart`、`/cleanup` 等 +- POST 操作如需定位特定资源,在 **Request Body** 中传递 `id` 或 `name`(不放在 URL 路径中) +- GET 操作仍使用 Path Params 标识资源(如 `GET /api/topics/:name/routes`) + +## 接口速查 + +| # | Method | Path | 说明 | +|---|--------|------|------| +| 1 | POST | `/api/auth/login` | 登录 | +| 2 | POST | `/api/auth/logout` | 登出 | +| 3 | GET | `/api/dashboard` | 面板数据(统计 + 集群概览) | +| 4 | GET | `/api/instances` | 实例列表 | +| 5 | POST | `/api/instances/create` | 创建实例 | +| 6 | POST | `/api/instances/update` | 更新实例 | +| 7 | POST | `/api/instances/delete` | 删除实例 | +| 8 | GET | `/api/clusters` | 集群列表 | +| 9 | GET | `/api/clusters/:id` | 集群详情 | +| 10 | POST | `/api/clusters/config/update` | 更新集群配置 | +| 11 | POST | `/api/clusters/:clusterId/brokers/:name/restart` | 重启 Broker | +| 12 | POST | `/api/nameservers/create` | 创建 NameServer | +| 13 | POST | `/api/nameservers/update` | 更新 NameServer | +| 14 | POST | `/api/nameservers/restart` | 重启 NameServer | +| 15 | POST | `/api/nameservers/upgrade` | 升级 NameServer | +| 16 | POST | `/api/nameservers/delete` | 删除 NameServer | +| 17 | POST | `/api/proxies/restart` | 重启 Proxy | +| 18 | GET | `/api/k8s-certs` | K8s 证书列表 | +| 19 | POST | `/api/k8s-certs/create` | 添加证书 | +| 20 | POST | `/api/k8s-certs/update` | 更新证书 | +| 21 | POST | `/api/k8s-certs/renew` | 续期证书 | +| 22 | POST | `/api/k8s-certs/delete` | 删除证书 | +| 23 | GET | `/api/topics` | Topic 列表 | +| 24 | POST | `/api/topics/create` | 创建 Topic | +| 25 | POST | `/api/topics/update` | 更新 Topic | +| 26 | POST | `/api/topics/delete` | 删除 Topic | +| 27 | GET | `/api/topics/:name/routes` | Topic 路由 | +| 28 | GET | `/api/topics/:name/consumers` | Topic 消费者 | +| 29 | POST | `/api/topics/send` | 发送消息到 Topic | +| 30 | GET | `/api/groups` | 消费组列表 | +| 31 | GET | `/api/groups/:name` | 消费组详情 | +| 32 | GET | `/api/groups/:name/progress` | 消费进度 | +| 33 | GET | `/api/groups/:name/subscriptions` | 订阅详情 | +| 34 | POST | `/api/groups/create` | 创建消费组 | +| 35 | POST | `/api/groups/delete` | 删除消费组 | +| 36 | POST | `/api/groups/reset-offset` | 重置位点 | +| 37 | POST | `/api/groups/import` | 导入配置 | +| 38 | GET | `/api/groups/export` | 导出配置 | +| 39 | GET | `/api/acl/rules` | ACL 规则列表 | +| 40 | POST | `/api/acl/rules/create` | 创建 ACL 规则 | +| 41 | POST | `/api/acl/rules/delete` | 删除 ACL 规则 | +| 42 | GET | `/api/acl/users` | ACL 用户列表 | +| 43 | POST | `/api/acl/users/create` | 创建 ACL 用户 | +| 44 | POST | `/api/acl/users/delete` | 删除 ACL 用户 | +| 45 | GET | `/api/messages` | 消息查询 | +| 46 | GET | `/api/messages/:msgId/trace` | 消息轨迹 | +| 47 | GET | `/api/dlq` | 死信队列列表 | +| 48 | POST | `/api/dlq/resend` | 重发死信 | +| 49 | GET | `/api/clients` | 客户端连接列表 | +| 50 | GET | `/api/alert-rules` | 告警规则列表 | +| 51 | POST | `/api/alert-rules/create` | 创建告警规则 | +| 52 | POST | `/api/alert-rules/update` | 更新告警规则 | +| 53 | POST | `/api/alert-rules/toggle` | 切换启用状态 | +| 54 | POST | `/api/alert-rules/delete` | 删除告警规则 | +| 55 | GET | `/api/system-alerts` | 系统告警列表 | +| 56 | POST | `/api/system-alerts/acknowledge` | 确认告警 | +| 57 | POST | `/api/system-alerts/clear-acknowledged` | 清除已确认告警 | +| 58 | GET | `/api/audit-logs` | 审计日志列表 | +| 59 | POST | `/api/audit-logs/cleanup` | 清理审计日志 | +| 60 | GET | `/api/settings/general` | 获取通用设置 | +| 61 | POST | `/api/settings/general/save` | 保存通用设置 | +| 62 | GET | `/api/settings/datasources` | 数据源列表 | +| 63 | POST | `/api/settings/datasources/create` | 创建数据源 | +| 64 | POST | `/api/settings/datasources/update` | 更新数据源 | +| 65 | POST | `/api/settings/datasources/delete` | 删除数据源 | +| 66 | POST | `/api/settings/datasources/test` | 测试数据源连接 | +| 67 | POST | `/api/ai/chat` | AI 对话(SSE) | +| 68 | POST | `/api/ai/execute` | 执行 AI 指令 | +| 69 | GET | `/api/ai/tools` | 可用工具列表 | +| 70 | POST | `/api/metrics/query` | 查询监控指标数据 | + +## 通用响应格式 + +所有接口统一返回以下 JSON 结构: + +```json +{ + "code": 200, + "message": "success", + "data": {} +} +``` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `code` | `int` | 200 表示成功,与 HTTP 状态码对齐 | +| `message` | `string` | 提示信息 | +| `data` | `any` | 响应数据 | + +**错误码规范:** + +| 错误码 | 含义 | 场景 | +|--------|------|------| +| `200` | 成功 | 正常响应 | +| `400` | 参数错误 | 请求参数缺失或格式错误 | +| `401` | 未认证 | Token 过期或缺失 | +| `403` | 无权限 | 无权访问该资源 | +| `404` | 不存在 | 资源未找到 | +| `500` | 服务器异常 | 未预期的内部错误 | + +--- + +## 1. 认证 Auth + +### 1.1 登录 + +``` +POST /api/auth/login +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `username` | `string` | 是 | 用户名 | +| `password` | `string` | 是 | 密码 | + +**Response `data`:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `token` | `string` | JWT Token | +| `expiresIn` | `number` | 过期时间(秒) | +| `user` | `object` | 用户信息 | +| `user.username` | `string` | 用户名 | +| `user.admin` | `boolean` | 是否管理员 | + +### 1.2 登出 + +``` +POST /api/auth/logout +``` + +**Response `data`:** `null` + +--- + +## 2. 监控面板 Dashboard + +### 2.1 获取面板数据(统计 + 集群概览) + +``` +GET /api/dashboard +``` + +**Response `data`:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `stats` | `DashboardStats` | 面板统计数据 | +| `clusters` | `ClusterOverview[]` | 集群概览列表 | + +**DashboardStats 字段:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `totalClusters` | `number` | 集群总数 | +| `healthyClusters` | `number` | 健康集群数 | +| `totalBrokers` | `number` | Broker 总数(≥ 0) | +| `totalProxies` | `number` | Proxy 总数(≥ 0) | +| `totalNameServers` | `number` | NameServer 总数(≥ 0) | +| `totalTopics` | `number` | Topic 总数 | +| `totalConsumerGroups` | `number` | 消费组总数 | +| `totalMessagesToday` | `number` | 今日消息总量 | +| `messagesPerSecond` | `number` | 每秒消息数 | +| `tpsIn` | `number` | 入站 TPS | +| `tpsOut` | `number` | 出站 TPS | + +**ClusterOverview 字段:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `string` | 集群 ID | +| `name` | `string` | 集群名称 | +| `type` | `string` | 集群类型,枚举: `V4_DIRECT` / `V5_PROXY_LOCAL` / `V5_PROXY_CLUSTER` | +| `status` | `string` | 状态: `healthy` / `warning` / `error` / `offline` | +| `brokers` | `number` | Broker 数量(≥ 0) | +| `proxies` | `number` | Proxy 数量(≥ 0,不会为负数) | +| `topics` | `number` | Topic 数量 | +| `groups` | `number` | 消费组数量 | +| `tpsIn` | `number` | 入站 TPS | +| `tpsOut` | `number` | 出站 TPS | +| `version` | `string` | RocketMQ 版本号 | +| `throughput` | `number[]` | TPS 趋势数据(12 个采样点) | + +**示例:** + +```json +{ + "stats": { + "totalClusters": 2, + "healthyClusters": 2, + "totalBrokers": 12, + "totalProxies": 5, + "totalNameServers": 5, + "totalTopics": 304, + "totalConsumerGroups": 152, + "totalMessagesToday": 18420000, + "messagesPerSecond": 85800, + "tpsIn": 85800, + "tpsOut": 222400 + }, + "clusters": [ + { + "id": "cluster-prod", + "name": "rocketmq-prod", + "type": "V5_PROXY_CLUSTER", + "status": "healthy", + "brokers": 8, + "proxies": 3, + "topics": 256, + "groups": 128, + "tpsIn": 78000, + "tpsOut": 203600, + "version": "5.2.0", + "throughput": [62000, 68000, 74000, 71000, 78000, 82000, 79000, 85000, 81000, 78000, 76000, 80000] + } + ] +} +``` + +--- + +### 3.1 获取实例列表 + +``` +GET /api/instances?type={type}&search={keyword} +``` + +**Query Parameters:** + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `type` | `string` | 否 | 按类型过滤: `PROXY` / `DIRECT` | +| `search` | `string` | 否 | 按名称或地址搜索 | + +**Response `data`:** `Instance[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `string` | 实例 ID | +| `name` | `string` | 实例名称 | +| `remark` | `string` | 备注 | +| `type` | `string` | 接入类型: `PROXY` / `DIRECT` | +| `endpoint` | `string` | 接入地址 | +| `topicCount` | `number` | Topic 数量 | +| `consumerGroupCount` | `number` | 消费组数量 | +| `createdAt` | `string` | 创建时间 | +| `updatedAt` | `string` | 更新时间 | + +### 3.2 创建实例 + +``` +POST /api/instances/create +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `name` | `string` | 是 | 实例名称 | +| `type` | `string` | 是 | `PROXY` / `DIRECT` | +| `endpoint` | `string` | 是 | 接入地址 | + +**Response `data`:** `Instance` + +### 3.3 更新实例 + +``` +POST /api/instances/update +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 实例 ID | +| `name` | `string` | 是 | 实例名称 | +| `type` | `string` | 是 | `PROXY` / `DIRECT` | +| `endpoint` | `string` | 是 | 接入地址 | + +**Response `data`:** `Instance` + +### 3.4 删除实例 + +``` +POST /api/instances/delete +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 实例 ID | + +**Response `data`:** `null` + +--- + +## 4. 集群管理 Cluster / NameServer / Proxy + +> 前端在同一个页面展示,因此 API 合并在此章节。 + +### 4.1 获取集群列表 + +``` +GET /api/clusters +``` + +**Response `data`:** `ClusterInfo[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `string` | 集群 ID | +| `name` | `string` | 集群名称 | +| `nsClusterName` | `string` | NameServer 集群名 | +| `type` | `string` | 集群类型,枚举: `V5_PROXY_CLUSTER` | +| `endpoint` | `string` | NameServer 地址,如 `10.101.2.1:9876` | +| `status` | `string` | 状态: `healthy` / `warning` / `error` / `offline` | +| `version` | `string` | 版本号 | +| `brokers` | `BrokerInfo[]` | Broker 节点列表 | +| `proxies` | `ProxyInfo[]` | Proxy 节点列表 | +| `nameServers` | `NameServerInfo[]` | NameServer 节点列表 | +| `config` | `ClusterConfig` | 集群配置 | +| `topicCount` | `number` | Topic 数量 | +| `groupCount` | `number` | 消费组数量 | +| `tpsHistory` | `number[]` | TPS 历史数据 | + +#### BrokerInfo + +| 字段 | 类型 | 说明 | +|------|------|------| +| `name` | `string` | Broker 名称 | +| `addr` | `string` | 地址,如 `10.101.2.11:10911` | +| `version` | `string` | 版本号 | +| `status` | `string` | 状态: `running` / `readonly` / `maintenance` | +| `diskUsage` | `number` | 磁盘使用率(0-100) | +| `tpsIn` | `number` | 入站 TPS | +| `tpsOut` | `number` | 出站 TPS | + +#### ProxyInfo + +| 字段 | 类型 | 说明 | +|------|------|------| +| `addr` | `string` | 地址 | +| `status` | `string` | 状态: `healthy` / `warning` / `error` / `offline` | +| `connections` | `number` | 当前连接数 | +| `grpcPort` | `number` | gRPC 端口 | +| `remotingPort` | `number` | Remoting 端口 | + +#### NameServerInfo + +| 字段 | 类型 | 说明 | +|------|------|------| +| `addr` | `string` | 地址,如 `10.101.2.1:9876` | +| `status` | `string` | 状态: `healthy` / `warning` / `error` / `offline` | + +#### ClusterConfig + +| 字段 | 类型 | 说明 | +|------|------|------| +| `writeQueueNums` | `number` | 写队列数 | +| `readQueueNums` | `number` | 读队列数 | +| `maxMessageSize` | `number` | 最大消息大小(字节) | +| `msgTraceTopicName` | `string` | 消息轨迹 Topic 名 | +| `autoCreateTopicEnable` | `boolean` | 是否自动创建 Topic | +| `autoCreateSubscriptionGroup` | `boolean` | 是否自动创建订阅组 | +| `deleteWhen` | `string` | 删除时间,如 `"04"` | +| `fileReservedTime` | `number` | 文件保留时间(小时) | +| `flushDiskType` | `string` | 刷盘方式: `ASYNC_FLUSH` / `SYNC_FLUSH` | +| `brokerPermission` | `number` | Broker 权限值(6 = 读写) | + +### 4.2 获取集群详情 + +``` +GET /api/clusters/:id +``` + +**Response `data`:** `ClusterInfo`(同 4.1 的单条记录) + +### 4.3 更新集群配置 + +``` +POST /api/clusters/config/update +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 集群 ID | +| `flushDiskType` | `string` | 是 | `ASYNC_FLUSH` / `SYNC_FLUSH` | +| `autoCreateTopicEnable` | `boolean` | 是 | 自动创建 Topic | +| `autoCreateSubscriptionGroup` | `boolean` | 是 | 自动创建订阅组 | +| `maxMessageSize` | `number` | 是 | 最大消息大小(字节) | +| `fileReservedTime` | `number` | 是 | 文件保留时间(小时,1-720) | +| `writeQueueNums` | `number` | 是 | 写队列数(1-256) | +| `readQueueNums` | `number` | 是 | 读队列数(1-256) | +| `brokerPermission` | `number` | 是 | Broker 权限(0-7) | + +**Response `data`:** `null` + +### 4.4 重启 Broker + +``` +POST /api/clusters/:clusterId/brokers/:name/restart +``` + +**Path Parameters:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `clusterId` | `string` | 集群 ID | +| `name` | `string` | Broker 名称 | + +**Response `data`:** `{ success: boolean, message: string }` + +### 4.5 创建 NameServer + +``` +POST /api/nameservers/create +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `clusterId` | `string` | 是 | 所属集群 ID | +| `addr` | `string` | 是 | NameServer 地址,如 `10.0.1.1:9876` | + +**Response `data`:** `NameServerInfo` + +### 4.6 更新 NameServer + +``` +POST /api/nameservers/update +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `clusterId` | `string` | 是 | 所属集群 ID | +| `addr` | `string` | 是 | 原地址 | +| `newAddr` | `string` | 否 | 新地址(不传则不修改) | + +**Response `data`:** `NameServerInfo` + +### 4.7 重启 NameServer + +``` +POST /api/nameservers/restart +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `addr` | `string` | 是 | NameServer 地址 | + +**Response `data`:** `{ success: boolean }` + +### 4.8 升级 NameServer + +``` +POST /api/nameservers/upgrade +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `addr` | `string` | 是 | NameServer 地址 | + +**Response `data`:** `{ success: boolean }` + +### 4.9 删除 NameServer + +``` +POST /api/nameservers/delete +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `addr` | `string` | 是 | NameServer 地址 | + +**Response `data`:** `{ success: boolean }` + +### 4.10 重启 Proxy + +``` +POST /api/proxies/restart +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `addr` | `string` | 是 | Proxy 地址 | + +**Response `data`:** `{ success: boolean }` + +### 4.11 获取 K8s 证书列表 + +``` +GET /api/k8s-certs +``` + +**Response `data`:** `K8sCertInfo[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `string` | 证书 ID | +| `name` | `string` | 证书名称 | +| `namespace` | `string` | K8s 命名空间 | +| `cluster` | `string` | 所属集群名称 | +| `type` | `string` | 证书类型: `TLS` / `mTLS` / `ServiceAccount` | +| `issuer` | `string` | 签发者 | +| `notBefore` | `string` | 生效时间 (ISO 8601) | +| `notAfter` | `string` | 过期时间 (ISO 8601) | +| `status` | `string` | 状态: `valid` / `expiring` / `expired` | +| `daysRemaining` | `number` | 剩余天数 | +| `san` | `string[]` | Subject Alternative Name 列表 | + +### 4.12 添加 K8s 证书 + +``` +POST /api/k8s-certs/create +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `name` | `string` | 是 | 证书名称 | +| `namespace` | `string` | 是 | K8s 命名空间 | +| `cluster` | `string` | 是 | 所属集群 | +| `type` | `string` | 是 | 证书类型: `TLS` / `mTLS` / `ServiceAccount` | +| `issuer` | `string` | 否 | 签发者 | + +**Response `data`:** `K8sCertInfo` + +### 4.13 更新 K8s 证书 + +``` +POST /api/k8s-certs/update +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 证书 ID | +| `name` | `string` | 否 | 证书名称 | +| `namespace` | `string` | 否 | K8s 命名空间 | +| `cluster` | `string` | 否 | 所属集群 | +| `type` | `string` | 否 | 证书类型 | +| `issuer` | `string` | 否 | 签发者 | + +**Response `data`:** `K8sCertInfo` + +### 4.14 续期 K8s 证书 + +``` +POST /api/k8s-certs/renew +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 证书 ID | + +**Response `data`:** `K8sCertInfo` + +### 4.15 删除 K8s 证书 + +``` +POST /api/k8s-certs/delete +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 证书 ID | + +**Response `data`:** `null` + +--- + +## 5. Topic 管理 + +### 5.1 获取 Topic 列表 + +``` +GET /api/topics?clusterId={clusterId}&type={type}&search={keyword} +``` + +**Query Parameters:** + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `clusterId` | `string` | 否 | 按集群过滤 | +| `type` | `string` | 否 | 按类型过滤: `NORMAL` / `FIFO` / `DELAY` / `TRANSACTION` / `LITE` | +| `search` | `string` | 否 | 按名称搜索 | + +**Response `data`:** `Topic[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `name` | `string` | Topic 名称 | +| `namespace` | `string` | 命名空间 | +| `type` | `string` | 类型: `NORMAL` / `FIFO` / `DELAY` / `TRANSACTION` / `LITE` | +| `clusterId` | `string` | 所属集群 ID | +| `writeQueues` | `number` | 写队列数 | +| `readQueues` | `number` | 读队列数 | +| `perm` | `string` | 权限: `RW` / `RO` / `WO` | +| `messageCount` | `number` | 消息总量 | +| `tps` | `number` | 当前 TPS | +| `consumerGroupCount` | `number` | 订阅消费组数 | +| `remark` | `string` | 备注 | +| `createdAt` | `string` | 创建时间 (ISO 8601) | +| `updatedAt` | `string` | 更新时间 (ISO 8601) | + +### 5.2 创建 Topic + +``` +POST /api/topics/create +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `name` | `string` | 是 | Topic 名称 | +| `namespace` | `string` | 否 | 命名空间 | +| `type` | `string` | 是 | 类型 | +| `clusterId` | `string` | 是 | 所属集群 | +| `writeQueues` | `number` | 是 | 写队列数 | +| `readQueues` | `number` | 是 | 读队列数 | +| `perm` | `string` | 否 | 权限,默认 `RW` | +| `remark` | `string` | 否 | 备注 | + +**Response `data`:** `Topic` + +### 5.3 更新 Topic + +``` +POST /api/topics/update +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `name` | `string` | 是 | Topic 名称(不可修改) | +| `namespace` | `string` | 否 | 命名空间 | +| `type` | `string` | 是 | 类型 | +| `clusterId` | `string` | 是 | 所属集群 | +| `writeQueues` | `number` | 是 | 写队列数 | +| `readQueues` | `number` | 是 | 读队列数 | +| `perm` | `string` | 否 | 权限,默认 `RW` | +| `remark` | `string` | 否 | 备注 | + +**Response `data`:** `Topic` + +### 5.4 删除 Topic + +``` +POST /api/topics/delete +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `name` | `string` | 是 | Topic 名称 | + +**Response `data`:** `null` + +### 5.5 获取 Topic 路由信息 + +``` +GET /api/topics/:name/routes +``` + +**Response `data`:** `BrokerRoute[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `brokerName` | `string` | Broker 名称 | +| `brokerAddr` | `string` | Broker 地址 | +| `writeQueues` | `number` | 写队列数 | +| `readQueues` | `number` | 读队列数 | +| `perm` | `string` | 权限 | + +### 5.6 获取 Topic 消费者列表 + +``` +GET /api/topics/:name/consumers +``` + +**Response `data`:** `TopicConsumerInfo[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `group` | `string` | 消费组名称 | +| `consumeType` | `string` | 消费类型: `CLUSTERING` / `BROADCASTING` | +| `messageModel` | `string` | 消费模式描述 | +| `consumeTps` | `number` | 消费 TPS | +| `diffTotal` | `number` | 堆积消息数 | + +### 5.7 发送消息到 Topic + +``` +POST /api/topics/send +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `topic` | `string` | 是 | Topic 名称 | +| `tag` | `string` | 否 | 消息 Tag | +| `key` | `string` | 否 | 消息 Key(用于消息查询) | +| `body` | `string` | 是 | 消息体内容 | +| `properties` | `Record<string, string>` | 否 | 消息自定义属性键值对 | + +**Response `data`:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `msgId` | `string` | 消息 ID | +| `sendTime` | `string` | 发送时间 (ISO 8601) | +| `offsetMsgId` | `string` | 含偏移量的消息 ID | + +**示例:** + +```json +// Request +{ + "topic": "order-create", + "tag": "order", + "key": "ORDER-20260708-001", + "body": "{\"orderId\":\"20260708001\",\"amount\":299.00,\"status\":\"CREATED\"}", + "properties": { + "source": "rocketmq-studio", + "env": "test" + } +} + +// Response +{ + "msgId": "7F000001234567890000", + "sendTime": "2026-07-08T10:30:45.123Z", + "offsetMsgId": "7F000001234567890000-0:0:0:0" +} +``` + +--- + +## 6. 消费组管理 Consumer Group + +### 6.1 获取消费组列表 + +``` +GET /api/groups?clusterId={clusterId}&search={keyword} +``` + +**Query Parameters:** + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `clusterId` | `string` | 否 | 按集群过滤 | +| `search` | `string` | 否 | 按名称搜索 | + +**Response `data`:** `ConsumerGroup[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `name` | `string` | 消费组名称 | +| `namespace` | `string` | 命名空间 | +| `clusterId` | `string` | 所属集群 ID | +| `subscriptionMode` | `string` | 订阅模式: `Push` / `Pop` | +| `consumeType` | `string` | 消费类型: `CLUSTERING` / `BROADCASTING` | +| `onlineInstances` | `number` | 在线实例数 | +| `totalLag` | `number` | 总堆积消息数 | +| `subscribedTopics` | `string[]` | 订阅的 Topic 列表 | +| `subscriptionDataType` | `string` | 订阅数据类型: `NORMAL` / `FIFO` / `DELAY` / `TRANSACTION` | +| `deliveryOrderType` | `string?` | 顺序类型(FIFO 时): `PARTITON_ORDER` / `MESSAGES_ORDER` | +| `retryMaxTimes` | `number` | 最大重试次数 | +| `delaySeconds` | `number` | 延迟秒数 | +| `createdAt` | `string` | 创建时间 | +| `updatedAt` | `string` | 更新时间 | + +### 6.2 获取消费组详情 + +``` +GET /api/groups/:name +``` + +**Response `data`:** `ConsumerGroup`(含 `instances` 字段) + +| 字段 | 类型 | 说明 | +|------|------|------| +| `instances` | `ConsumerInstance[]` | 消费者实例列表 | + +#### ConsumerInstance + +| 字段 | 类型 | 说明 | +|------|------|------| +| `clientId` | `string` | 客户端 ID | +| `protocol` | `string` | 协议: `REMOTING` / `GRPC` | +| `address` | `string` | 客户端地址 | +| `subscribedTopics` | `string[]` | 订阅的 Topic | +| `lastHeartbeat` | `string` | 最后心跳时间 | +| `topicLag` | `Record<string, number>` | 各 Topic 堆积数 `{ "topic-name": lag_count }` | + +### 6.3 获取消费进度 + +``` +GET /api/groups/:name/progress +``` + +**Response `data`:** `QueueProgress[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `broker` | `string` | Broker 名称 | +| `queueId` | `number` | 队列 ID | +| `brokerOffset` | `number` | Broker 端 offset | +| `consumerOffset` | `number` | 消费端 offset | +| `diffTotal` | `number` | 堆积差值 | + +### 6.4 获取订阅详情 + +``` +GET /api/groups/:name/subscriptions +``` + +**Response `data`:** `SubscriptionEntry[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `topic` | `string` | Topic 名称 | +| `expression` | `string` | 过滤表达式 | +| `type` | `string` | 数据类型: `NORMAL` / `FIFO` / `DELAY` / `TRANSACTION` | +| `filterMode` | `string` | 过滤模式: `Tag 过滤` / `SQL92 过滤` / `全量` | +| `consistency` | `string` | 一致性: `一致` / `不一致` | + +### 6.5 创建消费组 + +``` +POST /api/groups/create +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `name` | `string` | 是 | 消费组名称 | +| `namespace` | `string` | 否 | 命名空间 | +| `clusterId` | `string` | 是 | 所属集群 | +| `subscriptionMode` | `string` | 是 | `Push` / `Pop` | +| `consumeType` | `string` | 是 | `CLUSTERING` / `BROADCASTING` | +| `subscribedTopics` | `string[]` | 否 | 订阅 Topic | +| `retryMaxTimes` | `number` | 否 | 最大重试次数 | + +**Response `data`:** `ConsumerGroup` + +### 6.6 删除消费组 + +``` +POST /api/groups/delete +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `name` | `string` | 是 | 消费组名称 | + +**Response `data`:** `null` + +### 6.7 重置消费位点 + +``` +POST /api/groups/reset-offset +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `name` | `string` | 是 | 消费组名称 | +| `timestamp` | `string` | 是 | 重置到指定时间 (ISO 8601) | +| `topic` | `string` | 否 | 指定 Topic,不传则全部重置 | + +**Response `data`:** `null` + +### 6.8 导入消费组配置 + +``` +POST /api/groups/import +``` + +**Request Body:** `multipart/form-data` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `file` | `File` | JSON 配置文件 | + +**Response `data`:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `imported` | `number` | 成功导入数量 | +| `failed` | `number` | 失败数量 | +| `errors` | `string[]` | 错误信息列表 | + +### 6.9 导出消费组配置 + +``` +GET /api/groups/export?names={name1,name2} +``` + +**Response:** `Content-Type: application/json`, `Content-Disposition: attachment` + +--- + +## 7. ACL 管理 + +### 7.1 获取 ACL 规则列表 + +``` +GET /api/acl/rules?clusterId={clusterId}&principal={principal} +``` + +**Query Parameters:** + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `clusterId` | `string` | 否 | 按集群过滤 | +| `principal` | `string` | 否 | 按用户过滤 | + +**Response `data`:** `AclRule[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `string` | 规则 ID | +| `principal` | `string` | 主体用户名 | +| `resource` | `string` | 资源名称/模式 | +| `resourceType` | `string` | 资源类型: `Topic` / `Group` / `Cluster` | +| `resourcePattern` | `string` | 匹配模式: `LITERAL` / `PREFIX` | +| `actions` | `string[]` | 操作列表: `PUB` / `SUB` / `ALL` | +| `decision` | `string` | 决策: `ALLOW` / `DENY` | +| `scope` | `string` | 作用域: `cluster` / `namespace` | +| `aclVersion` | `string` | ACL 版本: `1.0` / `2.0` | +| `createdAt` | `string` | 创建时间 (ISO 8601) | + +### 7.2 创建 ACL 规则 + +``` +POST /api/acl/rules/create +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `principal` | `string` | 是 | 主体 | +| `resource` | `string` | 是 | 资源 | +| `resourceType` | `string` | 是 | 资源类型 | +| `resourcePattern` | `string` | 是 | 匹配模式 | +| `actions` | `string[]` | 是 | 操作列表 | +| `decision` | `string` | 是 | ALLOW / DENY | +| `scope` | `string` | 否 | 作用域 | + +**Response `data`:** `AclRule` + +### 7.3 删除 ACL 规则 + +``` +POST /api/acl/rules/delete +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 规则 ID | + +**Response `data`:** `null` + +### 7.4 获取 ACL 用户列表 + +``` +GET /api/acl/users +``` + +**Response `data`:** `AclUser[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `string` | 用户 ID | +| `username` | `string` | 用户名 | +| `accessKey` | `string` | AccessKey(脱敏显示) | +| `secretKey` | `string` | SecretKey(脱敏显示) | +| `admin` | `boolean` | 是否管理员 | +| `clusters` | `string[]` | 授权集群列表 | +| `createdAt` | `string` | 创建时间 | + +### 7.5 创建 ACL 用户 + +``` +POST /api/acl/users/create +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `username` | `string` | 是 | 用户名 | +| `admin` | `boolean` | 否 | 是否管理员 | +| `clusters` | `string[]` | 否 | 授权集群 | + +**Response `data`:** `AclUser`(含生成的 accessKey/secretKey) + +### 7.6 删除 ACL 用户 + +``` +POST /api/acl/users/delete +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 用户 ID | + +**Response `data`:** `null` + +--- + +## 8. 消息查询 Message + +### 8.1 查询消息列表 + +``` +GET /api/messages?topic={topic}&msgId={msgId}&key={key}&startTime={startTime}&endTime={endTime} +``` + +**Query Parameters:** + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `topic` | `string` | 否 | Topic 名称 | +| `msgId` | `string` | 否 | 消息 ID(精确查询) | +| `key` | `string` | 否 | 消息 Key | +| `startTime` | `string` | 否 | 开始时间 (ISO 8601) | +| `endTime` | `string` | 否 | 结束时间 (ISO 8601) | + +**Response `data`:** `MessageRecord[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `msgId` | `string` | 消息 ID | +| `topic` | `string` | Topic 名称 | +| `tag` | `string` | 消息 Tag | +| `key` | `string` | 消息 Key | +| `body` | `string` | 消息体(JSON 字符串) | +| `storeTime` | `string` | 存储时间 (ISO 8601) | +| `bornHost` | `string` | 发送方地址 | +| `storeHost` | `string` | 存储 Broker 地址 | +| `properties` | `Record<string, string>` | 消息属性键值对 | +| `size` | `number` | 消息大小(字节) | + +### 8.2 获取消息轨迹 + +``` +GET /api/messages/:msgId/trace +``` + +**Response `data`:** `TraceRecord` + +```json +{ + "nodes": [ + { + "title": "Producer 发送", + "timestamp": "2026-07-01T10:23:45.100Z", + "status": "finish", + "costTime": 3, + "description": "order-service (10.0.1.12:54321) → broker-hz-01" + }, + { + "title": "Broker 存储", + "timestamp": "2026-07-01T10:23:45.115Z", + "status": "finish", + "costTime": 8, + "description": "broker-hz-01 (10.0.2.3:10911) CommitLog 写入成功" + }, + { + "title": "Consumer 消费", + "timestamp": "2026-07-01T10:23:45.230Z", + "status": "finish", + "costTime": 107, + "description": "cg-order-processor → 消费成功 (23ms)" + } + ], + "consumerStatus": [ + { + "group": "cg-order-processor", + "deliveryStatus": "success", + "consumeTime": "2026-07-01T10:23:45.230Z", + "retryCount": 0 + } + ] +} +``` + +#### TraceNode + +| 字段 | 类型 | 说明 | +|------|------|------| +| `title` | `string` | 节点标题: `Producer 发送` / `Broker 存储` / `Consumer 消费` | +| `timestamp` | `string` | 时间戳 (ISO 8601) | +| `status` | `string` | 状态: `finish` / `process` / `wait` | +| `costTime` | `number` | 耗时(毫秒) | +| `description` | `string` | 详细描述 | + +#### ConsumerStatus + +| 字段 | 类型 | 说明 | +|------|------|------| +| `group` | `string` | 消费组名称 | +| `deliveryStatus` | `string` | 投递状态: `success` / `failed` / `pending` | +| `consumeTime` | `string` | 消费时间(`-` 表示未消费) | +| `retryCount` | `number` | 重试次数 | + +--- + +## 9. 死信队列 Dead Letter Queue + +### 9.1 获取 DLQ 列表 + +``` +GET /api/dlq?clusterId={clusterId} +``` + +**Response `data`:** `DLQGroup[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `groupName` | `string` | 消费组名称 | +| `dlqTopic` | `string` | 死信 Topic 名称(格式: `%DLQ%{groupName}`) | +| `messageCount` | `number` | 死信消息数量 | +| `lastEnqueueTime` | `string` | 最后入队时间 (ISO 8601) | +| `retryCount` | `number` | 已重试次数 | +| `status` | `string` | 状态: `active` / `empty` | + +### 9.2 重发死信消息 + +``` +POST /api/dlq/resend +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `groupName` | `string` | 是 | 消费组名称 | +| `startTime` | `string` | 是 | 重投时间范围起始 (ISO 8601) | +| `endTime` | `string` | 是 | 重投时间范围结束 (ISO 8601) | +| `targetTopic` | `string` | 否 | 目标 Topic,不传则重投回原 Topic | + +**Response `data`:** `null` + +--- + +## 10. 客户端连接 Clients + +### 10.1 获取客户端连接列表 + +``` +GET /api/clients?clusterId={clusterId}&type={type} +``` + +**Query Parameters:** + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `clusterId` | `string` | 否 | 按集群过滤 | +| `type` | `string` | 否 | 按类型过滤: `Producer` / `Consumer` | + +**Response `data`:** `ClientConnection[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `clientId` | `string` | 客户端 ID | +| `type` | `string` | 类型: `Producer` / `Consumer` | +| `groupOrTopic` | `string` | 消费组名或 Topic 名 | +| `protocol` | `string` | 协议: `gRPC` / `Remoting` | +| `address` | `string` | 客户端地址 | +| `language` | `string` | 客户端语言: `Java` / `Go` / `Python` / `Rust` / `C++` / `C#` / `Node.js` / `PHP` | +| `version` | `string` | SDK 版本号 | +| `connectedAt` | `string` | 连接时间 | +| `clusterName` | `string` | 所属集群名称(显示在第一列) | + +--- + +## 11. 告警规则 Alert Rules + +### 11.1 获取告警规则列表 + +``` +GET /api/alert-rules +``` + +**Response `data`:** `AlertRule[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `string` | 规则 ID | +| `name` | `string` | 规则名称 | +| `metric` | `string` | 监控指标: `磁盘使用率` / `消费堆积量` / `TPS 异常` / `Broker 离线` / `Proxy 连接数` | +| `operator` | `string` | 比较运算符: `>` / `<` / `>=` / `<=` | +| `threshold` | `number` | 阈值 | +| `thresholdUnit` | `string` | 单位: `%` / `条` / `TPS` / `个` | +| `duration` | `string` | 持续时间: `1分钟` / `5分钟` / `15分钟` / `30分钟` | +| `channels` | `string[]` | 通知渠道: `dingtalk` / `email` / `sms` | +| `enabled` | `boolean` | 是否启用 | +| `lastTriggered` | `string \| null` | 最后触发时间,null 表示未触发 | +| `description` | `string` | 规则描述 | + +### 11.2 创建告警规则 + +``` +POST /api/alert-rules/create +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `name` | `string` | 是 | 规则名称 | +| `metric` | `string` | 是 | 监控指标 | +| `operator` | `string` | 是 | 运算符 | +| `threshold` | `number` | 是 | 阈值 | +| `duration` | `string` | 是 | 持续时间 | +| `channels` | `string[]` | 是 | 通知渠道 | +| `description` | `string` | 否 | 描述 | + +**Response `data`:** `AlertRule` + +### 11.3 更新告警规则 + +``` +POST /api/alert-rules/update +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 规则 ID | +| `name` | `string` | 是 | 规则名称 | +| `metric` | `string` | 是 | 监控指标 | +| `operator` | `string` | 是 | 运算符 | +| `threshold` | `number` | 是 | 阈值 | +| `duration` | `string` | 是 | 持续时间 | +| `channels` | `string[]` | 是 | 通知渠道 | +| `description` | `string` | 否 | 描述 | + +**Response `data`:** `AlertRule` + +### 11.4 切换告警规则启用状态 + +``` +POST /api/alert-rules/toggle +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 规则 ID | +| `enabled` | `boolean` | 是 | 启用/禁用 | + +**Response `data`:** `AlertRule` + +### 11.5 删除告警规则 + +``` +POST /api/alert-rules/delete +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 规则 ID | + +**Response `data`:** `null` + +--- + +## 12. 系统告警 System Alerts + +### 12.1 获取系统告警列表 + +``` +GET /api/system-alerts?level={level} +``` + +**Query Parameters:** + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `level` | `string` | 否 | 按级别过滤: `error` / `warning` / `info` | + +**Response `data`:** `SystemAlert[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `string` | 告警 ID | +| `level` | `string` | 级别: `error`(严重) / `warning`(警告) / `info`(信息) | +| `title` | `string` | 告警标题 | +| `description` | `string` | 告警详情 | +| `time` | `string` | 时间(短格式: `HH:mm`) | +| `acknowledged` | `boolean` | 是否已确认 | + +### 12.2 确认告警 + +``` +POST /api/system-alerts/acknowledge +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `id` | `string` | 是 | 告警 ID | + +**Response `data`:** `SystemAlert` + +### 12.3 清除已确认告警 + +``` +POST /api/system-alerts/clear-acknowledged +``` + +**Response `data`:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `cleared` | `number` | 清除数量 | + +--- + +## 13. 审计日志 Audit + +### 13.1 获取审计日志列表 + +``` +GET /api/audit-logs?page={page}&pageSize={pageSize}&search={search}&operationType={type}&startDate={start}&endDate={end}&result={result} +``` + +**Query Parameters:** + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `page` | `number` | 否 | 页码,默认 1 | +| `pageSize` | `number` | 否 | 每页条数,默认 20 | +| `search` | `string` | 否 | 搜索(匹配 operator / target) | +| `operationType` | `string` | 否 | 操作类型过滤 | +| `startDate` | `string` | 否 | 开始日期 (YYYY-MM-DD) | +| `endDate` | `string` | 否 | 结束日期 (YYYY-MM-DD) | +| `result` | `string` | 否 | 结果过滤: `success` / `failure` | + +**Response `data`:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `records` | `AuditRecord[]` | 记录列表 | +| `total` | `number` | 总条数 | + +#### AuditRecord + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id` | `string` | 记录 ID | +| `timestamp` | `string` | 操作时间(`YYYY-MM-DD HH:mm:ss`) | +| `operator` | `string` | 操作人(如 `admin`, `ops-zhang`, `system`) | +| `operationType` | `string` | 操作类型: `创建Topic` / `删除Topic` / `修改配置` / `重置位点` / `ACL变更` / `重启Broker` / `删除消费组` | +| `target` | `string` | 操作对象 | +| `detail` | `string` | 详细描述 | +| `ipAddress` | `string` | 操作 IP 地址 | +| `result` | `string` | 结果: `success` / `failure` | + +### 13.2 清理审计日志 + +``` +POST /api/audit-logs/cleanup +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `beforeDays` | `number` | 是 | 清理多少天之前的日志(1-365) | + +**Response `data`:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `deleted` | `number` | 清理数量 | + +--- + +## 14. 系统设置 Settings + +### 14.1 获取通用设置 + +``` +GET /api/settings/general +``` + +**Response `data`:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `theme` | `string` | 主题: `light` / `dark` / `system` | +| `compact` | `boolean` | 紧凑模式 | +| `desktopNotify` | `boolean` | 桌面通知 | +| `notifySound` | `boolean` | 通知声音 | +| `sessionTimeout` | `number` | 会话超时(分钟,5-1440) | +| `requireLogin` | `boolean` | 是否需要登录 | +| `llmProvider` | `string` | LLM 提供商: `openai` / `azure` / `ollama` / `qwen` | +| `apiKey` | `string` | API Key | +| `model` | `string` | 模型名称 | +| `baseUrl` | `string` | Base URL | + +### 14.2 保存通用设置 + +``` +POST /api/settings/general/save +``` + +**Request Body:** 同 14.1 响应格式 + +**Response `data`:** `null` + +### 14.3 获取数据源列表 + +``` +GET /api/settings/datasources +``` + +**Response `data`:** `DataSource[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `key` | `string` | 数据源 ID | +| `name` | `string` | 名称 | +| `type` | `string` | 类型: `Prometheus` / `VictoriaMetrics` / `Thanos` | +| `url` | `string` | 连接 URL | +| `auth` | `string` | 认证方式: `None` / `Basic Auth` / `Bearer Token` | +| `status` | `string` | 状态: `healthy` / `error` | + +### 14.4 创建数据源 + +``` +POST /api/settings/datasources/create +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `name` | `string` | 是 | 名称 | +| `type` | `string` | 是 | 类型 | +| `url` | `string` | 是 | URL | +| `auth` | `string` | 否 | 认证方式,默认 `None` | + +**Response `data`:** `DataSource` + +### 14.5 更新数据源 + +``` +POST /api/settings/datasources/update +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `key` | `string` | 是 | 数据源 ID | +| `name` | `string` | 是 | 名称 | +| `type` | `string` | 是 | 类型 | +| `url` | `string` | 是 | URL | +| `auth` | `string` | 否 | 认证方式,默认 `None` | + +**Response `data`:** `DataSource` + +### 14.6 删除数据源 + +``` +POST /api/settings/datasources/delete +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `key` | `string` | 是 | 数据源 ID | + +**Response `data`:** `null` + +### 14.7 测试数据源连接 + +``` +POST /api/settings/datasources/test +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `url` | `string` | 是 | 连接 URL | +| `type` | `string` | 是 | 类型 | +| `auth` | `string` | 否 | 认证方式 | + +**Response `data`:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `success` | `boolean` | 是否连接成功 | +| `message` | `string?` | 错误信息 | + +--- + +## 15. AI 交互 + +### 15.1 发送 AI 消息 + +``` +POST /api/ai/chat +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `message` | `string` | 是 | 用户消息 | +| `mode` | `string` | 否 | 模式: `query` / `diagnose` / `manage` / `chat` | +| `model` | `string` | 否 | 模型名称 | +| `conversationId` | `string` | 否 | 会话 ID(续接对话) | + +**Response:** `text/event-stream`(SSE 流式返回) + +### 15.2 执行 AI 指令 + +``` +POST /api/ai/execute +``` + +**Request Body:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `command` | `string` | AI 生成的可执行指令 | + +**Response `data`:** + +| 字段 | 类型 | 说明 | +|------|------|------| +| `success` | `boolean` | 执行结果 | +| `result` | `string` | 执行输出 | + +### 15.3 获取可用工具列表 + +``` +GET /api/ai/tools +``` + +**Response `data`:** `Tool[]` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `name` | `string` | 工具名称 | +| `description` | `string` | 工具描述 | +| `parameters` | `object` | 参数 Schema | + +--- + +## 16. 监控指标 Metrics + +### 16.1 查询监控指标数据 + +``` +POST /api/metrics/query +``` + +**Request Body:** + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `metric` | `string` | 是 | 指标名称(如 `tps_in`、`tps_out`、`message_count`、`disk_usage`) | +| `start` | `number` | 是 | 起始时间(Unix 时间戳,秒) | +| `end` | `number` | 是 | 结束时间(Unix 时间戳,秒) | +| `step` | `string` | 否 | 采样步长(如 `"60s"`、`"5m"`、`"1h"`) | + +**Response `data`:** `MetricsResult` + +| 字段 | 类型 | 说明 | +|------|------|------| +| `metric` | `string` | 指标名称 | +| `values` | `[number, number][]` | 数据点数组,每项为 `[timestamp, value]` | + +--- + +## 附录 A:枚举值速查 + +| 枚举 | 值 | +|------|---| +| **集群状态** | `healthy`, `warning`, `error`, `offline` | +| **Broker 状态** | `running`, `readonly`, `maintenance` | +| **节点状态** | `healthy`, `warning`, `error`, `offline` | +| **Topic 类型** | `NORMAL`, `FIFO`, `DELAY`, `TRANSACTION`, `LITE` | +| **Topic 权限** | `RW`, `RO`, `WO` | +| **消费类型** | `CLUSTERING`, `BROADCASTING` | +| **订阅模式** | `Push`, `Pop` | +| **协议** | `gRPC`, `Remoting` | +| **客户端语言** | `Java`, `Go`, `Python`, `Rust`, `C++`, `C#`, `Node.js`, `PHP` | +| **ACL 资源类型** | `Topic`, `Group`, `Cluster` | +| **ACL 匹配模式** | `LITERAL`, `PREFIX` | +| **ACL 操作** | `PUB`, `SUB`, `ALL` | +| **ACL 决策** | `ALLOW`, `DENY` | +| **告警级别** | `error`, `warning`, `info` | +| **审计结果** | `success`, `failure` | +| **投递状态** | `success`, `failed`, `pending` | +| **证书状态** | `valid`, `expiring`, `expired` | +| **证书类型** | `TLS`, `mTLS`, `ServiceAccount` | +| **刷盘方式** | `ASYNC_FLUSH`, `SYNC_FLUSH` | +| **集群类型** | `V4_DIRECT`, `V5_PROXY_LOCAL`, `V5_PROXY_CLUSTER` | +| **顺序类型** | `PARTITON_ORDER`, `MESSAGES_ORDER` | +| **通知渠道** | `dingtalk`, `email`, `sms` | +| **LLM 提供商** | `openai`, `azure`, `ollama`, `qwen` | +| **数据源类型** | `Prometheus`, `VictoriaMetrics`, `Thanos` |
