From 702831cb8fea9520db6890ad5a1e5f4b7c52cc0c Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Sun, 13 Sep 2020 18:02:36 +0800 Subject: [PATCH] fix --- .../cloud/nacos/NacosDiscoveryProperties.java | 18 +++------ .../cloud/nacos/NacosServiceManager.java | 24 +++++++++++- .../NacosDiscoveryInfoInitializedEvent.java | 38 +++++++++++++++++++ 3 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java 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 f3297e8a..3c8c01c8 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 @@ -23,14 +23,13 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.PostConstruct; -import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; +import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoInitializedEvent; import com.alibaba.nacos.api.naming.PreservedMetadataKeys; import com.alibaba.nacos.client.naming.utils.UtilAndComs; import com.alibaba.spring.util.PropertySourcesUtils; @@ -41,6 +40,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; @@ -213,10 +213,7 @@ public class NacosDiscoveryProperties { private Environment environment; @Autowired - private NacosServiceManager nacosServiceManager; - - @Autowired - private Optional nacosAutoServiceRegistrationOptional; + private ApplicationEventPublisher applicationEventPublisher; @PostConstruct public void init() throws Exception { @@ -267,13 +264,8 @@ public class NacosDiscoveryProperties { this.overrideFromEnv(environment); - nacosAutoServiceRegistrationOptional.ifPresent(nacosAutoServiceRegistration -> { - if (nacosServiceManager.isNacosDiscoveryInfoChanged(this)) { - nacosAutoServiceRegistration.stop(); - nacosServiceManager.reBuildNacosService(getNacosProperties()); - nacosAutoServiceRegistration.start(); - } - }); + applicationEventPublisher + .publishEvent(new NacosDiscoveryInfoInitializedEvent(this)); } 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 bedb4e2c..9dfc8323 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,13 +17,17 @@ 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.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; @@ -43,6 +47,9 @@ public class NacosServiceManager { private NamingMaintainService namingMaintainService; + @Autowired + private Optional nacosAutoServiceRegistrationOptional; + public NamingService getNamingService(Properties properties) { if (Objects.isNull(this.namingService)) { buildNamingService(properties); @@ -107,7 +114,7 @@ public class NacosServiceManager { } } - public void reBuildNacosService(Properties nacosProperties) { + private void reBuildNacosService(Properties nacosProperties) { namingService = createNewNamingService(nacosProperties); namingMaintainService = createNamingMaintainService(nacosProperties); } @@ -130,4 +137,19 @@ 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/NacosDiscoveryInfoInitializedEvent.java new file mode 100644 index 00000000..0cca5718 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.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 NacosDiscoveryInfoInitializedEvent extends ApplicationEvent { + + public NacosDiscoveryInfoInitializedEvent( + NacosDiscoveryProperties nacosDiscoveryProperties) { + super(nacosDiscoveryProperties); + } + + @Override + public NacosDiscoveryProperties getSource() { + return (NacosDiscoveryProperties) super.getSource(); + } + +}