架构概览¶
Rover 采用 Electron + sing-box 架构,分为应用层、内核层和系统服务层。
整体架构¶
Rover 应用 (Electron + React + TypeScript)
├── 看板 / 订阅 / 代理
├── 策略 / 规则集 / 连接
└── DNS 策略 / 设置 / 日志
│
│ IPC 通信 (Electron 主进程)
▼
┌─────────────────────────────────────────────────────────────┐
│ 主进程 (Node.js) │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 路径 1: 本地模式 (Local) │ │
│ │ │ │
│ │ Rover ──────────────► sing-box (子进程) │ │
│ │ 直接启动 (普通用户权限) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ ▲ │
│ │ │
│ ┌──────────────────────────┼──────────────────────────┐ │
│ │ │ 路径 2: 服务模式 │ │
│ │ │ (Service) │ │
│ │ │ │ │
│ │ Rover ────────────────►│ RoverService (系统服务) │ │
│ │ HTTP over │ └── 启动/停止 sing-box │ │
│ │ Socket / Named Pipe │ (管理员权限) │ │
│ │ │ │ │
│ └──────────────────────────┴──────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
关键组件¶
| 组件 | 技术栈 | 职责 |
|---|---|---|
| Rover 应用 | Electron + React | 用户界面、数据管理、配置生成 |
| sing-box 内核 | Go | 代理转发、流量分流、DNS 解析 |
| RoverService | Go (系统服务) | sing-box 进程管理、本地 DoH DNS 服务器、特权文件操作 |
| JSON 数据文件 | Node.js fs | 存储策略规则、DNS 策略、设置 |
| sing-box API | HTTP | 运行时状态查询、连接管理 |
数据流¶
- 用户在界面操作(添加规则、切换节点等)
- 操作写入 JSON 数据文件
- 配置生成器从 JSON 数据读取,生成 sing-box 配置
- 内核管理器重启 sing-box 加载新配置
- sing-box 按配置处理流量
为什么使用 JSON 文件?
Rover 使用 JSON 文件作为本地数据存储,因为: - 格式简单直观,易于调试和手动编辑 - 无需额外依赖,Node.js 原生支持 - 人类可读,方便用户备份和迁移 - 适合单用户桌面应用的轻量存储需求
通信机制¶
| 通信方式 | 方向 | 用途 |
|---|---|---|
| Electron IPC | 渲染进程 → 主进程 | 界面操作传递到后端 |
| HTTP API | 主进程 ↔ sing-box (9090) | 状态查询、连接管理 |
| HTTP/DoH | 主进程 ↔ RoverService | DNS 查询转发 |
| HTTP API | 主进程 ↔ RoverService | sing-box 进程管理 (启动/停止/重启) |