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 3c8c01c8d..3ee047b4f 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 @@ -29,7 +29,8 @@ import java.util.regex.Pattern; import javax.annotation.PostConstruct; -import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoInitializedEvent; +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; import com.alibaba.spring.util.PropertySourcesUtils; @@ -212,6 +213,9 @@ public class NacosDiscoveryProperties { @Autowired private Environment environment; + @Autowired + private NacosServiceManager nacosServiceManager; + @Autowired private ApplicationEventPublisher applicationEventPublisher; @@ -263,9 +267,19 @@ public class NacosDiscoveryProperties { } this.overrideFromEnv(environment); + if (nacosServiceManager.isNacosDiscoveryInfoChanged(this)) { + applicationEventPublisher + .publishEvent(new NacosDiscoveryInfoChangedEvent(this)); + } + } - applicationEventPublisher - .publishEvent(new NacosDiscoveryInfoInitializedEvent(this)); + /** + * recommend to use {@link NacosServiceManager#getNamingService(Properties)}. + * @return NamingService + */ + @Deprecated + public NamingService namingServiceInstance() { + return nacosServiceManager.getNamingService(this.getNacosProperties()); } public String getEndpoint() { 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 index 9dfc83230..c672bbac0 100644 --- 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 @@ -17,17 +17,15 @@ package com.alibaba.cloud.nacos; import java.util.Objects; -import java.util.Optional; import java.util.Properties; -import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoInitializedEvent; -import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; 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.beans.factory.annotation.Autowired; import org.springframework.cloud.client.discovery.event.InstancePreRegisteredEvent; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.event.EventListener; @@ -41,15 +39,14 @@ import static org.springframework.beans.BeanUtils.copyProperties; */ public class NacosServiceManager { + private static final Logger log = LoggerFactory.getLogger(NacosServiceManager.class); + private NacosDiscoveryProperties nacosDiscoveryPropertiesCache; private NamingService namingService; private NamingMaintainService namingMaintainService; - @Autowired - private Optional nacosAutoServiceRegistrationOptional; - public NamingService getNamingService(Properties properties) { if (Objects.isNull(this.namingService)) { buildNamingService(properties); @@ -114,13 +111,10 @@ public class NacosServiceManager { } } - private void reBuildNacosService(Properties nacosProperties) { - namingService = createNewNamingService(nacosProperties); - namingMaintainService = createNamingMaintainService(nacosProperties); - } - public void nacosServiceShutDown() throws NacosException { this.namingService.shutDown(); + namingService = null; + namingMaintainService = null; } @EventListener @@ -137,19 +131,4 @@ public class NacosServiceManager { } } - @EventListener - public void onNacosDiscoveryInfoInitializedEvent( - NacosDiscoveryInfoInitializedEvent nacosDiscoveryInfoInitializedEvent) { - NacosDiscoveryProperties nacosDiscoveryProperties = nacosDiscoveryInfoInitializedEvent - .getSource(); - if (isNacosDiscoveryInfoChanged(nacosDiscoveryProperties) - && nacosAutoServiceRegistrationOptional.isPresent()) { - NacosAutoServiceRegistration nacosAutoServiceRegistration = nacosAutoServiceRegistrationOptional - .get(); - nacosAutoServiceRegistration.stop(); - reBuildNacosService(nacosDiscoveryProperties.getNacosProperties()); - nacosAutoServiceRegistration.start(); - } - } - } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoChangedEvent.java similarity index 89% rename from spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoChangedEvent.java index 0cca5718e..4e922e812 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoChangedEvent.java @@ -23,9 +23,9 @@ import org.springframework.context.ApplicationEvent; /** * @author yuhuangbin */ -public class NacosDiscoveryInfoInitializedEvent extends ApplicationEvent { +public class NacosDiscoveryInfoChangedEvent extends ApplicationEvent { - public NacosDiscoveryInfoInitializedEvent( + public NacosDiscoveryInfoChangedEvent( NacosDiscoveryProperties nacosDiscoveryProperties) { super(nacosDiscoveryProperties); } 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 649ddd678..097ddc852 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/ribbon/NacosRibbonClientConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java index 712e6a422..a6294e875 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java @@ -17,7 +17,6 @@ package com.alibaba.cloud.nacos.ribbon; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.NacosServiceManager; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.ServerList; @@ -43,15 +42,13 @@ public class NacosRibbonClientConfiguration { @Bean @ConditionalOnMissingBean public ServerList ribbonServerList(IClientConfig config, - NacosDiscoveryProperties nacosDiscoveryProperties, - NacosServiceManager nacosServiceManager) { + NacosDiscoveryProperties nacosDiscoveryProperties) { if (this.propertiesFactory.isSet(ServerList.class, config.getClientName())) { ServerList serverList = this.propertiesFactory.get(ServerList.class, config, config.getClientName()); return serverList; } - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, - nacosServiceManager); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); serverList.initWithNiwsConfig(config); return serverList; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java index 1b9758815..55928f266 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.client.naming.utils.CollectionUtils; import com.netflix.client.config.IClientConfig; @@ -34,14 +33,10 @@ public class NacosServerList extends AbstractServerList { private NacosDiscoveryProperties discoveryProperties; - private NacosServiceManager nacosServiceManager; - private String serviceId; - public NacosServerList(NacosDiscoveryProperties discoveryProperties, - NacosServiceManager nacosServiceManager) { + public NacosServerList(NacosDiscoveryProperties discoveryProperties) { this.discoveryProperties = discoveryProperties; - this.nacosServiceManager = nacosServiceManager; } @Override @@ -57,8 +52,7 @@ public class NacosServerList extends AbstractServerList { private List getServers() { try { String group = discoveryProperties.getGroup(); - List instances = nacosServiceManager - .getNamingService(discoveryProperties.getNacosProperties()) + List instances = discoveryProperties.namingServiceInstance() .selectInstances(serviceId, group, true); return instancesToServerList(instances); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java index 7e56fb8ba..16887defb 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java @@ -57,8 +57,7 @@ public class NacosServerListTests { when(namingService.selectInstances(anyString(), eq("DEFAULT"), eq(true))) .thenReturn(null); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, - nacosServiceManager); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); List servers = serverList.getInitialListOfServers(); assertThat(servers).isEmpty(); } @@ -87,8 +86,7 @@ public class NacosServerListTests { IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, - nacosServiceManager); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getInitialListOfServers(); assertThat(servers).hasSize(1); @@ -125,8 +123,7 @@ public class NacosServerListTests { IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, - nacosServiceManager); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getInitialListOfServers(); assertThat(servers).hasSize(1); @@ -167,8 +164,7 @@ public class NacosServerListTests { IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, - nacosServiceManager); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getUpdatedListOfServers();