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"));