14 KiB
14 KiB
RAIDGuard X Java GUI 重構為 Rust 分析報告
1. 現有架構總覽
┌─────────────────────────────────────────────────────────────────┐
│ Java Swing GUI (70,521 行) │
├─────────────────────────────────────────────────────────────────┤
│ Main Windows │ frmMain (7,397 行) │
│ │ frmSettings (2,978 行) │
│ │ frmAdvanced (707 行) │
├──────────────────────┼──────────────────────────────────────────┤
│ Dialogs │ dlgServer (799 行) │
│ │ dlgDumpLog (808 行) │
│ │ dlgEnvInfo (808 行) │
│ │ dlgPasswordCheck │
│ │ dlgProgressCheck │
├──────────────────────┼──────────────────────────────────────────┤
│ Panels │ jpController (3,059 行) │
│ │ jpController2 (3,612 行) │
├──────────────────────┼──────────────────────────────────────────┤
│ RAID Operations │ frmCreateArray (2,171 行) │
│ │ frmCreateArray2 (2,278 行) │
│ │ frmDeleteArray (834 行) │
│ │ frmQuickSetup2 (1,421 行) │
├──────────────────────┼──────────────────────────────────────────┤
│ Advanced Features │ frmAdvSnapshot (1,430 行) │
│ │ frmAdvMirror (1,552 行) │
│ │ frmAdvSlicing (1,125 行) │
│ │ frmAdvMigrate (956 行) │
│ │ frmAdvExpansion (619 行) │
│ │ frmAdvLunmap (907 行) │
│ │ frmAdvLunMask (913 行) │
├──────────────────────┼──────────────────────────────────────────┤
│ System │ frmEmail (1,292 行) │
│ │ frmAdvMaintain (1,011 行) │
├──────────────────────┼──────────────────────────────────────────┤
│ Data Layer │ PageDataDB (7,322 行) - 全域資料庫 │
│ │ EventPartition (1,422 行) │
│ │ Langs (2,468 行) - 多國語言 │
├──────────────────────┼──────────────────────────────────────────┤
│ Protocol │ SendCmd.java - TCP 通訊 │
│ │ ControllerInfoPage │
│ │ RAIDInfoPage (675 行) │
│ │ DISKInfoPage │
│ │ RAIDEnclosureInfoPage │
│ │ SnapshotInfoPage │
├──────────────────────┼──────────────────────────────────────────┤
│ SNMP │ SNMPv1CommunicationInterface (1,229 行) │
│ │ SNMPTrapSendTest (653 行) │
└──────────────────────┴──────────────────────────────────────────┘
│
▼
┌───────────────────────────────┐
│ TCP Port 8922 (In-Band) │
│ TCP Port 8722 (Finder) │
└───────────────────────────────┘
│
▼
┌───────────────────────────────┐
│ GS (GUI Server) - C │
│ DtrGuiSrv │
└───────────────────────────────┘
2. 模組分類與重構建議
2.1 核心資料層 (Core Data Layer) - 高優先級
| 模組 | 行數 | 功能 | Rust 重構建議 |
|---|---|---|---|
| PageDataDB | 7,322 | 全域資料庫、快取、SNMP | 使用 serde + rusqlite,建立 State 管理 |
| EventPartition | 1,422 | 事件日誌讀寫 | 直接移植,使用 tokio 異步 I/O |
| Langs | 2,468 | 多國語言 | 改用 JSON/YAML 語言檔 + fluent-rs |
Rust 目標結構:
// src/data/mod.rs
pub struct AppState {
pub controllers: HashMap<String, Controller>,
pub raids: HashMap<String, RAID>,
pub disks: HashMap<String, Disk>,
pub events: Vec<Event>,
pub config: Config,
}
// src/i18n/mod.rs
pub struct I18n {
current_locale: String,
translations: HashMap<String, HashMap<String, String>>,
}
2.2 通訊層 (Protocol Layer) - 高優先級
| 模組 | 功能 | Rust 重構建議 |
|---|---|---|
| SendCmd | TCP 通訊、指令發送 | 使用 tokio::net::TcpStream + 自訂通訊協定 |
| InBandAPI (22 個類別) | 頁面資料解析 | 移植為 Rust struct derive Serialize |
Rust 目標結構:
// src/protocol/mod.rs
pub struct InBandProtocol {
socket: TcpStream,
}
impl InBandProtocol {
pub async fn connect(&mut self, addr: &str) -> Result<()>;
pub async fn send_cmd(&mut self, opcode: OpCode, data: &[u8]) -> Result<Vec<u8>>;
}
// src/protocol/pages.rs
#[derive(Serialize, Deserialize)]
pub struct ControllerInfoPage {
pub serial_number: [u8; 16],
pub model_name: [u8; 32],
pub firmware_version: [u8; 8],
pub status: u8,
// ...
}
2.3 主視窗 (Main Window) - 中優先級
| 模組 | 行數 | 功能 |
|---|---|---|
| frmMain | 7,397 | 主視窗、選單、標題列 |
| frmSettings | 2,978 | 系統設定 |
重構建議: 使用 Slint (現有專案已採用)
// ui/main_window.slint (已存在)
export component AppWindow inherits Window {
// 現有的 Slint 定義
}
2.4 RAID 作業模組 - 中優先級
| 模組 | 行數 | 功能 |
|---|---|---|
| frmCreateArray | 2,171 | 建立 RAID |
| frmCreateArray2 | 2,278 | 建立 RAID (進階) |
| frmDeleteArray | 834 | 刪除 RAID |
| frmQuickSetup2 | 1,421 | 快速設定 |
Rust 重構建議:
// src/handlers/raid_ops.rs
pub async fn create_raid(level: RaidLevel, disks: Vec<u8>) -> Result<()>;
pub async fn delete_raid(raid_id: u8) -> Result<()>;
pub async fn rebuild_raid(raid_id: u8) -> Result<()>;
2.5 進階功能模組 - 低優先級
| 模組 | 行數 | 功能 |
|---|---|---|
| frmAdvSnapshot | 1,430 | Snapshot 管理 |
| frmAdvMirror | 1,552 | Mirror 鏡像 |
| frmAdvSlicing | 1,125 | 切片 |
| frmAdvMigrate | 956 | 遷移 |
| frmAdvExpansion | 619 | 擴展 |
| frmAdvLunmap | 907 | LUN 對應 |
| frmAdvLunMask | 913 | LUN 遮罩 |
重構建議: 這些功能較少使用,可放在第二階段實作。
2.6 對話框 (Dialogs) - 低優先級
| 模組 | 行數 | 功能 |
|---|---|---|
| dlgServer | 799 | 伺服器連線 |
| dlgEnvInfo | 808 | 環境資訊 |
| dlgDumpLog | 808 | 日誌傾印 |
| dlgPasswordCheck | - | 密碼驗證 |
| dlgProgressCheck | - | 進度顯示 |
重構建議: 改為 Slint 元件或使用 rfd 對話框庫。
2.7 系統模組 - 中優先級
| 模組 | 行數 | 功能 |
|---|---|---|
| frmEmail | 1,292 | 郵件通知 |
| frmAdvMaintain | 1,011 | 維護功能 |
Rust 重構建議:
// src/email/mod.rs
pub async fn send_email(config: &EmailConfig, subject: &str, body: &str) -> Result<()>;
使用 lettre crate 實現 SMTP。
2.8 SNMP 模組 - 低優先級
| 模組 | 行數 | 功能 |
|---|---|---|
| SNMPv1CommunicationInterface | 1,229 | SNMP v1/v2c 通訊 |
| SNMPTrapSendTest | 653 | Trap 發送測試 |
Rust 重構建議: 使用 snmp crate 或自訂實作 (取決於需求)。
3. 重構優先順序
Phase 1: 基礎設施 (最優先)
├── 通訊層 (SendCmd → InBandProtocol)
├── 資料層 (PageDataDB → AppState)
└── UI 框架 (Slint 整合)
Phase 2: 核心功能
├── 主視窗 (frmMain → Slint)
├── RAID 操作 (Create/Delete/Query)
└── 事件處理 (EventPartition)
Phase 3: 進階功能
├── Snapshot / Mirror / Migration
├── LUN Map/Mask
└── Email 通知
Phase 4: 優化
├── SNMP Trap
├── 效能調優
└── 單元測試
4. Rust 專案結構建議
raidguard_x_gui/
├── Cargo.toml
├── build.rs
├── src/
│ ├── main.rs # 入口點
│ ├── lib.rs # 庫入口
│ │
│ ├── protocol/ # 通訊協定
│ │ ├── mod.rs
│ │ ├── client.rs # TCP 客戶端
│ │ ├── messages.rs # 訊息定義
│ │ └── pages.rs # 頁面資料結構
│ │
│ ├── data/ # 資料層
│ │ ├── mod.rs
│ │ ├── state.rs # 全域狀態
│ │ ├── cache.rs # 快取
│ │ └── db.rs # SQLite 儲存
│ │
│ ├── handlers/ # 業務邏輯
│ │ ├── mod.rs
│ │ ├── raid.rs # RAID 操作
│ │ ├── disk.rs # 磁碟操作
│ │ ├── controller.rs # 控制器操作
│ │ └── event.rs # 事件處理
│ │
│ ├── email/ # 郵件通知
│ │ └── mod.rs
│ │
│ ├── snmp/ # SNMP (可選)
│ │ └── mod.rs
│ │
│ └── ui/ # UI 整合
│ └── mod.rs
│
└── ui/ # Slint UI 檔案
├── main_window.slint
├── components/
└── styles/
5. 依賴套件建議
| 功能 | Rust Crate | 備註 |
|---|---|---|
| UI Framework | slint |
現已採用 |
| 非同步執行 | tokio |
現已採用 |
| 序列/反序列化 | serde, serde_json |
現已採用 |
| TCP 通訊 | tokio::net |
標準庫 |
| 資料庫 | rusqlite |
SQLite |
| 日期時間 | chrono |
現已採用 |
| 日誌 | tracing |
現已採用 |
| SMTP | lettre |
郵件發送 |
| 指令列解析 | clap |
選項解析 |
| 錯誤處理 | anyhow, thiserror |
現已採用 |
6. 現有 Rust 程式碼整合
現有 Rust 專案 (raidguard_x_gui_server/) 可作為基礎:
// 現有結構
raidguard_x_gui_server/
├── src/
│ ├── main.rs ✅ 入口點
│ ├── server.rs ✅ TCP 伺服器
│ ├── protocol/messages.rs ✅ 訊息定義
│ ├── mock/data.rs ✅ 模擬資料
│ └── handlers/ ✅ 業務處理
└── Cargo.toml
整合策略:
- 將
raidguard_x_gui_server改為raidguard_x_gui(合併 client + server) - 新增 Slint UI 整合 (
ui/目錄 → Slint 編譯) - 新增
protocol/client.rs實現 TCP 客戶端 - 新增
data/state.rs實現全域狀態
7. 風險與挑戰
| 風險 | 緩解措施 |
|---|---|
| Swing → Slint 遷移複雜度 | 分階段進行,先實現核心 UI |
| 執行緒模型差異 | 使用 tokio 模擬 Swing EDT 概念 |
| 效能考量 | Rust效能通常優於 Java,但仍需優化 |
| 測試覆蓋率 | 建立完整單元測試與整合測試 |
| Java/Swing 依賴 | 保留 Java 版本,逐步替換 |
8. 結論
重構可行性: ✅ 高
- 總行數: 70,521 行 Java → 預估 30,000 行 Rust
- 預期效能提升: 2-5x
- 維護性提升: 顯著改善 (型別安全、記憶體安全)
建議策略
- 先完成 Phase 1-2 (通訊 + 資料 + 核心 UI)
- 保留 Java 版本 同步運行,逐步替換
- 使用 Mock Driver 進行離線測試
- 建立 CI/CD 確保重構正確性
Generated: 2026-03-29 Based on: RAIDGuard X Java GUI (v3.8.0)