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 310718bc..b0dd3628 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;
@@ -55,9 +56,11 @@ 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);
+ 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..a58f4612 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,8 +66,8 @@ 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();
}
@@ -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..4a78238f 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) {
- this.properties = properties;
- this.taskScheduler = taskScheduler;
- }
+ private final NacosDiscoveryProperties properties;
- /**
- * 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,
+ private final TaskScheduler taskScheduler;
+
+ public NacosWatch(NacosServiceManager nacosServiceManager,
+ NacosDiscoveryProperties properties,
ObjectProvider taskScheduler) {
- this(properties, taskScheduler.getIfAvailable(NacosWatch::getTaskScheduler));
+ this.nacosServiceManager = nacosServiceManager;
+ this.properties = properties;
+ 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/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..9f88830e 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..097ddc85 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;
@@ -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 18a740a8..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;
@@ -53,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/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;
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index 5cb5e588..e7381c30 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -1,60 +1,72 @@
{"properties": [
- {
- "name": "spring.cloud.nacos.server-addr",
- "type": "java.lang.String",
- "defaultValue": "localhost:8848",
- "description": "nacos server address."
- },
- {
- "name": "spring.cloud.nacos.discovery.server-addr",
- "type": "java.lang.String",
- "defaultValue": "${spring.cloud.nacos.server-addr}",
- "description": "nacos discovery server address."
- },
- {
- "name": "spring.cloud.nacos.discovery.service",
- "type": "java.lang.String",
- "defaultValue": "${spring.application.name}",
- "description": "the service name to register, default value is ${spring.application.name}."
- },
- {
- "name": "spring.cloud.nacos.discovery.enabled",
- "type": "java.lang.Boolean",
- "defaultValue": true,
- "description": "enable nacos discovery or not."
- },
- {
- "name": "spring.cloud.nacos.discovery.namingLoadCacheAtStart",
- "type": "java.lang.Boolean",
- "defaultValue": "false",
- "description": "naming load from local cache at application start ."
- },
- {
- "name": "spring.cloud.nacos.discovery.watch.enabled",
- "type": "java.lang.Boolean",
- "defaultValue": "true",
- "description": "enable nacos discovery watch or not ."
- },
- {
- "name": "spring.cloud.nacos.discovery.username",
- "type": "java.lang.String",
- "defaultValue": "${spring.cloud.nacos.username}",
- "description": "nacos discovery service's username to authenticate."
- },
- {
- "name": "spring.cloud.nacos.discovery.password",
- "type": "java.lang.String",
- "defaultValue": "${spring.cloud.nacos.password}",
- "description": "nacos discovery service's password to authenticate."
- },
- {
- "name": "spring.cloud.nacos.username",
- "type": "java.lang.String",
- "description": "nacos userName to authenticate."
- },
- {
- "name": "spring.cloud.nacos.password",
- "type": "java.lang.String",
- "description": "nacos password to authenticate."
- }
+ {
+ "name": "spring.cloud.nacos.server-addr",
+ "type": "java.lang.String",
+ "defaultValue": "localhost:8848",
+ "description": "nacos server address."
+ },
+ {
+ "name": "spring.cloud.nacos.discovery.server-addr",
+ "type": "java.lang.String",
+ "defaultValue": "${spring.cloud.nacos.server-addr}",
+ "description": "nacos discovery server address."
+ },
+ {
+ "name": "spring.cloud.nacos.discovery.service",
+ "type": "java.lang.String",
+ "defaultValue": "${spring.application.name}",
+ "description": "the service name to register, default value is ${spring.application.name}."
+ },
+ {
+ "name": "spring.cloud.nacos.discovery.enabled",
+ "type": "java.lang.Boolean",
+ "defaultValue": true,
+ "description": "enable nacos discovery or not."
+ },
+ {
+ "name": "spring.cloud.nacos.discovery.instance-enabled",
+ "type": "java.lang.Boolean",
+ "defaultValue": true,
+ "description": "If instance is enabled to accept request. The default value is true."
+ },
+ {
+ "name": "spring.cloud.nacos.discovery.ephemeral",
+ "type": "java.lang.Boolean",
+ "defaultValue": true,
+ "description": "If instance is ephemeral.The default value is true."
+ },
+ {
+ "name": "spring.cloud.nacos.discovery.namingLoadCacheAtStart",
+ "type": "java.lang.Boolean",
+ "defaultValue": "false",
+ "description": "naming load from local cache at application start ."
+ },
+ {
+ "name": "spring.cloud.nacos.discovery.watch.enabled",
+ "type": "java.lang.Boolean",
+ "defaultValue": "true",
+ "description": "enable nacos discovery watch or not ."
+ },
+ {
+ "name": "spring.cloud.nacos.discovery.username",
+ "type": "java.lang.String",
+ "defaultValue": "${spring.cloud.nacos.username}",
+ "description": "nacos discovery service's username to authenticate."
+ },
+ {
+ "name": "spring.cloud.nacos.discovery.password",
+ "type": "java.lang.String",
+ "defaultValue": "${spring.cloud.nacos.password}",
+ "description": "nacos discovery service's password to authenticate."
+ },
+ {
+ "name": "spring.cloud.nacos.username",
+ "type": "java.lang.String",
+ "description": "nacos userName to authenticate."
+ },
+ {
+ "name": "spring.cloud.nacos.password",
+ "type": "java.lang.String",
+ "description": "nacos password to authenticate."
+ }
]}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories
index c7a516de..e2c189e2 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories
@@ -4,6 +4,7 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\
com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\
com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
+ com.alibaba.cloud.nacos.NacosServiceAutoConfiguration,\
com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscoveryTest.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscoveryTest.java
index 74404079..97ecc683 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscoveryTest.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscoveryTest.java
@@ -22,6 +22,7 @@ import java.util.LinkedList;
import java.util.List;
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;
@@ -60,16 +61,19 @@ public class NacosServiceDiscoveryTest {
NacosDiscoveryProperties nacosDiscoveryProperties = mock(
NacosDiscoveryProperties.class);
+ NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class);
NamingService namingService = mock(NamingService.class);
- when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService);
+ when(nacosServiceManager
+ .getNamingService(nacosDiscoveryProperties.getNacosProperties()))
+ .thenReturn(namingService);
when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT");
when(namingService.selectInstances(eq(serviceName), eq("DEFAULT"), eq(true)))
.thenReturn(instances);
NacosServiceDiscovery serviceDiscovery = new NacosServiceDiscovery(
- nacosDiscoveryProperties);
+ nacosDiscoveryProperties, nacosServiceManager);
List serviceInstances = serviceDiscovery
.getInstances(serviceName);
@@ -99,16 +103,19 @@ public class NacosServiceDiscoveryTest {
NacosDiscoveryProperties nacosDiscoveryProperties = mock(
NacosDiscoveryProperties.class);
+ NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class);
NamingService namingService = mock(NamingService.class);
- when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService);
+ when(nacosServiceManager
+ .getNamingService(nacosDiscoveryProperties.getNacosProperties()))
+ .thenReturn(namingService);
when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT");
when(namingService.getServicesOfServer(eq(1), eq(Integer.MAX_VALUE),
eq("DEFAULT"))).thenReturn(nacosServices);
NacosServiceDiscovery serviceDiscovery = new NacosServiceDiscovery(
- nacosDiscoveryProperties);
+ nacosDiscoveryProperties, nacosServiceManager);
List services = serviceDiscovery.getServices();
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java
index 66753af7..ffca3607 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java
@@ -328,4 +328,9 @@ public class MockNamingService implements NamingService {
return null;
}
+ @Override
+ public void shutDown() throws NacosException {
+
+ }
+
}
diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java
index 7161cc93..f5ce7175 100644
--- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java
+++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java
@@ -22,6 +22,7 @@ import java.util.Map;
import java.util.Properties;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
+import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration;
import com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpoint;
import com.alibaba.nacos.api.NacosFactory;
@@ -85,6 +86,9 @@ public class NacosAutoServiceRegistrationTests {
@Autowired
private NacosDiscoveryProperties properties;
+ @Autowired
+ private NacosServiceManager nacosServiceManager;
+
@Autowired
private InetUtils inetUtils;
@@ -206,7 +210,7 @@ public class NacosAutoServiceRegistrationTests {
private void checkoutEndpoint() throws Exception {
NacosDiscoveryEndpoint nacosDiscoveryEndpoint = new NacosDiscoveryEndpoint(
- properties);
+ nacosServiceManager, properties);
Map map = nacosDiscoveryEndpoint.nacosDiscovery();
assertThat(properties).isEqualTo(map.get("NacosDiscoveryProperties"));