架構
本頁以一張圖呈現 go-web-monitor 各套件的層級關係,並列出每層的職責與跨層共用的設計原則。
系統概覽
graph TB
Main[cmd/tui<br/>main] -->|util.Read / util.Save| Store[(.webMonitor.json)]
Main -->|service.New| Monitor[service.Monitor]
Main -->|service.NewUI| UI[service.UI]
UI -->|Ticker 每分鐘 / refresh| Monitor
UI -->|指令方法| Monitor
Monitor -->|Check: HEAD → GET| Site[目標網站]
Monitor -->|util.CheckExpire| TLS[目標網站 :443]
Monitor -->|sendEmail / TestEmail| SMTP[service.SMTP]
SMTP --> Mail[郵件伺服器]
Monitor -->|Save| Store
分層
| 層 | 套件/檔案 | 職責 |
|---|---|---|
| 入口 | cmd/tui/main.go |
建立或讀取 .webMonitor.json,組裝 Monitor 與 UI 後執行 |
| 介面 | internal/service/ui.go |
tview 介面、每分鐘排程、指令解析、表格與面板渲染 |
| 監控核心 | internal/service/monitor.go |
監控清單與狀態表、HTTP 探測、失敗計數、告警觸發、SMTP 設定管理 |
| 寄信 | internal/service/smtp.go |
依 port 選擇明文/隱式 TLS/STARTTLS,寄出 HTML 信件 |
| 工具 | internal/util/ |
JSON 設定檔讀寫、SSL 憑證剩餘天數 |
| 資料模型 | internal/model/model.go |
Website、Config、MonitorData |
跨層原則
| 原則 | 實作 |
|---|---|
| 單一持久化檔案 | 所有狀態與設定都寫在當前目錄的 .webMonitor.json,沒有資料庫或外部服務 |
| 狀態集中於 Monitor | UI 不持有資料,只透過 Monitor 的 getter 與指令方法讀寫 |
共享狀態以 sync.RWMutex 保護 |
list、status、config、isShow 由同一把鎖保護(覆蓋範圍不完整,見 已知限制) |
| 無外部相依的網路層 | HTTP、TLS、SMTP 全用標準庫;第三方套件只有 tview 與 tcell |
延伸閱讀
- 模組級完整圖(各模組內部、序列圖、狀態機):doc/architecture.zh.md
- 每輪檢查的流程:監控週期