From 3bfa4ad41baf53f47659c31dbe1f3ed13f5b0090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Wed, 21 Feb 2024 13:12:28 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=AE=9A=E6=97=B6=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E7=A8=8B=E5=BA=8F=E5=90=AF=E5=8A=A8=E5=90=8E=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E7=9A=84=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sentinel/NacosSentinelApplication.java | 2 + .../listener/NacosDiscoveryListener.java | 194 +++++++++++------- 2 files changed, 120 insertions(+), 76 deletions(-) diff --git a/src/main/java/cn/com/xuxiaowei/nacos/sentinel/NacosSentinelApplication.java b/src/main/java/cn/com/xuxiaowei/nacos/sentinel/NacosSentinelApplication.java index a6dc84e..a7bc2a8 100644 --- a/src/main/java/cn/com/xuxiaowei/nacos/sentinel/NacosSentinelApplication.java +++ b/src/main/java/cn/com/xuxiaowei/nacos/sentinel/NacosSentinelApplication.java @@ -2,7 +2,9 @@ package cn.com.xuxiaowei.nacos.sentinel; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; +@EnableScheduling @SpringBootApplication public class NacosSentinelApplication { diff --git a/src/main/java/cn/com/xuxiaowei/nacos/sentinel/listener/NacosDiscoveryListener.java b/src/main/java/cn/com/xuxiaowei/nacos/sentinel/listener/NacosDiscoveryListener.java index 1911eeb..fdbe36f 100644 --- a/src/main/java/cn/com/xuxiaowei/nacos/sentinel/listener/NacosDiscoveryListener.java +++ b/src/main/java/cn/com/xuxiaowei/nacos/sentinel/listener/NacosDiscoveryListener.java @@ -17,12 +17,11 @@ import org.apache.commons.lang3.RandomStringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.UUID; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** * Nacos 注册中心 监听程序 @@ -34,6 +33,8 @@ import java.util.UUID; @Component public class NacosDiscoveryListener { + private final Set subscribes = ConcurrentHashMap.newKeySet(); + private NacosSentinelDiscoveryProperties nacosSentinelDiscoveryProperties; private NacosDiscoveryRepository nacosDiscoveryRepository; @@ -66,7 +67,16 @@ public class NacosDiscoveryListener { namingService = NamingFactory.createNamingService(properties); } catch (NacosException e) { - throw new RuntimeException(e); + log.error(String.format("【%s】连接 Nacos 异常:", logId), e); + } + finally { + if (namingService == null) { + log.error("【{}】NamingService 为 null", logId); + } + else { + String serverStatus = namingService.getServerStatus(); + log.info("【{}】NamingService 状态:{},Nacos 连接状态:{}", logId, serverStatus, serverStatus); + } } } } @@ -112,93 +122,125 @@ public class NacosDiscoveryListener { } for (String serviceName : serviceNames) { - namingService.subscribe(serviceName, event -> { - NamingEvent namingEvent = (NamingEvent) event; - List instances = namingEvent.getInstances(); + subscribe(serviceName); + } + } - log.info(""); - String subscribeLogId = RandomStringUtils.randomAlphanumeric(6); - log.info("【{}】Nacos 服务订阅: {}", subscribeLogId, serviceName); - log.info("【{}】Nacos 服务名称: {},服务数量: {},群组名称:{}", subscribeLogId, serviceName, instances.size(), - namingEvent.getGroupName()); + @Scheduled(fixedRate = 5000) + public void myScheduledMethod() throws NacosException { - List discoveries = nacosDiscoveryRepository.listByServiceName(serviceName); + createNamingService(); - List adds = new ArrayList<>(); + int pageNo = nacosSentinelDiscoveryProperties.getPageNo(); + int pageSize = nacosSentinelDiscoveryProperties.getPageSize(); + String groupName = nacosSentinelDiscoveryProperties.getGroupName(); + + ListView servicesOfServer = namingService.getServicesOfServer(pageNo, pageSize, groupName); + List serviceNames = servicesOfServer.getData(); + + int maxLength = 0; + for (String serviceName : serviceNames) { + maxLength = Math.max(maxLength, serviceName.length()); + } + + for (String serviceName : serviceNames) { + if (!subscribes.contains(serviceName)) { + subscribe(serviceName); + } + } + + } + + private void subscribe(String serviceName) throws NacosException { + namingService.subscribe(serviceName, event -> { + + subscribes.add(serviceName); + + NamingEvent namingEvent = (NamingEvent) event; + List instances = namingEvent.getInstances(); + + log.info(""); + String subscribeLogId = RandomStringUtils.randomAlphanumeric(6); + log.info("【{}】Nacos 服务订阅: {}", subscribeLogId, serviceName); + log.info("【{}】Nacos 服务名称: {},服务数量: {},群组名称:{}", subscribeLogId, serviceName, instances.size(), + namingEvent.getGroupName()); + + List discoveries = nacosDiscoveryRepository.listByServiceName(serviceName); + + List adds = new ArrayList<>(); + for (Instance instance : instances) { + String ip = instance.getIp(); + int port = instance.getPort(); + String clusterName = instance.getClusterName(); + log.info("【{}】Nacos 服务名称: {},IP: {},端口: {},群组名称: {},集群名称: {}", subscribeLogId, serviceName, + StringUtils.formatLength(ip, 15), StringUtils.formatLength(port, 5), namingEvent.getGroupName(), + clusterName); + + boolean contains = false; + for (Discovery discovery : discoveries) { + if (discovery.getIp().equals(instance.getIp()) && discovery.getPort() == instance.getPort()) { + contains = true; + } + } + + if (!contains) { + adds.add(instance); + } + + } + + List deletes = new ArrayList<>(); + for (Discovery discovery : discoveries) { + + boolean contains = false; for (Instance instance : instances) { + if (discovery.getIp().equals(instance.getIp()) && discovery.getPort() == instance.getPort()) { + contains = true; + } + } + + if (!contains) { + deletes.add(discovery); + } + } + + if (!adds.isEmpty()) { + log.info(""); + log.info("【{}】Nacos 上线服务: {}", subscribeLogId, serviceName); + + for (Instance instance : adds) { String ip = instance.getIp(); int port = instance.getPort(); + String clusterName = instance.getClusterName(); - log.info("【{}】Nacos 服务名称: {},IP: {},端口: {},群组名称: {},集群名称: {}", subscribeLogId, serviceName, + log.info("【{}】Nacos 上线服务名称: {},IP: {},端口: {},群组名称: {},集群名称: {}", subscribeLogId, serviceName, StringUtils.formatLength(ip, 15), StringUtils.formatLength(port, 5), - namingEvent.getGroupName(), clusterName); + StringUtils.extractAtLeft(instance.getServiceName()), clusterName); - boolean contains = false; - for (Discovery discovery : discoveries) { - if (discovery.getIp().equals(instance.getIp()) && discovery.getPort() == instance.getPort()) { - contains = true; - } - } - - if (!contains) { - adds.add(instance); - } + Discovery discovery = new Discovery().setId(UUID.randomUUID().toString()) + .setServiceName(serviceName) + .setIp(ip) + .setPort(port); + nacosDiscoveryRepository.save(discovery); } + } - List deletes = new ArrayList<>(); - for (Discovery discovery : discoveries) { + if (!deletes.isEmpty()) { + log.warn(""); + log.warn("【{}】Nacos 下线服务: {}", subscribeLogId, serviceName); - boolean contains = false; - for (Instance instance : instances) { - if (discovery.getIp().equals(instance.getIp()) && discovery.getPort() == instance.getPort()) { - contains = true; - } - } + for (Discovery discovery : deletes) { + String id = discovery.getId(); + String ip = discovery.getIp(); + int port = discovery.getPort(); + log.warn("【{}】Nacos 下线服务名称: {},IP: {},端口: {}", subscribeLogId, serviceName, ip, port); - if (!contains) { - deletes.add(discovery); - } + nacosDiscoveryRepository.deleteById(id); } + } - if (!adds.isEmpty()) { - log.info(""); - log.info("【{}】Nacos 上线服务: {}", subscribeLogId, serviceName); - - for (Instance instance : adds) { - String ip = instance.getIp(); - int port = instance.getPort(); - - String clusterName = instance.getClusterName(); - log.info("【{}】Nacos 上线服务名称: {},IP: {},端口: {},群组名称: {},集群名称: {}", subscribeLogId, serviceName, - StringUtils.formatLength(ip, 15), StringUtils.formatLength(port, 5), - StringUtils.extractAtLeft(instance.getServiceName()), clusterName); - - Discovery discovery = new Discovery().setId(UUID.randomUUID().toString()) - .setServiceName(serviceName) - .setIp(ip) - .setPort(port); - - nacosDiscoveryRepository.save(discovery); - } - } - - if (!deletes.isEmpty()) { - log.warn(""); - log.warn("【{}】Nacos 下线服务: {}", subscribeLogId, serviceName); - - for (Discovery discovery : deletes) { - String id = discovery.getId(); - String ip = discovery.getIp(); - int port = discovery.getPort(); - log.warn("【{}】Nacos 下线服务名称: {},IP: {},端口: {}", subscribeLogId, serviceName, ip, port); - - nacosDiscoveryRepository.deleteById(id); - } - } - - }); - } + }); } private void healthy(String logId, int maxLength, String serviceName, NamingService namingService, boolean healthy)