From 026f4c64bbc5bb49f0ffded70921e690ef0e062a Mon Sep 17 00:00:00 2001 From: flystar32 Date: Mon, 1 Jul 2019 16:44:33 +0800 Subject: [PATCH] add modify nacos instance status --- .../nacos/NacosDiscoveryProperties.java | 43 ++++++++++--- .../nacos/registry/NacosServiceRegistry.java | 62 ++++++++++++++++--- 2 files changed, 87 insertions(+), 18 deletions(-) diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java index 0dadefc44..c9f20a7ce 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/NacosDiscoveryProperties.java @@ -17,8 +17,11 @@ package org.springframework.cloud.alibaba.nacos; import com.alibaba.nacos.api.NacosFactory; +import com.alibaba.nacos.api.naming.NamingMaintainFactory; +import com.alibaba.nacos.api.naming.NamingMaintainService; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.PreservedMetadataKeys; +import com.alibaba.nacos.client.naming.NacosNamingMaintainService; import com.alibaba.nacos.client.naming.utils.UtilAndComs; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -147,6 +150,8 @@ public class NacosDiscoveryProperties { private NamingService namingService; + private NamingMaintainService namingMaintainService; + @PostConstruct public void init() throws SocketException { @@ -389,6 +394,34 @@ public class NacosDiscoveryProperties { return namingService; } + try { + namingService = NacosFactory.createNamingService(getNacosProperties()); + } + catch (Exception e) { + log.error("create naming service error!properties={},e=,", this, e); + return null; + } + return namingService; + } + + public NamingMaintainService namingMaintainServiceInstance() { + + if (null != namingMaintainService) { + return namingMaintainService; + } + + try { + namingMaintainService = NamingMaintainFactory + .createMaintainService(getNacosProperties()); + } + catch (Exception e) { + log.error("create naming service error!properties={},e=,", this, e); + return null; + } + return namingMaintainService; + } + + private Properties getNacosProperties() { Properties properties = new Properties(); properties.put(SERVER_ADDR, serverAddr); properties.put(NAMESPACE, namespace); @@ -407,15 +440,7 @@ public class NacosDiscoveryProperties { properties.put(SECRET_KEY, secretKey); properties.put(CLUSTER_NAME, clusterName); properties.put(NAMING_LOAD_CACHE_AT_START, namingLoadCacheAtStart); - - try { - namingService = NacosFactory.createNamingService(properties); - } - catch (Exception e) { - log.error("create naming service error!properties={},e=,", this, e); - return null; - } - return namingService; + return properties; } } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java index 6c362af6f..e23aa9da9 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/registry/NacosServiceRegistry.java @@ -16,6 +16,8 @@ package org.springframework.cloud.alibaba.nacos.registry; +import java.util.List; + import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; import org.slf4j.Logger; @@ -52,12 +54,7 @@ public class NacosServiceRegistry implements ServiceRegistry { String serviceId = registration.getServiceId(); - Instance instance = new Instance(); - instance.setIp(registration.getHost()); - instance.setPort(registration.getPort()); - instance.setWeight(nacosDiscoveryProperties.getWeight()); - instance.setClusterName(nacosDiscoveryProperties.getClusterName()); - instance.setMetadata(registration.getMetadata()); + Instance instance = getNacosInstanceFromRegistration(registration); try { namingService.registerInstance(serviceId, instance); @@ -102,13 +99,60 @@ public class NacosServiceRegistry implements ServiceRegistry { @Override public void setStatus(Registration registration, String status) { - // nacos doesn't support set status of a particular registration. + + if (!status.equalsIgnoreCase("UP") && !status.equalsIgnoreCase("DOWN")) { + log.warn("can't support status {},please choose UP or DOWN", status); + return; + } + + String serviceId = registration.getServiceId(); + + Instance instance = getNacosInstanceFromRegistration(registration); + + if (status.equalsIgnoreCase("DOWN")) { + instance.setEnabled(false); + } + else { + instance.setEnabled(true); + } + + try { + nacosDiscoveryProperties.namingMaintainServiceInstance() + .updateInstance(serviceId, instance); + } + catch (Exception e) { + throw new RuntimeException("update nacos instance status fail", e); + } + } @Override - public T getStatus(Registration registration) { - // nacos doesn't support query status of a particular registration. + public Object getStatus(Registration registration) { + + String serviceName = registration.getServiceId(); + try { + List instances = nacosDiscoveryProperties.namingServiceInstance() + .getAllInstances(serviceName); + for (Instance instance : instances) { + if (instance.getIp().equalsIgnoreCase(nacosDiscoveryProperties.getIp()) + && instance.getPort() == nacosDiscoveryProperties.getPort()) + return instance.isEnabled() ? "UP" : "DOWN"; + } + } + catch (Exception e) { + log.error("get all instance of {} error,", serviceName, e); + } return null; } + private Instance getNacosInstanceFromRegistration(Registration registration) { + Instance instance = new Instance(); + instance.setIp(registration.getHost()); + instance.setPort(registration.getPort()); + instance.setWeight(nacosDiscoveryProperties.getWeight()); + instance.setClusterName(nacosDiscoveryProperties.getClusterName()); + instance.setMetadata(registration.getMetadata()); + return instance; + } + }