From 50efda3957dfb99201bdf6883631ee5bad14fd66 Mon Sep 17 00:00:00 2001
From: gaoxq <376340421@qq.com>
Date: Sat, 8 Nov 2025 15:27:21 +0800
Subject: [PATCH] =?UTF-8?q?=E9=82=AE=E4=BB=B6API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 28 +++++---
.../com/mini/capi/api/biz/bizController.java | 11 ++++
.../com/mini/capi/{sys => api}/startApp.java | 2 +-
.../com/mini/capi/api/sys/sysController.java | 64 +++++++++++++++++++
.../capi/config/component/AppNetworkInfo.java | 48 ++++++++++++++
.../capi/config/component/AppPathInfo.java | 31 +++++++++
.../capi/config/component/AppProcessInfo.java | 42 ++++++++++++
.../capi/config/component/AppRuntimeInfo.java | 54 ++++++++++++++++
.../com/mini/capi/model/info/NetworkInfo.java | 24 +++++++
.../com/mini/capi/model/info/PathInfo.java | 23 +++++++
.../com/mini/capi/model/info/ProcessInfo.java | 30 +++++++++
.../com/mini/capi/model/info/RunInfo.java | 23 +++++++
.../com/mini/capi/model/info/RuntimeInfo.java | 30 +++++++++
.../java/com/mini/capi/sys/ApiController.java | 6 --
src/main/resources/application.properties | 32 +++++++++-
15 files changed, 429 insertions(+), 19 deletions(-)
create mode 100644 src/main/java/com/mini/capi/api/biz/bizController.java
rename src/main/java/com/mini/capi/{sys => api}/startApp.java (50%)
create mode 100644 src/main/java/com/mini/capi/api/sys/sysController.java
create mode 100644 src/main/java/com/mini/capi/config/component/AppNetworkInfo.java
create mode 100644 src/main/java/com/mini/capi/config/component/AppPathInfo.java
create mode 100644 src/main/java/com/mini/capi/config/component/AppProcessInfo.java
create mode 100644 src/main/java/com/mini/capi/config/component/AppRuntimeInfo.java
create mode 100644 src/main/java/com/mini/capi/model/info/NetworkInfo.java
create mode 100644 src/main/java/com/mini/capi/model/info/PathInfo.java
create mode 100644 src/main/java/com/mini/capi/model/info/ProcessInfo.java
create mode 100644 src/main/java/com/mini/capi/model/info/RunInfo.java
create mode 100644 src/main/java/com/mini/capi/model/info/RuntimeInfo.java
delete mode 100644 src/main/java/com/mini/capi/sys/ApiController.java
diff --git a/pom.xml b/pom.xml
index 3a3a24f..ef3cbba 100644
--- a/pom.xml
+++ b/pom.xml
@@ -79,12 +79,6 @@
3.0.4
-
- org.springframework.security
- spring-security-core
- 6.5.4
-
-
com.alibaba
fastjson
@@ -134,10 +128,6 @@
org.springframework.boot
spring-boot-starter-jdbc
-
- org.springframework.boot
- spring-boot-starter-web
-
org.postgresql
@@ -150,12 +140,30 @@
runtime
+
+ org.springframework.security
+ spring-security-core
+ 6.5.4
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+ 3.5.5
+
+
org.springframework.boot
spring-boot-starter-websocket
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
com.fasterxml.jackson.core
jackson-databind
diff --git a/src/main/java/com/mini/capi/api/biz/bizController.java b/src/main/java/com/mini/capi/api/biz/bizController.java
new file mode 100644
index 0000000..4945ded
--- /dev/null
+++ b/src/main/java/com/mini/capi/api/biz/bizController.java
@@ -0,0 +1,11 @@
+package com.mini.capi.api.biz;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/bizApi")
+public class bizController {
+
+
+}
diff --git a/src/main/java/com/mini/capi/sys/startApp.java b/src/main/java/com/mini/capi/api/startApp.java
similarity index 50%
rename from src/main/java/com/mini/capi/sys/startApp.java
rename to src/main/java/com/mini/capi/api/startApp.java
index 219b77a..f390571 100644
--- a/src/main/java/com/mini/capi/sys/startApp.java
+++ b/src/main/java/com/mini/capi/api/startApp.java
@@ -1,4 +1,4 @@
-package com.mini.capi.sys;
+package com.mini.capi.api;
public class startApp {
}
diff --git a/src/main/java/com/mini/capi/api/sys/sysController.java b/src/main/java/com/mini/capi/api/sys/sysController.java
new file mode 100644
index 0000000..aa39b89
--- /dev/null
+++ b/src/main/java/com/mini/capi/api/sys/sysController.java
@@ -0,0 +1,64 @@
+package com.mini.capi.api.sys;
+
+import com.mini.capi.config.component.*;
+import com.mini.capi.model.ApiResult;
+import com.mini.capi.model.info.*;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/sysApi")
+public class sysController {
+
+
+ @Resource
+ private AppRuntimeInfo appRuntimeInfo;
+ @Resource
+ private AppPathInfo appPathInfo;
+ @Resource
+ private AppProcessInfo appProcessInfo;
+ @Resource
+ private AppNetworkInfo appNetworkInfo;
+
+ /**
+ * 运行信息
+ */
+ @GetMapping("getRunInfo")
+ public ApiResult> getRunInfo() {
+ try {
+ // 用构建者模式链式创建对象,避免重复的参数传递和构造函数调用
+ RunInfo runInfo = RunInfo.builder()
+ .runtimeInfo(RuntimeInfo.builder()
+ .appName(appRuntimeInfo.getAppName())
+ .serverPort(appRuntimeInfo.getServerPort())
+ .activeProfiles(appRuntimeInfo.getActiveProfiles())
+ .springBootVersion(appRuntimeInfo.getSpringBootVersion())
+ .jdkVersion(appRuntimeInfo.getJdkVersion())
+ .build())
+ .pathInfo(PathInfo.builder()
+ .workDir(appPathInfo.getWorkDir())
+ .jarDir(appPathInfo.getJarDir())
+ .resourceDir(appPathInfo.getResourceDir())
+ .build())
+ .processInfo(ProcessInfo.builder()
+ .pid(appProcessInfo.getPid())
+ .uptime(appProcessInfo.getUptime())
+ .usedHeapMemory(appProcessInfo.getUsedHeapMemory())
+ .maxHeapMemory(appProcessInfo.getMaxHeapMemory())
+ .jvmArgs(appProcessInfo.getJvmArgs())
+ .build())
+ .networkInfo(NetworkInfo.builder()
+ .hostName(appNetworkInfo.getHostName())
+ .localIp(appNetworkInfo.getLocalIp())
+ .allIps(appNetworkInfo.getAllIps())
+ .build())
+ .build();
+
+ return ApiResult.success(runInfo);
+ } catch (Exception e) {
+ return ApiResult.error(101, e.getMessage());
+ }
+ }
+}
diff --git a/src/main/java/com/mini/capi/config/component/AppNetworkInfo.java b/src/main/java/com/mini/capi/config/component/AppNetworkInfo.java
new file mode 100644
index 0000000..e8d6f16
--- /dev/null
+++ b/src/main/java/com/mini/capi/config/component/AppNetworkInfo.java
@@ -0,0 +1,48 @@
+package com.mini.capi.config.component;
+
+import org.springframework.stereotype.Component;
+
+import java.net.InetAddress;
+import java.net.Inet4Address;
+import java.net.NetworkInterface;
+import java.net.UnknownHostException;
+import java.net.SocketException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+@Component
+public class AppNetworkInfo {
+
+ // 获取主机名
+ public String getHostName() throws UnknownHostException {
+ return InetAddress.getLocalHost().getHostName();
+ }
+
+ // 获取本地 IP 地址(可能是内网 IP)
+ public String getLocalIp() throws UnknownHostException {
+ return InetAddress.getLocalHost().getHostAddress();
+ }
+
+ // 获取所有有效 IPv4 地址(过滤回环地址、IPv6,支持多网卡)
+ public List getAllIps() throws SocketException {
+ List ips = new ArrayList<>();
+ Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
+ while (interfaces.hasMoreElements()) {
+ NetworkInterface ni = interfaces.nextElement();
+ // 跳过虚拟网卡、禁用的网卡
+ if (ni.isLoopback() || !ni.isUp()) {
+ continue;
+ }
+ Enumeration addresses = ni.getInetAddresses();
+ while (addresses.hasMoreElements()) {
+ InetAddress addr = addresses.nextElement();
+ // 只保留 IPv4 地址
+ if (addr instanceof Inet4Address) {
+ ips.add(addr.getHostAddress());
+ }
+ }
+ }
+ return ips;
+ }
+}
diff --git a/src/main/java/com/mini/capi/config/component/AppPathInfo.java b/src/main/java/com/mini/capi/config/component/AppPathInfo.java
new file mode 100644
index 0000000..0f1834a
--- /dev/null
+++ b/src/main/java/com/mini/capi/config/component/AppPathInfo.java
@@ -0,0 +1,31 @@
+package com.mini.capi.config.component;
+
+import org.springframework.stereotype.Component;
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+@Component
+public class AppPathInfo {
+
+ // 获取当前工作目录(执行启动命令的目录)
+ public String getWorkDir() {
+ return System.getProperty("user.dir");
+ }
+
+ // 获取 Jar 包所在目录(仅 Jar 运行时有效;IDE 中返回 classes 目录父级)
+ public String getJarDir() throws URISyntaxException {
+ URL jarUrl = getClass().getProtectionDomain().getCodeSource().getLocation();
+ File jarFile = new File(jarUrl.toURI());
+ return jarFile.getParentFile().getAbsolutePath();
+ }
+
+ // 获取类路径下的资源目录(IDE 中是 target/classes,Jar 中是 jar 内部路径)
+ public String getResourceDir() {
+ URL resourceUrl = getClass().getClassLoader().getResource("");
+ if (resourceUrl != null) {
+ return new File(resourceUrl.getPath()).getAbsolutePath();
+ }
+ return "unknown-resource-dir";
+ }
+}
diff --git a/src/main/java/com/mini/capi/config/component/AppProcessInfo.java b/src/main/java/com/mini/capi/config/component/AppProcessInfo.java
new file mode 100644
index 0000000..7ada8e4
--- /dev/null
+++ b/src/main/java/com/mini/capi/config/component/AppProcessInfo.java
@@ -0,0 +1,42 @@
+package com.mini.capi.config.component;
+
+import org.springframework.stereotype.Component;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+import java.util.List;
+
+@Component
+public class AppProcessInfo {
+
+ // 获取进程 PID(兼容 JDK 8+)
+ public long getPid() {
+ RuntimeMXBean mxBean = ManagementFactory.getRuntimeMXBean();
+ String name = mxBean.getName(); // 格式:PID@主机名
+ return Long.parseLong(name.split("@")[0]);
+ }
+
+ // 获取 JVM 启动参数(如 -Xms、-Xmx、-D 系统属性)
+ public List getJvmArgs() {
+ RuntimeMXBean mxBean = ManagementFactory.getRuntimeMXBean();
+ return mxBean.getInputArguments();
+ }
+
+ // 获取已使用堆内存(单位:MB)
+ public long getUsedHeapMemory() {
+ long total = Runtime.getRuntime().totalMemory() / 1024 / 1024;
+ long free = Runtime.getRuntime().freeMemory() / 1024 / 1024;
+ return total - free;
+ }
+
+ // 获取最大堆内存(单位:MB)
+ public long getMaxHeapMemory() {
+ return Runtime.getRuntime().maxMemory() / 1024 / 1024;
+ }
+
+ // 获取程序运行时间(单位:秒)
+ public long getUptime() {
+ RuntimeMXBean mxBean = ManagementFactory.getRuntimeMXBean();
+ return mxBean.getUptime() / 1000;
+ }
+}
diff --git a/src/main/java/com/mini/capi/config/component/AppRuntimeInfo.java b/src/main/java/com/mini/capi/config/component/AppRuntimeInfo.java
new file mode 100644
index 0000000..aa27789
--- /dev/null
+++ b/src/main/java/com/mini/capi/config/component/AppRuntimeInfo.java
@@ -0,0 +1,54 @@
+package com.mini.capi.config.component;
+
+import lombok.Getter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.SpringBootVersion;
+import org.springframework.context.EnvironmentAware;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AppRuntimeInfo implements EnvironmentAware{
+
+ // 应用名(默认 unknown-app)
+ @Getter
+ @Value("${spring.application.name:unknown-app}")
+ private String appName;
+ // 服务端口(默认 8080,支持随机端口)
+ @Getter
+ @Value("${server.port:8080}")
+ private Integer serverPort;
+ // 激活的环境(默认 default)
+ @Getter
+ @Value("${spring.profiles.active:default}")
+ private String activeProfile;
+
+ // JDK 版本
+ @Getter
+ @Value("${java.version:unknown}")
+ private String jdkVersion;
+
+ // Spring 环境上下文(用于灵活获取配置)
+ private Environment environment;
+
+ // 获取 Spring Boot 版本
+ public String getSpringBootVersion() {
+ return SpringBootVersion.getVersion();
+ }
+
+ // 获取所有激活的环境(支持多环境,如 dev,test)
+ public String[] getActiveProfiles() {
+ return environment.getActiveProfiles();
+ }
+
+ // 灵活获取配置项(支持默认值)
+ public String getConfigValue(String key, String defaultValue) {
+ return environment.getProperty(key, defaultValue);
+ }
+
+ // 实现 EnvironmentAware 接口,注入 Environment
+ @Override
+ public void setEnvironment(Environment environment) {
+ this.environment = environment;
+ }
+}
diff --git a/src/main/java/com/mini/capi/model/info/NetworkInfo.java b/src/main/java/com/mini/capi/model/info/NetworkInfo.java
new file mode 100644
index 0000000..e7e7a2a
--- /dev/null
+++ b/src/main/java/com/mini/capi/model/info/NetworkInfo.java
@@ -0,0 +1,24 @@
+package com.mini.capi.model.info;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@Builder // 生成构建者模式代码
+public class NetworkInfo implements Serializable {
+
+ private String hostName;
+
+ private String localIp;
+
+ private List allIps;
+
+ public NetworkInfo(String hostName, String localIp, List allIps) {
+ this.hostName = hostName;
+ this.localIp = localIp;
+ this.allIps = allIps;
+ }
+}
diff --git a/src/main/java/com/mini/capi/model/info/PathInfo.java b/src/main/java/com/mini/capi/model/info/PathInfo.java
new file mode 100644
index 0000000..2e36989
--- /dev/null
+++ b/src/main/java/com/mini/capi/model/info/PathInfo.java
@@ -0,0 +1,23 @@
+package com.mini.capi.model.info;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@Builder // 生成构建者模式代码
+public class PathInfo implements Serializable {
+
+ private String workDir;
+
+ private String jarDir;
+
+ private String resourceDir;
+
+ public PathInfo(String workDir, String jarDir, String resourceDir) {
+ this.workDir = workDir;
+ this.jarDir = jarDir;
+ this.resourceDir = resourceDir;
+ }
+}
diff --git a/src/main/java/com/mini/capi/model/info/ProcessInfo.java b/src/main/java/com/mini/capi/model/info/ProcessInfo.java
new file mode 100644
index 0000000..f655e58
--- /dev/null
+++ b/src/main/java/com/mini/capi/model/info/ProcessInfo.java
@@ -0,0 +1,30 @@
+package com.mini.capi.model.info;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@Builder // 生成构建者模式代码
+public class ProcessInfo implements Serializable {
+ private long pid;
+
+ private Long uptime;
+
+ private Long usedHeapMemory;
+
+ private Long maxHeapMemory;
+
+ private List jvmArgs;
+
+ public ProcessInfo(long pid, Long uptime, Long usedHeapMemory, Long maxHeapMemory, List jvmArgs) {
+ this.pid = pid;
+ this.uptime = uptime;
+ this.usedHeapMemory = usedHeapMemory;
+ this.maxHeapMemory = maxHeapMemory;
+ this.jvmArgs = jvmArgs;
+ }
+
+}
diff --git a/src/main/java/com/mini/capi/model/info/RunInfo.java b/src/main/java/com/mini/capi/model/info/RunInfo.java
new file mode 100644
index 0000000..1a6285f
--- /dev/null
+++ b/src/main/java/com/mini/capi/model/info/RunInfo.java
@@ -0,0 +1,23 @@
+package com.mini.capi.model.info;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@Builder // 生成构建者模式代码
+public class RunInfo implements Serializable {
+
+ private RuntimeInfo runtimeInfo;
+ private PathInfo pathInfo;
+ private ProcessInfo processInfo;
+ private NetworkInfo networkInfo;
+
+ public RunInfo(RuntimeInfo runtimeInfo, PathInfo pathInfo, ProcessInfo processInfo, NetworkInfo networkInfo) {
+ this.runtimeInfo = runtimeInfo;
+ this.pathInfo = pathInfo;
+ this.processInfo = processInfo;
+ this.networkInfo = networkInfo;
+ }
+}
diff --git a/src/main/java/com/mini/capi/model/info/RuntimeInfo.java b/src/main/java/com/mini/capi/model/info/RuntimeInfo.java
new file mode 100644
index 0000000..e5e430e
--- /dev/null
+++ b/src/main/java/com/mini/capi/model/info/RuntimeInfo.java
@@ -0,0 +1,30 @@
+package com.mini.capi.model.info;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@Builder // 生成构建者模式代码
+public class RuntimeInfo implements Serializable {
+
+ private String appName;
+
+ private Integer serverPort;
+
+ private String[] activeProfiles; // 支持多环境
+
+ private String springBootVersion;
+
+ private String jdkVersion;
+
+
+ public RuntimeInfo(String appName, Integer serverPort, String[] activeProfiles, String springBootVersion, String jdkVersion) {
+ this.appName = appName;
+ this.serverPort = serverPort;
+ this.activeProfiles = activeProfiles;
+ this.springBootVersion = springBootVersion;
+ this.jdkVersion = jdkVersion;
+ }
+}
diff --git a/src/main/java/com/mini/capi/sys/ApiController.java b/src/main/java/com/mini/capi/sys/ApiController.java
deleted file mode 100644
index ed90b28..0000000
--- a/src/main/java/com/mini/capi/sys/ApiController.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.mini.capi.sys;
-
-public class ApiController {
-
-
-}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index b059502..7c0f3d0 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -29,5 +29,33 @@ springdoc.swagger-ui.disable-swagger-default-url=true
# ========================================
springdoc.api-docs.path=/v3/api-docs
springdoc.api-docs.groups.enabled=true
-springdoc.packages-to-scan=com.mini.capi.sys
-springdoc.paths-to-match=/**
\ No newline at end of file
+springdoc.packages-to-scan=com.mini.capi.api
+springdoc.paths-to-match=/**
+
+# ===================== Actuator ???? =====================
+management.endpoints.web.exposure.include=health,info,metrics,process
+management.endpoints.web.exposure.exclude=shutdown
+
+# ??????
+management.endpoint.health.show-details=always
+management.endpoint.health.show-components=always
+management.endpoint.health.status.aggregation-strategy=strict
+
+# ?????????????
+management.endpoints.web.base-path=/monitor
+
+# CORS ?????????????
+management.endpoints.web.cors.allowed-origins=*
+management.endpoints.web.cors.allowed-methods=GET,POST,OPTIONS
+management.endpoints.web.cors.allowed-headers=*
+management.endpoints.web.cors.max-age=3600
+
+# ????????????
+logging.level.root=INFO
+logging.level.com.yourpackage=DEBUG
+
+# ===================== ???????????? =====================
+# ???????
+management.endpoint.env.show-values=when_authorized
+# ??????
+management.endpoint.health.cache.time-to-live=3000ms
\ No newline at end of file