Spring Boot 使用 OSHI 实现系统运行状态监控接口
在实际开发中,我们经常需要获取服务器的运行状态,例如:CPU 使用率、内存使用情况、磁盘状态、JVM 运行信息等,以便于运维监控和性能分析。本文将基于 Spring Boot + OSHI 实现一个系统信息接口,可返回当前服务运行的详细信息。
🚀 技术栈
-
Spring Boot
-
OSHI(Operating System and Hardware Information)
-
Java 8+
📦 引入依赖
在你的 pom.xml 中添加如下依赖(建议使用最新版):
<!-- OSHI 获取系统硬件信息 -->
<dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>6.4.4</version>
</dependency>
📄 控制器代码
创建一个 SystemInfoController 类,提供一个 /api/system/info 接口,返回系统、JVM、CPU、内存、磁盘等运行信息。
@RestController
@RequestMapping("/api/system")
public class SystemInfoController {private final long startTime = System.currentTimeMillis();@GetMapping("info")public Map<String, Object> getSystemInfo() {Map<String, Object> result = new LinkedHashMap<>();// 运行时长long uptimeMillis = System.currentTimeMillis() - startTime;result.put("项目运行时间", formatDuration(uptimeMillis));SystemInfo si = new SystemInfo();HardwareAbstractionLayer hal = si.getHardware();OperatingSystem os = si.getOperatingSystem();// CPU 信息CentralProcessor processor = hal.getProcessor();Map<String, Object> cpu = new LinkedHashMap<>();int coreCount = processor.getLogicalProcessorCount();long[] ticks1 = processor.getSystemCpuLoadTicks();try { Thread.sleep(1000); } catch (InterruptedException ignored) {}long[] ticks2 = processor.getSystemCpuLoadTicks();long user = ticks2[CentralProcessor.TickType.USER.getIndex()] - ticks1[CentralProcessor.TickType.USER.getIndex()];long system = ticks2[CentralProcessor.TickType.SYSTEM.getIndex()] - ticks1[CentralProcessor.TickType.SYSTEM.getIndex()];long idle = ticks2[CentralProcessor.TickType.IDLE.getIndex()] - ticks1[CentralProcessor.TickType.IDLE.getIndex()];long total = Arrays.stream(ticks2).sum() - Arrays.stream(ticks1).sum();cpu.put("核心数", coreCount);cpu.put("用户使用率", String.format("%.2f%%", user * 100.0 / total));cpu.put("系统使用率", String.format("%.2f%%", system * 100.0 / total));cpu.put("当前空闲率", String.format("%.2f%%", idle * 100.0 / total));result.put("CPU", cpu);// 内存信息GlobalMemory memory = hal.getMemory();Map<String, Object> mem = new LinkedHashMap<>();long totalMem = memory.getTotal();long available = memory.getAvailable();long used = totalMem - available;mem.put("总内存", FormatUtil.formatBytes(totalMem));mem.put("已用内存", FormatUtil.formatBytes(used));mem.put("剩余内存", FormatUtil.formatBytes(available));mem.put("使用率", String.format("%.2f%%", used * 100.0 / totalMem));result.put("内存", mem);// JVM 信息RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();Map<String, Object> jvm = new LinkedHashMap<>();jvm.put("JVM名称", runtime.getVmName());jvm.put("Java版本", System.getProperty("java.version"));jvm.put("启动时间", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(runtime.getStartTime())));jvm.put("运行时长", formatDuration(uptimeMillis));jvm.put("运行路径", System.getProperty("user.dir"));jvm.put("启动类路径", System.getProperty("java.class.path"));jvm.put("启动参数", runtime.getInputArguments());result.put("JVM", jvm);// 服务器信息Map<String, Object> server = new LinkedHashMap<>();try {server.put("服务器名称", InetAddress.getLocalHost().getHostName());server.put("服务器IP", InetAddress.getLocalHost().getHostAddress());} catch (Exception e) {server.put("服务器名称", "未知");server.put("服务器IP", "未知");}server.put("操作系统", os.toString());server.put("系统架构", System.getProperty("os.arch"));result.put("服务器信息", server);// 磁盘信息FileSystem fileSystem = os.getFileSystem();List<OSFileStore> fileStores = fileSystem.getFileStores();List<Map<String, String>> disks = new ArrayList<>();for (OSFileStore fs : fileStores) {Map<String, String> disk = new LinkedHashMap<>();disk.put("盘符路径", fs.getMount());disk.put("类型", fs.getType());disk.put("总大小", FormatUtil.formatBytes(fs.getTotalSpace()));disk.put("可用空间", FormatUtil.formatBytes(fs.getUsableSpace()));disks.add(disk);}result.put("磁盘状态", disks);return result;}// 格式化运行时长private String formatDuration(long uptimeMillis) {long seconds = uptimeMillis / 1000;long days = seconds / (3600 * 24);long hours = (seconds % (3600 * 24)) / 3600;long minutes = (seconds % 3600) / 60;return String.format("%d天%d小时%d分钟", days, hours, minutes);}
}
🔍 接口示例
访问路径:
GET /api/system/info
响应示例:
{"项目运行时间": "0天1小时23分钟","CPU": {"核心数": 8,"用户使用率": "3.57%","系统使用率": "1.29%","当前空闲率": "94.31%"},"内存": {"总内存": "16.0 GiB","已用内存": "8.2 GiB","剩余内存": "7.8 GiB","使用率": "51.33%"},"JVM": {"JVM名称": "OpenJDK 64-Bit Server VM","Java版本": "17","启动时间": "2025-05-13 08:00:00","运行时长": "0天2小时10分钟","运行路径": "/app","启动类路径": "...","启动参数": [...]},"服务器信息": {"服务器名称": "server-01","服务器IP": "192.168.1.10","操作系统": "Linux 5.15.0-1051-azure","系统架构": "amd64"},"磁盘状态": [{"盘符路径": "/","类型": "ext4","总大小": "100.0 GiB","可用空间": "62.5 GiB"}]
}
📌 总结
本文介绍了如何使用 OSHI 在 Spring Boot 项目中快速构建一个系统运行状态接口,包括 CPU、内存、JVM、服务器信息、磁盘空间等,非常适合用于服务健康检查、后台管理系统监控页等场景。
如果你觉得有用,欢迎点赞 👍、收藏 ⭐、评论交流 💬!
如需源码,可在评论区留言获取或私信我~
相关文章:
Spring Boot 使用 OSHI 实现系统运行状态监控接口
在实际开发中,我们经常需要获取服务器的运行状态,例如:CPU 使用率、内存使用情况、磁盘状态、JVM 运行信息等,以便于运维监控和性能分析。本文将基于 Spring Boot OSHI 实现一个系统信息接口,可返回当前服务运行的详细…...
FastAPI+MongoDB+React实现查询博客详情功能
第一部分:FastAPI 和 MongoDB 后端 确保你的 FastAPI 应用已经配置好,并且 MongoDB 数据库已经运行。以下是完整的后端代码: # main.py from fastapi import FastAPI, HTTPException, Depends from motor.motor_asyncio import AsyncIOMotorClient from pydantic import B…...

kotlin-协程(什么是一个协程)
1.什么指一个协程对于线程来说一个thread就是就是指一个线程,thread为什么成为线程呢?因为他实现了对线程的一个抽象管理,可以管理这个线程,启动,可以查看各种信息 那么协程呢? public fun CoroutineScop…...

数组和切片的区别
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

WPF内嵌其他进程的窗口
WPF内嵌其他进程窗口的常见方法有 HwndHost SetParent 和 WindowsFormsHost WinForms Panel SetParent 推荐使用自定义HwndHost 两者的对比区别 示例代码 public class MyWndHost : HwndHost {const int WS_CHILD 0x40000000;const int WS_VISIBLE 0x10000000;const i…...
阿里云购买ECS 安装redis mysql nginx jdk 部署jar 部署web
服务:ECS防火墙要开启、阿里云控制平台:网路端口安全策略要设置 阿里云服务维护 1.安装JDK 查询要安装jdk的版本,命令:yum -y list java* 命令:yum install -y java-1.8.0-openjdk.x86_64 yum install -y java-17-openjdk.x8…...

CVPR2025 | Prompt-CAM: 让视觉 Transformer 可解释以进行细粒度分析
Prompt-CAM: Making Vision Transformers Interpretable for Fine-Grained Analysis 摘要-Abstract引言-Introduction方法-Approach预备知识-PreliminariesPrompt-CAM: Prompt Class Attention Map特征识别与定位-Trait Identification and Localization变体与扩展-Variants an…...
Fabric系列 - SoftHSM 软件模拟HSM
在 fabric-ca-server 上使用软件模拟的 HSM(密码卡) 功能 安装 SoftHSMv2 教程 SoftHSMv2 默认的配置文件 /etc/softhsm2.conf默认的token目录 /var/lib/softhsm/tokens/ 初始化和启动fabric-ca-server,需要设置一个管理员用户的名称和密码 初始化令牌 # 初始…...

解锁 DevOps 新境界 :使用 Flux 进行 GitOps 现场演示 – 自动化您的 Kubernetes 部署
前言 GitOps 是实现持续部署的云原生方式。它的名字来源于标准且占主导地位的版本控制系统 Git。GitOps 的 Git 在某种程度上类似于 Kubernetes 的 etcd,但更进一步,因为 etcd 本身不保存版本历史记录。毋庸置疑,任何源代码管理服务…...
LLM大模型中的基础数学工具—— 信号处理与傅里叶分析
Q51: 推导傅里叶变换 的 Parseval 定理 傅里叶变换的 Parseval 定理揭示了啥关系? Parseval 定理揭示了傅里叶变换中时域与频域的能量守恒关系,即信号在时域的总能量等于其在频域的总能量。这就好比一个物体无论从哪个角度称重,重量始终不…...
calico.yaml+国内源
pod网段为:10.244.0.0/16 #kubeadm init 时设置的pod网段,每个环境不同,参考自身环境。 calico.yaml文件里的镜像均为: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/cni:v3.26.1 swr.cn-north-4.myhuaweiclou…...

橡胶制品行业质检管理的痛点 质检LIMS如何重构橡胶制品质检价值链
橡胶制品广泛应用于汽车、医疗、航空等领域,其性能稳定性直接关联终端产品的安全性。从轮胎耐磨性测试到密封件耐腐蚀性验证,每一项检测数据都是企业参与市场竞争的核心筹码。然而,传统实验室管理模式普遍面临设备调度混乱、检测流程追溯断层…...
5.2 参数管理
目标 访问参数,用于调试、诊断和可视化;参数初始化;在不同模型组件间共享参数。 模型:单隐藏层的MLP import torch from torch import nnnet nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1)) X torch.rand(size…...
gvm安装go报错ERROR: Failed to use installed version
这里写自定义目录标题 使用gvm安装版本报错解决方案可以尝试在版本后面添加--binary,例如还不行记得在多切换几个准确的版本 使用gvm安装版本报错 gvm install go1.22 Installing go1.22.0 as go1.22… Compiling… /Users/uncledd2/.gvm/scripts/install: line 9…...

CAElinux系统详解
CAElinux 系统详解:从系统层面到专业应用 一、CAElinux 的定位与核心目标 CAElinux 是一款专门为 计算机辅助工程(CAE) 设计的定制化 Linux 发行版,目标用户为从事工程仿真、数值模拟、高性能计算(HPC)的…...

计算机系统----软考中级软件设计师(自用学习笔记)
目录 1、计算机的基本硬件系统 2、CPU的功能 3、运算器的组成 4、控制器 5、计算机的基本单位 6、进制转换问题 7、原码、反码、补码、移码 8、浮点数 9、寻址方式 10、奇偶校验码 11、海明码 12、循环冗余校验码 13、RISC和CISC 14、指令的处理方式 15、存储器…...

django的权限角色管理(RBAC)
在 Django 中,User、Group 和 Permission 是权限系统的核心组件。下面通过代码示例演示它们的 CRUD(创建、读取、更新、删除) 操作: 一、User 模型 CRUD from django.contrib.auth.models import User# 创建用户 user User.obje…...
新建一个reactnative 0.72.0的项目
npx react-native0.72.0 init ProjectName --version 0.72.0 下面是初始化,并且添加了对应路由的库依赖,Android项目能run起来的版本号 { "name": "ProjectName", "version": "0.0.1", "private&quo…...

线性表-顺序表(Sequential List)
1 线性表 1.1 顺序表(Sequential List) 顺序表并不难理解,主要是知道顺序表是在内存中连续存储的一段数据,知道这个后,相应的算法也就非常简单了。 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的…...
框架篇八股(自用)
框架篇 Spring框架中的bean不是线程安全的 Scope() singleton单例 prototype多例 一个类中有可修改的成员变量需要考虑线程安全 bean没有可变状态(service类,DAO类) 某种程度单例bean是线程安全的 AOP面向切面编程…...
软考高级《系统架构设计师》知识点(十七)
知识产权和标准化 知识产权基础知识 知识产权是指公民、法人、非法人单位、对自己的创造性智力成果和其他科技成果依法享有的民事权。是智力成果的创造人依法享有的权利和在生产经营活动中标记所有人依法所享有的权利的总称。 知识产权基础知识包含著作权、专利权、商标权、商业…...
在 Envoy 的配置文件中出现的 “@type“ 字段
在 Envoy 的配置文件中出现的 "type" 字段是 Protocol Buffers(Protobuf)的 JSON/YAML 编码规范的一部分,属于 Typed Struct 的表示方式。它的作用是明确指定当前配置对象的 Protobuf 类型,以便 Envoy 正确解析配置。以…...
思维链实现 方式解析
思维链的实现方式 思维链的实现方式除了提示词先后顺序外,还有以下几种: 增加详细的中间步骤提示:通过提供问题解决过程中的详细中间步骤提示,引导模型逐步推导和思考。例如,在解决数学证明题时,提示词可以具体到每一步需要运用的定理、公式以及推理的方向,帮助模型构建…...
计算机网络:什么是Mesh组网以及都有哪些设备支持Mesh组网?
Mesh组网技术详解与实现工具推荐 Mesh组网是一种通过多个节点路由器协同工作,形成覆盖全屋的无线网络的技术。它通过动态路径调整、无缝漫游和自愈能力,解决传统单一路由器覆盖不足的问题,尤其适合大户型、多层住宅或复杂户型环境。以下是Mesh组网的核心原理、实现方式及推…...

【阿里云免费领取域名以及ssl证书,通过Nginx反向代理web服务】
文章目录 前言一、申请域名1.1 访问阿里云官网1.2 输入自定义域名1.3 创建个人模板1.4 支付1元可以使用域名1年1.5 按照提示实名认证1.6 实名认证成功 二、域名解析2.1 选择域名解析2.2 解析设置2.3 快速添加解析2.4 选择对应类型2.5 解析成功 三、申请免费ssl证书3.1 访问阿里…...

数据分析2
五、文件 CSV Comma-Separated Value,逗号分割值。CSV文件以纯文本形式存储表格数据(数字和文本)。 CSV记录间以某种换行符分隔,每条记录由字段组成,字段间以其他字符或字符串分割,最常用逗号或制表符。…...

实战项目5(08)
目录 任务场景一 【r1配置】 【r2配置】 【r3配置】 任务场景二 【r1配置】 【r2配置】 任务场景一 按照下图完成网络拓扑搭建和配置 任务要求: 通过在路由器R1、R2和R3上配置静态路由,实现网络中各终端PC能够正常…...
CSS结构性伪类、UI伪类与动态伪类全解析:从文档结构到交互状态的精准选择
一、结构性伪类选择器:文档树中的位置导航器 结构性伪类选择器是CSS中基于元素在HTML文档树中的层级关系、位置索引或结构特征进行匹配的一类选择器。它们无需依赖具体的类名或ID,仅通过文档结构即可精准定位元素,是实现响应式布局和复杂文档…...

.NET MAUI 基础知识
文章目录 什么是 .NET MAUI?MAUI的核心特点与Xamarin.Forms的区别 开发环境搭建安装Visual Studio 2022安装必要组件配置Android开发环境配置iOS开发环境验证安装 创建第一个MAUI应用创建新项目MAUI项目结构解析理解关键文件运行应用程序简单修改示例使用热重载 MAU…...

佰力博科技与您探讨表面电阻的测试方法及应用领域
表面电阻测试是一种用于测量材料表面电阻值的技术,广泛应用于评估材料的导电性能、静电防护性能以及绝缘性能。 1、表面电阻的测试测试方法: 表面电阻测试通常采用平行电极法、同心圆电极法和四探针法等方法进行。其中,平行电极法通过在试样…...