diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ConditionalOnNacosDiscoveryEnabled.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ConditionalOnNacosDiscoveryEnabled.java
index 18c4db13..2f4e4a19 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ConditionalOnNacosDiscoveryEnabled.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ConditionalOnNacosDiscoveryEnabled.java
@@ -25,8 +25,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
-@ConditionalOnProperty(value = "spring.cloud.nacos.discovery.enabled",
- matchIfMissing = true)
+@ConditionalOnProperty(value = "spring.cloud.nacos.discovery.enabled", matchIfMissing = true)
public @interface ConditionalOnNacosDiscoveryEnabled {
}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java
index 5b283c9a..3ee047b4 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java
@@ -19,7 +19,6 @@ package com.alibaba.cloud.nacos;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
-import java.net.SocketException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
@@ -30,9 +29,7 @@ import java.util.regex.Pattern;
import javax.annotation.PostConstruct;
-import com.alibaba.nacos.api.NacosFactory;
-import com.alibaba.nacos.api.naming.NamingMaintainFactory;
-import com.alibaba.nacos.api.naming.NamingMaintainService;
+import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoChangedEvent;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.PreservedMetadataKeys;
import com.alibaba.nacos.client.naming.utils.UtilAndComs;
@@ -44,6 +41,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.commons.util.InetUtils;
+import org.springframework.context.ApplicationEventPublisher;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.util.StringUtils;
@@ -64,8 +62,8 @@ import static com.alibaba.nacos.api.PropertyKeyConst.USERNAME;
* @author xiaojing
* @author Mercy
* @author lyuzb
+ * @author eshun
*/
-
@ConfigurationProperties("spring.cloud.nacos.discovery")
public class NacosDiscoveryProperties {
@@ -199,18 +197,30 @@ public class NacosDiscoveryProperties {
*/
private Integer ipDeleteTimeout;
+ /**
+ * If instance is enabled to accept request. The default value is true.
+ */
+ private boolean instanceEnabled = true;
+
+ /**
+ * If instance is ephemeral.The default value is true.
+ */
+ private boolean ephemeral = true;
+
@Autowired
private InetUtils inetUtils;
@Autowired
private Environment environment;
- private static NamingService namingService;
+ @Autowired
+ private NacosServiceManager nacosServiceManager;
- private static NamingMaintainService namingMaintainService;
+ @Autowired
+ private ApplicationEventPublisher applicationEventPublisher;
@PostConstruct
- public void init() throws SocketException {
+ public void init() throws Exception {
metadata.put(PreservedMetadataKeys.REGISTER_SOURCE, "SPRING_CLOUD");
if (secure) {
@@ -257,6 +267,19 @@ public class NacosDiscoveryProperties {
}
this.overrideFromEnv(environment);
+ if (nacosServiceManager.isNacosDiscoveryInfoChanged(this)) {
+ applicationEventPublisher
+ .publishEvent(new NacosDiscoveryInfoChangedEvent(this));
+ }
+ }
+
+ /**
+ * recommend to use {@link NacosServiceManager#getNamingService(Properties)}.
+ * @return NamingService
+ */
+ @Deprecated
+ public NamingService namingServiceInstance() {
+ return nacosServiceManager.getNamingService(this.getNacosProperties());
}
public String getEndpoint() {
@@ -447,6 +470,58 @@ public class NacosDiscoveryProperties {
this.password = password;
}
+ public boolean isInstanceEnabled() {
+ return instanceEnabled;
+ }
+
+ public void setInstanceEnabled(boolean instanceEnabled) {
+ this.instanceEnabled = instanceEnabled;
+ }
+
+ public boolean isEphemeral() {
+ return ephemeral;
+ }
+
+ public void setEphemeral(boolean ephemeral) {
+ this.ephemeral = ephemeral;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ NacosDiscoveryProperties that = (NacosDiscoveryProperties) o;
+ return Objects.equals(serverAddr, that.serverAddr)
+ && Objects.equals(username, that.username)
+ && Objects.equals(password, that.password)
+ && Objects.equals(endpoint, that.endpoint)
+ && Objects.equals(namespace, that.namespace)
+ && Objects.equals(logName, that.logName)
+ && Objects.equals(service, that.service)
+ && Objects.equals(clusterName, that.clusterName)
+ && Objects.equals(group, that.group) && Objects.equals(ip, that.ip)
+ && Objects.equals(port, that.port)
+ && Objects.equals(networkInterface, that.networkInterface)
+ && Objects.equals(accessKey, that.accessKey)
+ && Objects.equals(secretKey, that.secretKey)
+ && Objects.equals(heartBeatInterval, that.heartBeatInterval)
+ && Objects.equals(heartBeatTimeout, that.heartBeatTimeout)
+ && Objects.equals(ipDeleteTimeout, that.ipDeleteTimeout);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(serverAddr, username, password, endpoint, namespace,
+ watchDelay, logName, service, weight, clusterName, group,
+ namingLoadCacheAtStart, registerEnabled, ip, networkInterface, port,
+ secure, accessKey, secretKey, heartBeatInterval, heartBeatTimeout,
+ ipDeleteTimeout, instanceEnabled, ephemeral);
+ }
+
@Override
public String toString() {
return "NacosDiscoveryProperties{" + "serverAddr='" + serverAddr + '\''
@@ -510,41 +585,7 @@ public class NacosDiscoveryProperties {
}
}
- public NamingService namingServiceInstance() {
-
- if (null != namingService) {
- return namingService;
- }
-
- try {
- namingService = NacosFactory.createNamingService(getNacosProperties());
- }
- catch (Exception e) {
- log.error("create naming service error!properties={},e=,", this, e);
- return null;
- }
- return namingService;
- }
-
- @Deprecated
- 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() {
+ public Properties getNacosProperties() {
Properties properties = new Properties();
properties.put(SERVER_ADDR, serverAddr);
properties.put(USERNAME, Objects.toString(username, ""));
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceAutoConfiguration.java
new file mode 100644
index 00000000..04b09d76
--- /dev/null
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceAutoConfiguration.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013-2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.alibaba.cloud.nacos;
+
+import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author yuhuangbin
+ */
+@Configuration
+@ConditionalOnDiscoveryEnabled
+@ConditionalOnNacosDiscoveryEnabled
+public class NacosServiceAutoConfiguration {
+
+ @Bean
+ public NacosServiceManager nacosServiceManager() {
+ return new NacosServiceManager();
+ }
+
+}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java
new file mode 100644
index 00000000..c672bbac
--- /dev/null
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2013-2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.alibaba.cloud.nacos;
+
+import java.util.Objects;
+import java.util.Properties;
+
+import com.alibaba.cloud.nacos.registry.NacosRegistration;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.naming.NamingMaintainService;
+import com.alibaba.nacos.api.naming.NamingService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.cloud.client.discovery.event.InstancePreRegisteredEvent;
+import org.springframework.cloud.client.serviceregistry.Registration;
+import org.springframework.context.event.EventListener;
+
+import static com.alibaba.nacos.api.NacosFactory.createMaintainService;
+import static com.alibaba.nacos.api.NacosFactory.createNamingService;
+import static org.springframework.beans.BeanUtils.copyProperties;
+
+/**
+ * @author yuhuangbin
+ */
+public class NacosServiceManager {
+
+ private static final Logger log = LoggerFactory.getLogger(NacosServiceManager.class);
+
+ private NacosDiscoveryProperties nacosDiscoveryPropertiesCache;
+
+ private NamingService namingService;
+
+ private NamingMaintainService namingMaintainService;
+
+ public NamingService getNamingService(Properties properties) {
+ if (Objects.isNull(this.namingService)) {
+ buildNamingService(properties);
+ }
+ return namingService;
+ }
+
+ public NamingMaintainService getNamingMaintainService(Properties properties) {
+ if (Objects.isNull(namingMaintainService)) {
+ buildNamingMaintainService(properties);
+ }
+ return namingMaintainService;
+ }
+
+ public boolean isNacosDiscoveryInfoChanged(
+ NacosDiscoveryProperties nacosDiscoveryProperties) {
+ if (Objects.isNull(nacosDiscoveryPropertiesCache)
+ || this.nacosDiscoveryPropertiesCache.equals(nacosDiscoveryProperties)) {
+ return false;
+ }
+ copyProperties(nacosDiscoveryProperties, nacosDiscoveryPropertiesCache);
+ return true;
+ }
+
+ private NamingMaintainService buildNamingMaintainService(Properties properties) {
+ if (Objects.isNull(namingMaintainService)) {
+ synchronized (NacosServiceManager.class) {
+ if (Objects.isNull(namingMaintainService)) {
+ namingMaintainService = createNamingMaintainService(properties);
+ }
+ }
+ }
+ return namingMaintainService;
+ }
+
+ private NamingService buildNamingService(Properties properties) {
+ if (Objects.isNull(namingService)) {
+ synchronized (NacosServiceManager.class) {
+ if (Objects.isNull(namingService)) {
+ namingService = createNewNamingService(properties);
+ }
+ }
+ }
+ return namingService;
+ }
+
+ private NamingService createNewNamingService(Properties properties) {
+ try {
+ return createNamingService(properties);
+ }
+ catch (NacosException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private NamingMaintainService createNamingMaintainService(Properties properties) {
+ try {
+ return createMaintainService(properties);
+ }
+ catch (NacosException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void nacosServiceShutDown() throws NacosException {
+ this.namingService.shutDown();
+ namingService = null;
+ namingMaintainService = null;
+ }
+
+ @EventListener
+ public void onInstancePreRegisteredEvent(
+ InstancePreRegisteredEvent instancePreRegisteredEvent) {
+ Registration registration = instancePreRegisteredEvent.getRegistration();
+ if (Objects.isNull(nacosDiscoveryPropertiesCache)
+ && registration instanceof NacosRegistration) {
+ NacosDiscoveryProperties nacosDiscoveryProperties = ((NacosRegistration) registration)
+ .getNacosDiscoveryProperties();
+
+ nacosDiscoveryPropertiesCache = new NacosDiscoveryProperties();
+ copyProperties(nacosDiscoveryProperties, nacosDiscoveryPropertiesCache);
+ }
+ }
+
+}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryAutoConfiguration.java
index 0af3a187..748942b6 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryAutoConfiguration.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryAutoConfiguration.java
@@ -18,6 +18,7 @@ package com.alibaba.cloud.nacos.discovery;
import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.cloud.nacos.NacosServiceManager;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
@@ -41,8 +42,9 @@ public class NacosDiscoveryAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public NacosServiceDiscovery nacosServiceDiscovery(
- NacosDiscoveryProperties discoveryProperties) {
- return new NacosServiceDiscovery(discoveryProperties);
+ NacosDiscoveryProperties discoveryProperties,
+ NacosServiceManager nacosServiceManager) {
+ return new NacosServiceDiscovery(discoveryProperties, nacosServiceManager);
}
}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java
index 893b9e69..e8e6a166 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java
@@ -18,6 +18,7 @@ package com.alibaba.cloud.nacos.discovery;
import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.cloud.nacos.NacosServiceManager;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -38,9 +39,8 @@ import org.springframework.scheduling.TaskScheduler;
*/
@Configuration
@ConditionalOnDiscoveryEnabled
-//@ConditionalOnBlockingDiscoveryEnabled
-@ConditionalOnProperty(value = "spring.cloud.discovery.blocking.enabled",
- matchIfMissing = true)
+// @ConditionalOnBlockingDiscoveryEnabled
+@ConditionalOnProperty(value = "spring.cloud.discovery.blocking.enabled", matchIfMissing = true)
@ConditionalOnNacosDiscoveryEnabled
@AutoConfigureBefore({ SimpleDiscoveryClientAutoConfiguration.class,
CommonsClientAutoConfiguration.class })
@@ -55,11 +55,12 @@ public class NacosDiscoveryClientConfiguration {
@Bean
@ConditionalOnMissingBean
- @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled",
- matchIfMissing = true)
- public NacosWatch nacosWatch(NacosDiscoveryProperties nacosDiscoveryProperties,
- ObjectProvider taskScheduler) {
- return new NacosWatch(nacosDiscoveryProperties, taskScheduler);
+ @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled", matchIfMissing = true)
+ public NacosWatch nacosWatch(NacosServiceManager nacosServiceManager,
+ NacosDiscoveryProperties nacosDiscoveryProperties,
+ ObjectProvider taskExecutorObjectProvider) {
+ return new NacosWatch(nacosServiceManager, nacosDiscoveryProperties,
+ taskExecutorObjectProvider);
}
}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java
index ffe73aaf..79a4b27d 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java
@@ -23,7 +23,9 @@ import java.util.Map;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.NacosServiceInstance;
+import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.api.naming.pojo.ListView;
@@ -36,8 +38,12 @@ public class NacosServiceDiscovery {
private NacosDiscoveryProperties discoveryProperties;
- public NacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties) {
+ private NacosServiceManager nacosServiceManager;
+
+ public NacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties,
+ NacosServiceManager nacosServiceManager) {
this.discoveryProperties = discoveryProperties;
+ this.nacosServiceManager = nacosServiceManager;
}
/**
@@ -48,8 +54,8 @@ public class NacosServiceDiscovery {
*/
public List getInstances(String serviceId) throws NacosException {
String group = discoveryProperties.getGroup();
- List instances = discoveryProperties.namingServiceInstance()
- .selectInstances(serviceId, group, true);
+ List instances = namingService().selectInstances(serviceId, group,
+ true);
return hostToServiceInstanceList(instances, serviceId);
}
@@ -60,13 +66,13 @@ public class NacosServiceDiscovery {
*/
public List getServices() throws NacosException {
String group = discoveryProperties.getGroup();
- ListView services = discoveryProperties.namingServiceInstance()
- .getServicesOfServer(1, Integer.MAX_VALUE, group);
+ ListView services = namingService().getServicesOfServer(1,
+ Integer.MAX_VALUE, group);
return services.getData();
}
public static List hostToServiceInstanceList(
- List instances, String serviceId) {
+ List instances, String serviceId) {
List result = new ArrayList<>(instances.size());
for (Instance instance : instances) {
ServiceInstance serviceInstance = hostToServiceInstance(instance, serviceId);
@@ -78,7 +84,7 @@ public class NacosServiceDiscovery {
}
public static ServiceInstance hostToServiceInstance(Instance instance,
- String serviceId) {
+ String serviceId) {
if (instance == null || !instance.isEnabled() || !instance.isHealthy()) {
return null;
}
@@ -92,7 +98,10 @@ public class NacosServiceDiscovery {
metadata.put("nacos.weight", instance.getWeight() + "");
metadata.put("nacos.healthy", instance.isHealthy() + "");
metadata.put("nacos.cluster", instance.getClusterName() + "");
- metadata.putAll(instance.getMetadata());
+ if (instance.getMetadata() != null) {
+ metadata.putAll(instance.getMetadata());
+ }
+ metadata.put("nacos.ephemeral", String.valueOf(instance.isEphemeral()));
nacosServiceInstance.setMetadata(metadata);
if (metadata.containsKey("secure")) {
@@ -102,4 +111,9 @@ public class NacosServiceDiscovery {
return nacosServiceInstance;
}
+ private NamingService namingService() {
+ return nacosServiceManager
+ .getNamingService(discoveryProperties.getNacosProperties());
+ }
+
}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java
index d10ef0a5..85058083 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java
@@ -16,11 +16,23 @@
package com.alibaba.cloud.nacos.discovery;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.cloud.nacos.NacosServiceManager;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.naming.NamingService;
+import com.alibaba.nacos.api.naming.listener.Event;
+import com.alibaba.nacos.api.naming.listener.EventListener;
+import com.alibaba.nacos.api.naming.listener.NamingEvent;
+import com.alibaba.nacos.api.naming.pojo.Instance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -34,47 +46,39 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
/**
* @author xiaojing
+ * @author yuhuangbin
*/
public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycle {
private static final Logger log = LoggerFactory.getLogger(NacosWatch.class);
- private final NacosDiscoveryProperties properties;
-
- private final TaskScheduler taskScheduler;
-
- private final AtomicLong nacosWatchIndex = new AtomicLong(0);
+ private Map listenerMap = new ConcurrentHashMap<>(16);
private final AtomicBoolean running = new AtomicBoolean(false);
+ private final AtomicLong nacosWatchIndex = new AtomicLong(0);
+
private ApplicationEventPublisher publisher;
private ScheduledFuture> watchFuture;
- public NacosWatch(NacosDiscoveryProperties properties) {
- this(properties, getTaskScheduler());
- }
+ private NacosServiceManager nacosServiceManager;
- public NacosWatch(NacosDiscoveryProperties properties, TaskScheduler taskScheduler) {
+ private final NacosDiscoveryProperties properties;
+
+ private final TaskScheduler taskScheduler;
+
+ public NacosWatch(NacosServiceManager nacosServiceManager,
+ NacosDiscoveryProperties properties,
+ ObjectProvider taskScheduler) {
+ this.nacosServiceManager = nacosServiceManager;
this.properties = properties;
- this.taskScheduler = taskScheduler;
- }
-
- /**
- * The constructor with {@link NacosDiscoveryProperties} bean and the optional.
- * {@link TaskScheduler} bean
- * @param properties {@link NacosDiscoveryProperties} bean
- * @param taskScheduler the optional {@link TaskScheduler} bean
- * @since 2.2.0
- */
- public NacosWatch(NacosDiscoveryProperties properties,
- ObjectProvider taskScheduler) {
- this(properties, taskScheduler.getIfAvailable(NacosWatch::getTaskScheduler));
+ this.taskScheduler = taskScheduler.getIfAvailable(NacosWatch::getTaskScheduler);
}
private static ThreadPoolTaskScheduler getTaskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
- taskScheduler.setBeanName("Nacso-Watch-Task-Scheduler");
+ taskScheduler.setBeanName("Nacos-Watch-Task-Scheduler");
taskScheduler.initialize();
return taskScheduler;
}
@@ -98,19 +102,75 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl
@Override
public void start() {
if (this.running.compareAndSet(false, true)) {
+ EventListener eventListener = listenerMap.computeIfAbsent(buildKey(),
+ event -> new EventListener() {
+ @Override
+ public void onEvent(Event event) {
+ if (event instanceof NamingEvent) {
+ List instances = ((NamingEvent) event)
+ .getInstances();
+ Optional instanceOptional = selectCurrentInstance(
+ instances);
+ instanceOptional.ifPresent(currentInstance -> {
+ resetIfNeeded(currentInstance);
+ });
+ }
+ }
+ });
+
+ NamingService namingService = nacosServiceManager
+ .getNamingService(properties.getNacosProperties());
+ try {
+ namingService.subscribe(properties.getService(), properties.getGroup(),
+ Arrays.asList(properties.getClusterName()), eventListener);
+ }
+ catch (Exception e) {
+ log.error("namingService subscribe failed, properties:{}", properties, e);
+ }
+
this.watchFuture = this.taskScheduler.scheduleWithFixedDelay(
this::nacosServicesWatch, this.properties.getWatchDelay());
}
}
+ private String buildKey() {
+ return String.join(":", properties.getService(), properties.getGroup());
+ }
+
+ private void resetIfNeeded(Instance instance) {
+ if (!properties.getMetadata().equals(instance.getMetadata())) {
+ properties.setMetadata(instance.getMetadata());
+ }
+ }
+
+ private Optional selectCurrentInstance(List instances) {
+ return instances.stream()
+ .filter(instance -> properties.getIp().equals(instance.getIp())
+ && properties.getPort() == instance.getPort())
+ .findFirst();
+ }
+
@Override
public void stop() {
- if (this.running.compareAndSet(true, false) && this.watchFuture != null) {
- // shutdown current user-thread,
- // then the other daemon-threads will terminate automatic.
- ((ThreadPoolTaskScheduler) this.taskScheduler).shutdown();
+ if (this.running.compareAndSet(true, false)) {
+ if (this.watchFuture != null) {
+ // shutdown current user-thread,
+ // then the other daemon-threads will terminate automatic.
+ ((ThreadPoolTaskScheduler) this.taskScheduler).shutdown();
+ this.watchFuture.cancel(true);
+ }
- this.watchFuture.cancel(true);
+ EventListener eventListener = listenerMap.get(buildKey());
+ try {
+ NamingService namingService = nacosServiceManager
+ .getNamingService(properties.getNacosProperties());
+ namingService.unsubscribe(properties.getService(), properties.getGroup(),
+ Arrays.asList(properties.getClusterName()), eventListener);
+ }
+ catch (NacosException e) {
+ log.error("namingService unsubscribe failed, properties:{}", properties,
+ e);
+ }
}
}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java
index 5a925ec3..ea63c583 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/actuate/health/NacosDiscoveryHealthIndicator.java
@@ -26,7 +26,6 @@ import org.springframework.boot.actuate.health.HealthIndicator;
* The {@link HealthIndicator} for Nacos Discovery.
*
* @author Mercy
- * @since 2.2.0
* @see HealthIndicator
*/
public class NacosDiscoveryHealthIndicator extends AbstractHealthIndicator {
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java
index 08ab5c12..f50aca92 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/configclient/NacosDiscoveryClientConfigServiceBootstrapConfiguration.java
@@ -31,11 +31,10 @@ import org.springframework.context.annotation.Configuration;
* @author JevonYang
*/
@ConditionalOnClass(ConfigServicePropertySourceLocator.class)
-@ConditionalOnProperty(value = "spring.cloud.config.discovery.enabled",
- matchIfMissing = false)
+@ConditionalOnProperty(value = "spring.cloud.config.discovery.enabled", matchIfMissing = false)
@Configuration
@ImportAutoConfiguration({ NacosDiscoveryAutoConfiguration.class,
- NacosDiscoveryClientConfiguration.class})
+ NacosDiscoveryClientConfiguration.class })
public class NacosDiscoveryClientConfigServiceBootstrapConfiguration {
}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java
index a824675e..84d89b81 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java
@@ -22,6 +22,7 @@ import java.util.List;
import java.util.Map;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
import org.slf4j.Logger;
@@ -41,9 +42,13 @@ public class NacosDiscoveryEndpoint {
private static final Logger log = LoggerFactory
.getLogger(NacosDiscoveryEndpoint.class);
+ private NacosServiceManager nacosServiceManager;
+
private NacosDiscoveryProperties nacosDiscoveryProperties;
- public NacosDiscoveryEndpoint(NacosDiscoveryProperties nacosDiscoveryProperties) {
+ public NacosDiscoveryEndpoint(NacosServiceManager nacosServiceManager,
+ NacosDiscoveryProperties nacosDiscoveryProperties) {
+ this.nacosServiceManager = nacosServiceManager;
this.nacosDiscoveryProperties = nacosDiscoveryProperties;
}
@@ -55,7 +60,8 @@ public class NacosDiscoveryEndpoint {
Map result = new HashMap<>();
result.put("NacosDiscoveryProperties", nacosDiscoveryProperties);
- NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
+ NamingService namingService = nacosServiceManager
+ .getNamingService(nacosDiscoveryProperties.getNacosProperties());
List subscribe = Collections.emptyList();
try {
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java
index ff3b65f3..de581564 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java
@@ -16,8 +16,11 @@
package com.alibaba.cloud.nacos.endpoint;
+import java.util.Properties;
+
import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.cloud.nacos.discovery.actuate.health.NacosDiscoveryHealthIndicator;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
@@ -44,16 +47,19 @@ public class NacosDiscoveryEndpointAutoConfiguration {
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
public NacosDiscoveryEndpoint nacosDiscoveryEndpoint(
+ NacosServiceManager nacosServiceManager,
NacosDiscoveryProperties nacosDiscoveryProperties) {
- return new NacosDiscoveryEndpoint(nacosDiscoveryProperties);
+ return new NacosDiscoveryEndpoint(nacosServiceManager, nacosDiscoveryProperties);
}
@Bean
@ConditionalOnEnabledHealthIndicator("nacos-discovery")
public HealthIndicator nacosDiscoveryHealthIndicator(
+ NacosServiceManager nacosServiceManager,
NacosDiscoveryProperties nacosDiscoveryProperties) {
+ Properties nacosProperties = nacosDiscoveryProperties.getNacosProperties();
return new NacosDiscoveryHealthIndicator(
- nacosDiscoveryProperties.namingServiceInstance());
+ nacosServiceManager.getNamingService(nacosProperties));
}
}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoChangedEvent.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoChangedEvent.java
new file mode 100644
index 00000000..4e922e81
--- /dev/null
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoChangedEvent.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2013-2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.alibaba.cloud.nacos.event;
+
+import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+
+import org.springframework.context.ApplicationEvent;
+
+/**
+ * @author yuhuangbin
+ */
+public class NacosDiscoveryInfoChangedEvent extends ApplicationEvent {
+
+ public NacosDiscoveryInfoChangedEvent(
+ NacosDiscoveryProperties nacosDiscoveryProperties) {
+ super(nacosDiscoveryProperties);
+ }
+
+ @Override
+ public NacosDiscoveryProperties getSource() {
+ return (NacosDiscoveryProperties) super.getSource();
+ }
+
+}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java
index 649ddd67..8925ad7f 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java
@@ -16,6 +16,7 @@
package com.alibaba.cloud.nacos.registry;
+import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoChangedEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,6 +24,7 @@ import org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegis
import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties;
import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
+import org.springframework.context.event.EventListener;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -39,8 +41,8 @@ public class NacosAutoServiceRegistration
private NacosRegistration registration;
public NacosAutoServiceRegistration(ServiceRegistry serviceRegistry,
- AutoServiceRegistrationProperties autoServiceRegistrationProperties,
- NacosRegistration registration) {
+ AutoServiceRegistrationProperties autoServiceRegistrationProperties,
+ NacosRegistration registration) {
super(serviceRegistry, autoServiceRegistrationProperties);
this.registration = registration;
}
@@ -102,4 +104,14 @@ public class NacosAutoServiceRegistration
return StringUtils.isEmpty(appName) ? super.getAppName() : appName;
}
+ @EventListener
+ public void onNacosDiscoveryInfoChangedEvent(NacosDiscoveryInfoChangedEvent event) {
+ restart();
+ }
+
+ private void restart() {
+ this.stop();
+ this.start();
+ }
+
}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java
index aac1b82f..75912ca4 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java
@@ -17,12 +17,12 @@
package com.alibaba.cloud.nacos.registry;
import java.net.URI;
+import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
-import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.PreservedMetadataKeys;
import org.springframework.cloud.client.DefaultServiceInstance;
@@ -58,12 +58,16 @@ public class NacosRegistration implements Registration, ServiceInstance {
*/
public static final String MANAGEMENT_ENDPOINT_BASE_PATH = "management.endpoints.web.base-path";
+ private List registrationCustomizers;
+
private NacosDiscoveryProperties nacosDiscoveryProperties;
private ApplicationContext context;
- public NacosRegistration(NacosDiscoveryProperties nacosDiscoveryProperties,
+ public NacosRegistration(List registrationCustomizers,
+ NacosDiscoveryProperties nacosDiscoveryProperties,
ApplicationContext context) {
+ this.registrationCustomizers = registrationCustomizers;
this.nacosDiscoveryProperties = nacosDiscoveryProperties;
this.context = context;
}
@@ -105,6 +109,17 @@ public class NacosRegistration implements Registration, ServiceInstance {
metadata.put(PreservedMetadataKeys.IP_DELETE_TIMEOUT,
nacosDiscoveryProperties.getIpDeleteTimeout().toString());
}
+ customize(registrationCustomizers, this);
+ }
+
+ private static void customize(
+ List registrationCustomizers,
+ NacosRegistration registration) {
+ if (registrationCustomizers != null) {
+ for (NacosRegistrationCustomizer customizer : registrationCustomizers) {
+ customizer.customize(registration);
+ }
+ }
}
@Override
@@ -157,10 +172,6 @@ public class NacosRegistration implements Registration, ServiceInstance {
return nacosDiscoveryProperties;
}
- public NamingService getNacosNamingService() {
- return nacosDiscoveryProperties.namingServiceInstance();
- }
-
@Override
public String toString() {
return "NacosRegistration{" + "nacosDiscoveryProperties="
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java
new file mode 100644
index 00000000..e0437602
--- /dev/null
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2013-2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.alibaba.cloud.nacos.registry;
+
+/**
+ * @author L.cm
+ */
+public interface NacosRegistrationCustomizer {
+
+ /**
+ * customize NacosRegistration.
+ * @param registration NacosRegistration
+ */
+ void customize(NacosRegistration registration);
+
+}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java
index b0974a55..0efd8642 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java
@@ -17,13 +17,17 @@
package com.alibaba.cloud.nacos.registry;
import java.util.List;
+import java.util.Properties;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.cloud.nacos.NacosServiceManager;
+import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
import org.springframework.util.StringUtils;
@@ -33,6 +37,7 @@ import static org.springframework.util.ReflectionUtils.rethrowRuntimeException;
/**
* @author xiaojing
* @author Mercy
+ * @author eshun
*/
public class NacosServiceRegistry implements ServiceRegistry {
@@ -40,11 +45,11 @@ public class NacosServiceRegistry implements ServiceRegistry {
private final NacosDiscoveryProperties nacosDiscoveryProperties;
- private final NamingService namingService;
+ @Autowired
+ private NacosServiceManager nacosServiceManager;
public NacosServiceRegistry(NacosDiscoveryProperties nacosDiscoveryProperties) {
this.nacosDiscoveryProperties = nacosDiscoveryProperties;
- this.namingService = nacosDiscoveryProperties.namingServiceInstance();
}
@Override
@@ -55,6 +60,7 @@ public class NacosServiceRegistry implements ServiceRegistry {
return;
}
+ NamingService namingService = namingService();
String serviceId = registration.getServiceId();
String group = nacosDiscoveryProperties.getGroup();
@@ -84,7 +90,7 @@ public class NacosServiceRegistry implements ServiceRegistry {
return;
}
- NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
+ NamingService namingService = namingService();
String serviceId = registration.getServiceId();
String group = nacosDiscoveryProperties.getGroup();
@@ -102,7 +108,12 @@ public class NacosServiceRegistry implements ServiceRegistry {
@Override
public void close() {
-
+ try {
+ nacosServiceManager.nacosServiceShutDown();
+ }
+ catch (NacosException e) {
+ log.error("Nacos namingService shutDown failed", e);
+ }
}
@Override
@@ -125,7 +136,8 @@ public class NacosServiceRegistry implements ServiceRegistry {
}
try {
- nacosDiscoveryProperties.namingMaintainServiceInstance()
+ Properties nacosProperties = nacosDiscoveryProperties.getNacosProperties();
+ nacosServiceManager.getNamingMaintainService(nacosProperties)
.updateInstance(serviceId, instance);
}
catch (Exception e) {
@@ -139,8 +151,7 @@ public class NacosServiceRegistry implements ServiceRegistry {
String serviceName = registration.getServiceId();
try {
- List instances = nacosDiscoveryProperties.namingServiceInstance()
- .getAllInstances(serviceName);
+ List instances = namingService().getAllInstances(serviceName);
for (Instance instance : instances) {
if (instance.getIp().equalsIgnoreCase(nacosDiscoveryProperties.getIp())
&& instance.getPort() == nacosDiscoveryProperties.getPort()) {
@@ -160,9 +171,15 @@ public class NacosServiceRegistry implements ServiceRegistry {
instance.setPort(registration.getPort());
instance.setWeight(nacosDiscoveryProperties.getWeight());
instance.setClusterName(nacosDiscoveryProperties.getClusterName());
+ instance.setEnabled(nacosDiscoveryProperties.isInstanceEnabled());
instance.setMetadata(registration.getMetadata());
-
+ instance.setEphemeral(nacosDiscoveryProperties.isEphemeral());
return instance;
}
+ private NamingService namingService() {
+ return nacosServiceManager
+ .getNamingService(nacosDiscoveryProperties.getNacosProperties());
+ }
+
}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java
index 5ff6fa22..1b00f5bc 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java
@@ -16,10 +16,13 @@
package com.alibaba.cloud.nacos.registry;
+import java.util.List;
+
import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration;
+import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -38,8 +41,7 @@ import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties
@ConditionalOnNacosDiscoveryEnabled
-@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
- matchIfMissing = true)
+@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
@AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
AutoServiceRegistrationAutoConfiguration.class,
NacosDiscoveryAutoConfiguration.class })
@@ -54,9 +56,11 @@ public class NacosServiceRegistryAutoConfiguration {
@Bean
@ConditionalOnBean(AutoServiceRegistrationProperties.class)
public NacosRegistration nacosRegistration(
+ ObjectProvider> registrationCustomizers,
NacosDiscoveryProperties nacosDiscoveryProperties,
ApplicationContext context) {
- return new NacosRegistration(nacosDiscoveryProperties, context);
+ return new NacosRegistration(registrationCustomizers.getIfAvailable(),
+ nacosDiscoveryProperties, context);
}
@Bean
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java
index 647d7003..0eae47c9 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java
@@ -42,7 +42,7 @@ public class NacosRibbonClientConfiguration {
@Bean
@ConditionalOnMissingBean
public ServerList> ribbonServerList(IClientConfig config,
- NacosDiscoveryProperties nacosDiscoveryProperties) {
+ NacosDiscoveryProperties nacosDiscoveryProperties) {
if (this.propertiesFactory.isSet(ServerList.class, config.getClientName())) {
ServerList serverList = this.propertiesFactory.get(ServerList.class, config,
config.getClientName());
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java
index db0a6d9c..8d705b04 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java
@@ -21,6 +21,7 @@ import java.util.Objects;
import java.util.stream.Collectors;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.netflix.client.config.IClientConfig;
@@ -47,16 +48,20 @@ public class NacosRule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
+ @Autowired
+ private NacosServiceManager nacosServiceManager;
+
@Override
public Server choose(Object key) {
try {
String clusterName = this.nacosDiscoveryProperties.getClusterName();
+ String group = this.nacosDiscoveryProperties.getGroup();
DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
String name = loadBalancer.getName();
- NamingService namingService = nacosDiscoveryProperties
- .namingServiceInstance();
- List instances = namingService.selectInstances(name, true);
+ NamingService namingService = nacosServiceManager
+ .getNamingService(nacosDiscoveryProperties.getNacosProperties());
+ List instances = namingService.selectInstances(name, group, true);
if (CollectionUtils.isEmpty(instances)) {
LOGGER.warn("no instance in service {}", name);
return null;