diff --git a/src/main/java/neatlogic/framework/common/config/Config.java b/src/main/java/neatlogic/framework/common/config/Config.java index df2313d1d03ada2fabb80c8a050cf5de4028eab9..9d8e5e2ec5ec0c1dac5579d5fabe157c11894c39 100644 --- a/src/main/java/neatlogic/framework/common/config/Config.java +++ b/src/main/java/neatlogic/framework/common/config/Config.java @@ -46,6 +46,8 @@ public class Config { private static final String SERVER_ID_FILE = "serverid.conf"; public static int SCHEDULE_SERVER_ID; + + private static int SCHEDULE_SERVER_ID_CHECK_ENABLE;// 启用服务器ID检查,防止两台服务器ID相同 // public static String SERVER_HOST; public static final String RESPONSE_TYPE_JSON = "application/json;charset=UTF-8"; @@ -211,6 +213,10 @@ public class Config { } + public static int SCHEDULE_SERVER_ID_CHECK_ENABLE() { + return SCHEDULE_SERVER_ID_CHECK_ENABLE; + } + public static String NEATLOGIC_HOME() { return NEATLOGIC_HOME; } @@ -596,6 +602,7 @@ public class Config { public static void loadNacosProperties(Properties prop) { try { + SCHEDULE_SERVER_ID_CHECK_ENABLE = Integer.parseInt(prop.getProperty("schedule.serverid.check.enable", "1")); DATA_HOME = prop.getProperty("data.home", "/app/data"); AUDIT_HOME = prop.getProperty("audit.home"); SERVER_HEARTBEAT_RATE = Integer.parseInt(prop.getProperty("heartbeat.rate", "60")); diff --git a/src/main/java/neatlogic/framework/heartbeat/core/HeartbeatManager.java b/src/main/java/neatlogic/framework/heartbeat/core/HeartbeatManager.java index 998920cec1c403a229811a0b7972437db42b7126..69ed5acc29790626e5d210178f39b5bc62486e11 100644 --- a/src/main/java/neatlogic/framework/heartbeat/core/HeartbeatManager.java +++ b/src/main/java/neatlogic/framework/heartbeat/core/HeartbeatManager.java @@ -30,6 +30,8 @@ import neatlogic.framework.heartbeat.dao.mapper.TenantServerMapper; import neatlogic.framework.heartbeat.dto.ServerClusterVo; import neatlogic.framework.heartbeat.dto.ServerCounterVo; import neatlogic.framework.transaction.util.TransactionUtil; +import neatlogic.framework.util.$; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.TransactionStatus; @@ -63,6 +65,25 @@ public class HeartbeatManager extends ModuleInitializedListenerBase { private static final Set set = new HashSet<>(); public final void myInit() { + String ip = StringUtils.EMPTY; + if (Objects.equals(Config.SCHEDULE_SERVER_ID_CHECK_ENABLE(), 1)) { + String userFunctionValue = serverMapper.getUserFunctionValue(); // 获取到 root@192.168.8.240 + if (StringUtils.isNotBlank(userFunctionValue)) { + int index = userFunctionValue.indexOf("@"); + if (index != -1) { + ip = userFunctionValue.substring(index + 1); + } else { + ip = userFunctionValue; + } + } + ServerClusterVo serverVo = serverMapper.getServerByServerId(Config.SCHEDULE_SERVER_ID); + if (serverVo != null && StringUtils.isNotBlank(serverVo.getIp())) { + if (!Objects.equals(serverVo.getIp(), ip)) { + System.err.println($.t("nfhc.heartbeatmanager.myinit.startupfailureprompt", Config.SCHEDULE_SERVER_ID, serverVo.getIp())); + System.exit(1); + } + } + } // 服务器重启时,先重置与自己相关的数据 getServerLock(Config.SCHEDULE_SERVER_ID); // 重新插入一条服务器信息 @@ -73,6 +94,7 @@ public class HeartbeatManager extends ModuleInitializedListenerBase { server.setLcu(SystemUser.SYSTEM.getUserUuid()); server.setHeartbeatRate(Config.SERVER_HEARTBEAT_RATE()); server.setHeartbeatThreshold(Config.SERVER_HEARTBEAT_THRESHOLD()); + server.setIp(ip); serverMapper.insertServer(server); // serverMapper.insertServerRunTime(Config.SCHEDULE_SERVER_ID, START_TIME); ScheduledExecutorService heartbeatService = Executors.newScheduledThreadPool(1, r -> { diff --git a/src/main/java/neatlogic/framework/heartbeat/dao/mapper/ServerMapper.java b/src/main/java/neatlogic/framework/heartbeat/dao/mapper/ServerMapper.java index df8fecc3f3b28cb30ca85f2bbb0522b18e10129b..180550f95f88e7c83bb8c0a95073ed1f0abff775 100644 --- a/src/main/java/neatlogic/framework/heartbeat/dao/mapper/ServerMapper.java +++ b/src/main/java/neatlogic/framework/heartbeat/dao/mapper/ServerMapper.java @@ -17,6 +17,8 @@ public interface ServerMapper { List getAllServerList(); + String getUserFunctionValue(); + //UPDATE int updateServerByServerId(ServerClusterVo server); diff --git a/src/main/java/neatlogic/framework/heartbeat/dao/mapper/ServerMapper.xml b/src/main/java/neatlogic/framework/heartbeat/dao/mapper/ServerMapper.xml index 800d27384a59d09707151dfb85011cf5916c73cc..4aae707ef1651265843418423a0dc68fd9ab7366 100644 --- a/src/main/java/neatlogic/framework/heartbeat/dao/mapper/ServerMapper.xml +++ b/src/main/java/neatlogic/framework/heartbeat/dao/mapper/ServerMapper.xml @@ -13,7 +13,8 @@ resultType="neatlogic.framework.heartbeat.dto.ServerClusterVo"> SELECT `host`, `server_id` AS serverId, - `status` + `status`, + `ip` FROM server_status WHERE `server_id` = #{serverId} FOR @@ -27,6 +28,7 @@ `heartbeat_rate` AS heartbeatRate, `heartbeat_threshold` AS heartbeatThreshold, `heartbeat_time` AS heartbeatTime, + `ip` AS ip, `fcu`, `fcd`, `lcu`, @@ -34,6 +36,10 @@ FROM `server_status` + + UPDATE `server_status` SET `status` = #{status} @@ -61,12 +67,13 @@ INSERT INTO server_status(`server_id`, `status`, `heartbeat_rate`, `heartbeat_threshold`, `heartbeat_time`, - `fcu`, `fcd`) - VALUES (#{serverId}, #{status}, #{heartbeatRate}, #{heartbeatThreshold}, NOW(3), #{fcu}, NOW(3)) + `ip`, `fcu`, `fcd`) + VALUES (#{serverId}, #{status}, #{heartbeatRate}, #{heartbeatThreshold}, NOW(3), #{ip}, #{fcu}, NOW(3)) ON DUPLICATE KEY UPDATE `status` = #{status}, `heartbeat_rate` = #{heartbeatRate}, `heartbeat_threshold` = #{heartbeatThreshold}, `heartbeat_time` = NOW(3), + `ip` = #{ip}, `lcu` = #{lcu}, `lcd` = NOW(3) diff --git a/src/main/java/neatlogic/framework/heartbeat/dto/ServerClusterVo.java b/src/main/java/neatlogic/framework/heartbeat/dto/ServerClusterVo.java index 1f9443c61bfd8b7ea7776e1abede7277e6af8c2d..0ec1d453f97d09645a2a18c5f1d02de764cf29af 100644 --- a/src/main/java/neatlogic/framework/heartbeat/dto/ServerClusterVo.java +++ b/src/main/java/neatlogic/framework/heartbeat/dto/ServerClusterVo.java @@ -15,6 +15,7 @@ public class ServerClusterVo extends BaseEditorVo { private Integer heartbeatRate; private Integer heartbeatThreshold; private Date heartbeatTime; + private String ip; public String getHost() { return host; @@ -58,4 +59,12 @@ public class ServerClusterVo extends BaseEditorVo { public void setHeartbeatTime(Date heartbeatTime) { this.heartbeatTime = heartbeatTime; } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } } diff --git a/src/main/resources/neatlogic/resources/framework/changelog/2025-07-28/neatlogic.sql b/src/main/resources/neatlogic/resources/framework/changelog/2025-07-28/neatlogic.sql new file mode 100644 index 0000000000000000000000000000000000000000..ac7639861f4c1e00215613a397b26ccef6c0f336 --- /dev/null +++ b/src/main/resources/neatlogic/resources/framework/changelog/2025-07-28/neatlogic.sql @@ -0,0 +1,2 @@ +ALTER TABLE `server_status` + ADD COLUMN `ip` VARCHAR (50) NULL COMMENT '应用服务器IP' AFTER `heartbeat_time`; \ No newline at end of file diff --git a/src/main/resources/neatlogic/resources/framework/changelog/2025-07-28/version.json b/src/main/resources/neatlogic/resources/framework/changelog/2025-07-28/version.json new file mode 100644 index 0000000000000000000000000000000000000000..31789c9d8279899c0ecf07a692f8ad8339881ab1 --- /dev/null +++ b/src/main/resources/neatlogic/resources/framework/changelog/2025-07-28/version.json @@ -0,0 +1,12 @@ +{ + "content": [ + { + "type": "功能", + "detail": [ + { + "msg": "1.服务器启动时检查serverId是否唯一" + } + ] + } + ] +}