From 04fb8d33884832d77ed0898909ed81d747827b1a Mon Sep 17 00:00:00 2001 From: Mzaxd Date: Wed, 22 Mar 2023 22:07:02 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=86=99=E5=AE=9E=E4=BE=8B=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=A3=80=E6=B5=8B=E5=8A=9F=E8=83=BD-=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E4=B8=8D=E5=B8=A6=E5=8D=8F=E8=AE=AE=E7=9A=84URL?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E5=92=8C=E4=B8=8D=E5=B8=A6=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E4=B8=8D=E5=B8=A6=E7=AB=AF=E5=8F=A3=E5=8F=B7=E7=9A=84URL?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../noodles/job/CheckInstancesStatus.java | 23 +++++++- .../java/com/mzaxd/noodles/util/UrlUtil.java | 28 ++++++++- .../noodles/NoodlesApplicationTests.java | 58 ++++++++++++++++++- 3 files changed, 104 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/mzaxd/noodles/job/CheckInstancesStatus.java b/src/main/java/com/mzaxd/noodles/job/CheckInstancesStatus.java index cb67e9a..5c17293 100644 --- a/src/main/java/com/mzaxd/noodles/job/CheckInstancesStatus.java +++ b/src/main/java/com/mzaxd/noodles/job/CheckInstancesStatus.java @@ -1,6 +1,5 @@ package com.mzaxd.noodles.job; -import cn.hutool.http.HttpException; import cn.hutool.http.HttpRequest; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.mzaxd.noodles.constant.RedisConstant; @@ -12,6 +11,7 @@ import com.mzaxd.noodles.domain.entity.HostMachine; import com.mzaxd.noodles.service.*; import com.mzaxd.noodles.util.CpuUtil; import com.mzaxd.noodles.util.RedisCache; +import com.mzaxd.noodles.util.UrlUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -76,10 +76,18 @@ public class CheckInstancesStatus { for (Container container : containers) { futures.add(executor.submit(() -> { try { - if (!StringUtils.hasText(container.getWebUi())) { + if (!StringUtils.hasText(container.getWebUi()) && !StringUtils.hasText(container.getServerAddress())) { container.setContainerState(SystemConstant.CONTAINER_STATE_UNKNOWN); return container; } + //通过Socket(IP+端口)判断是否在线 + if (StringUtils.hasText(container.getServerAddress())) { + if (UrlUtil.isServiceOnline(UrlUtil.getHostname(container.getServerAddress()), UrlUtil.getPort(container.getServerAddress()))) { + container.setContainerState(SystemConstant.CONTAINER_STATE_RUNNING); + return container; + } + } + //通过HTTP请求判断是否在线 HttpRequest.get(container.getWebUi()).setConnectionTimeout(5000).execute(true); log.info("[实例状态检测]:与{}建立连接成功", container.getName()); container.setContainerState(SystemConstant.CONTAINER_STATE_RUNNING); @@ -131,10 +139,19 @@ public class CheckInstancesStatus { List vms = hostMachineService.list(vmWrapper); vms.forEach(vm -> { try { - if (!StringUtils.hasText(vm.getManageIp())) { + if (!StringUtils.hasText(vm.getServerAddress()) && !StringUtils.hasText(vm.getServerAddress())) { vm.setHostMachineState(SystemConstant.HOST_MACHINE_STATE_UNKNOWN); return; } + //通过Ping的方式判断是否在线 + if (StringUtils.hasText(vm.getServerAddress())) { + if (UrlUtil.isHostOnline(vm.getServerAddress())){ + log.info("[实例状态检测]:与{}建立连接成功", vm.getName()); + vm.setHostMachineState(SystemConstant.HOST_MACHINE_STATE_ONLINE); + return; + } + } + //通过HTTP请求的方式判断是否在线 HttpRequest.get(vm.getManageIp()).setConnectionTimeout(5000).execute(true); log.info("[实例状态检测]:与{}建立连接成功", vm.getName()); vm.setHostMachineState(SystemConstant.HOST_MACHINE_STATE_ONLINE); diff --git a/src/main/java/com/mzaxd/noodles/util/UrlUtil.java b/src/main/java/com/mzaxd/noodles/util/UrlUtil.java index 61bef22..246fbff 100644 --- a/src/main/java/com/mzaxd/noodles/util/UrlUtil.java +++ b/src/main/java/com/mzaxd/noodles/util/UrlUtil.java @@ -1,14 +1,19 @@ package com.mzaxd.noodles.util; import com.mzaxd.noodles.constant.UrlConstant; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; -import java.util.ArrayList; +import java.io.IOException; +import java.net.*; import java.util.HashMap; import java.util.Map; /** * @author root */ +@Slf4j +@Component public class UrlUtil { public static String getUrl(String protocol, String ip, String port, String path) { @@ -33,5 +38,26 @@ public class UrlUtil { return result; } + public static String getHostname(String address) { + String[] parts = address.split(":"); + return parts[0]; + } + public static boolean isHostOnline(String ipAddress) throws IOException { + InetAddress inetAddress = InetAddress.getByName(ipAddress); + // 超时时间为5秒 + return inetAddress.isReachable(5000); + } + + public static boolean isServiceOnline(String serverName, int port) throws IOException { + Socket socket = new Socket(serverName, port); + log.info("[实例状态检测]:" + serverName + "服务已经开启"); + socket.close(); + return true; + } + + public static int getPort(String address) { + String[] parts = address.split(":"); + return Integer.parseInt(parts[1]); + } } diff --git a/src/test/java/com/mzaxd/noodles/NoodlesApplicationTests.java b/src/test/java/com/mzaxd/noodles/NoodlesApplicationTests.java index fab0693..eb3ee92 100644 --- a/src/test/java/com/mzaxd/noodles/NoodlesApplicationTests.java +++ b/src/test/java/com/mzaxd/noodles/NoodlesApplicationTests.java @@ -17,17 +17,25 @@ import com.mzaxd.noodles.service.*; import com.mzaxd.noodles.util.CpuUtil; import com.mzaxd.noodles.util.RedisCache; import com.mzaxd.noodles.util.SystemInfoUtils; +import com.mzaxd.noodles.util.UrlUtil; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import java.io.IOException; +import java.net.InetAddress; + import javax.annotation.Resource; +import java.net.Socket; +import java.net.URI; +import java.net.URISyntaxException; import java.util.*; import java.util.concurrent.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Slf4j @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @@ -452,4 +460,52 @@ class NoodlesApplicationTests { double seconds = (double) elapsedTime / 1_000_000_000.0; // 将纳秒转换为秒 System.out.println("代码执行时间:" + seconds + " 秒"); } + + @Test + public void pingTest() { + String ipAddress = "192.168.1.90"; // 要检查的IP地址 + try { + InetAddress inetAddress = InetAddress.getByName(ipAddress); + boolean isReachable = inetAddress.isReachable(5000); // 超时时间为5秒 + if (isReachable) { + System.out.println("虚拟机在线"); + } else { + System.out.println("虚拟机不在线"); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void serviceTest() { + try { + String serverName = "wiz.elizaveta.top"; + int port = 700; + Socket socket = new Socket(serverName, port); + System.out.println("MySQL服务已经开启"); + socket.close(); + } catch (Exception e) { + System.out.println("MySQL服务没有开启或者远程服务器无法访问"); + } + } + + @Test + public void hostnameTest() { + String hostname = UrlUtil.getHostname("192.168.1.90:8080"); + System.out.println(hostname); + } + + @Test + public void portTest() { + String address = "192.168.1.103:3306"; + String regex = ":(\\d+)$"; // 匹配冒号后面的数字 + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(address); + if (matcher.find()) { + System.out.println(matcher.group(1)); + } else { + System.out.println("解析失败"); + } + } }