|
|
1 semana atrás | |
|---|---|---|
| frontend | 1 semana atrás | |
| src | 1 semana atrás | |
| .gitignore | 1 semana atrás | |
| README.md | 1 semana atrás | |
| pom.xml | 1 semana atrás |
基于 Java 21 + Spring Boot 3.4 + React 18 的本机硬件监控系统,通过 OSHI 采集硬件指标,WebSocket 实时推送至前端仪表盘,支持历史数据持久化与趋势分析。
| 层 | 技术 |
|---|---|
| 后端 | Java 21, Spring Boot 3.4.4, Spring WebSocket, Spring Data JPA, OSHI 6.6.5 |
| 数据库 | H2 (嵌入式文件存储) |
| 缓存 | Caffeine |
| 前端 | React 18, TypeScript, Ant Design 5, ECharts 5, Zustand, Vite 6 |
| 构建 | Maven, Vite |
| 类别 | 指标 |
|---|---|
| CPU | 使用率、各核心负载、温度、频率、缓存 |
| 内存 | 使用率、已用/可用/总量、交换分区 |
| 磁盘 | 容量、读写速率、接口类型、S.M.A.R.T. 健康状态 |
| GPU | 型号、显存、温度 |
| 网络 | 上下行速率、接口详情、MAC/IP 脱敏 |
| 系统 | 主板、BIOS、OS 版本 |
# 终端 1:启动后端
cd hw-monitor
mvn clean package -DskipTests
java -jar target/hw-monitor-1.0.0.jar
# 终端 2:启动前端开发服务器
cd hw-monitor/frontend
npm install
npm run dev
访问 http://127.0.0.1:3000 查看仪表盘。
# 1. 构建前端
cd hw-monitor/frontend
npm install
npm run build
# 2. 复制构建产物到 static 目录
cp -r dist/* ../src/main/resources/static/
# 3. 打包并运行
cd ..
mvn clean package -DskipTests
java -jar target/hw-monitor-1.0.0.jar
访问 http://127.0.0.1:9988 查看仪表盘。
| 页面 | 路由 | 功能说明 |
|---|---|---|
| 仪表盘总览 | / |
6 个核心指标卡片,异常告警高亮 |
| CPU 详情 | /cpu |
各核心柱状图 + 温度 + 频率 |
| 内存详情 | /memory |
环形图 + 交换分区 + 内存条表格 |
| 磁盘详情 | /disk |
容量饼图 + 读写速率 + S.M.A.R.T. |
| GPU 详情 | /gpu |
仪表盘 + 温度 + 显存 |
| 网络详情 | /network |
实时速率对比 + 接口详情 |
| 系统信息 | /system |
主板/BIOS/OS 静态信息 |
| 历史趋势 | /history |
时间范围 + 指标类型筛选 |
Header 右侧提供 30 秒 / 60 秒 两档切换按钮,点击即时生效,无需重启。
仪表盘卡片在以下情况自动红色高亮边框:
| 指标 | 阈值 |
|---|---|
| CPU 使用率 | > 90% |
| 内存使用率 | > 85% |
| 磁盘使用率 | > 90% |
| 温度 | > 80°C |
| 方法 | 端点 | 说明 |
|---|---|---|
| GET | /api/v1/overview |
获取所有硬件概览数据 |
| GET | /api/v1/cpu |
获取 CPU 详情 |
| GET | /api/v1/memory |
获取内存详情 |
| GET | /api/v1/disk |
获取磁盘详情 |
| GET | /api/v1/gpu |
获取 GPU 详情 |
| GET | /api/v1/network |
获取网络详情 |
| GET | /api/v1/system |
获取系统信息 |
| GET | /api/v1/history |
获取历史数据(支持 ?start=&end=&category= 筛选) |
| GET | /api/v1/config/interval |
获取当前采集间隔 |
| PUT | /api/v1/config/interval |
修改采集间隔(body: {"intervalSeconds": 30}) |
| GET | /api/v1/health |
健康检查 |
ws://127.0.0.1:9988/ws/metrics消息格式:
{
"type": "metrics",
"timestamp": 1700000000000,
"data": {
"cpu": { "usagePercent": 23.0, "temperature": 45.0, ... },
"memory": { "usagePercent": 74.2, "usedBytes": 25125584896, ... },
"disk": { "partitions": [...] },
"gpu": { "name": "Intel(R) Arc(TM) 130T GPU", ... },
"network": { "interfaces": [...] },
"system": { "osName": "Windows 11", ... }
}
}
| 依赖 | 版本 |
|---|---|
| JDK | 21+ |
| Maven | 3.9+ |
| Node.js | 18+ (仅前端开发) |
| 操作系统 | Windows / Linux / macOS |
所有可配置参数位于 src/main/resources/application.yml:
server:
port: 9988 # 监听端口
address: 127.0.0.1 # 仅监听本地,实现网络隔离
spring:
threads:
virtual:
enabled: true # 启用虚拟线程
hwmonitor:
collect-interval-seconds: 30 # 采集间隔(30/60)
history:
retention-days: 7 # 历史数据保留天数
alert:
cpu-threshold: 90 # CPU 告警阈值 (%)
memory-threshold: 85 # 内存告警阈值 (%)
disk-threshold: 90 # 磁盘告警阈值 (%)
temp-threshold: 80 # 温度告警阈值 (°C)
security:
allowed-origins: http://localhost:9988
enable-token: false # Token 认证(默认关闭)
read-only: true # 只读模式
| 措施 | 说明 |
|---|---|
| 网络隔离 | 服务仅监听 127.0.0.1,不对外暴露 |
| 只读原则 | 所有 API 均为 GET 请求(除配置修改外) |
| 数据脱敏 | MAC 地址掩码、公网 IP 仅显示前两段、磁盘序列号脱敏 |
| 日志安全 | 不输出敏感硬件信息 |
| H2 Console | 已禁用 |
| Actuator | 仅暴露 /health 端点 |
./data/hwmonitor.mv.db./data 目录后重启即可使用 WinSW 将 jar 注册为 Windows 服务:
<!-- hw-monitor-service.xml -->
<service>
<id>hw-monitor</id>
<name>Hardware Monitor</name>
<description>本机硬件监控服务</description>
<executable>java</executable>
<arguments>-jar hw-monitor-1.0.0.jar</arguments>
<workingdirectory>D:\ideaFactory\hw-monitor</workingdirectory>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>
# 安装服务
hw-monitor-service.exe install
# 启动服务
hw-monitor-service.exe start
# /etc/systemd/system/hw-monitor.service
[Unit]
Description=Hardware Monitor Service
After=network.target
[Service]
Type=simple
User=monitor
WorkingDirectory=/opt/hw-monitor
ExecStart=/usr/bin/java -jar /opt/hw-monitor/hw-monitor-1.0.0.jar
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable hw-monitor
sudo systemctl start hw-monitor
hw-monitor/
├── src/main/java/com/hwmonitor/
│ ├── HwMonitorApplication.java # Spring Boot 启动类
│ ├── collector/ # 硬件采集器(6个)
│ │ ├── CpuCollector.java
│ │ ├── MemoryCollector.java
│ │ ├── DiskCollector.java
│ │ ├── GpuCollector.java
│ │ ├── NetworkCollector.java
│ │ └── SystemCollector.java
│ ├── config/ # 配置类
│ │ ├── BrowserLauncher.java # 启动自动打开浏览器
│ │ ├── CacheConfig.java # Caffeine 缓存
│ │ ├── MonitorConfig.java # 采集频率配置
│ │ └── WebSocketConfig.java # WebSocket 配置
│ ├── controller/ # 控制器
│ │ ├── MetricsController.java # REST API
│ │ ├── ConfigController.java # 配置 API
│ │ ├── HistoryController.java # 历史数据 API
│ │ └── MetricsWebSocketHandler.java # WebSocket 处理器
│ ├── model/ # 数据模型
│ │ ├── dto/ # 7个 DTO
│ │ └── entity/ # 1个实体
│ ├── repository/ # JPA Repository
│ ├── scheduler/ # 定时调度
│ └── service/ # 业务服务
├── src/main/resources/
│ └── application.yml # 全局配置
├── frontend/ # 前端项目
│ └── src/
│ ├── components/ # 页面组件(8个)
│ ├── services/api.ts # API 封装
│ ├── store/metricsStore.ts # 状态管理
│ ├── types.ts # TypeScript 类型
│ └── App.tsx # 根组件
└── pom.xml # Maven 配置
Q: 启动后浏览器显示"连接断开"? A: 等待 3-5 秒,WebSocket 会自动重连。若持续断开,检查后端是否正常启动在 9988 端口。
Q: 磁盘使用率显示 0%? A: 某些磁盘分区信息需管理员权限才能获取使用量,以管理员身份运行可解决。
Q: GPU 信息显示 "--"? A: OSHI 在某些平台无法获取 GPU 使用率,型号和显存信息正常即可。
Q: 如何修改采集频率?
A: 方式一:点击前端 Header 右侧 30秒/60秒 按钮即时切换;方式二:修改 application.yml 中的 collect-interval-seconds 配置后重启。
Q: 历史数据占用空间大吗? A: 按默认 30 秒采集间隔,每条记录约 100 字节,7 天约产生 2MB 数据,可忽略不计。