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