diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java index 2c48be6df..e0a7a4877 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java @@ -43,7 +43,6 @@ import java.util.stream.Stream; import javax.annotation.PostConstruct; import org.apache.dubbo.common.URL; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.SmartInitializingSingleton; @@ -70,6 +69,7 @@ import com.alibaba.cloud.dubbo.service.DubboMetadataService; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceExporter; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; import com.alibaba.cloud.dubbo.util.JSONUtils; + import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.TypeFactory; @@ -291,6 +291,16 @@ public class DubboServiceMetadataRepository } } + /** + * Remove the metadata of Dubbo Services if no there is no service instance + * @param serviceName the service name + */ + public void removeInitializedService(String serviceName) { + synchronized (monitor) { + initializedServices.remove(serviceName); + } + } + /** * Get the metadata {@link Map} of {@link DubboMetadataService} * @@ -565,7 +575,7 @@ public class DubboServiceMetadataRepository if (object == null) { if (logger.isWarnEnabled()) { logger.warn( - "DubboServiceMetadata can't be found in the Spring application [%s] and %s", + "DubboServiceMetadata can't be found in the Spring application [{}] and {}", serviceName, requestMetadata); } } @@ -640,6 +650,10 @@ public class DubboServiceMetadataRepository dubboMetadataConfigServiceProxy.initProxy(serviceName, version); } + public void removeServiceMetadata(String serviceName) { + dubboRestServiceMetadataRepository.remove(serviceName); + } + @Override public void setApplicationEventPublisher( ApplicationEventPublisher applicationEventPublisher) { diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java index 922553ab8..a223e9632 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java @@ -40,7 +40,6 @@ import org.apache.dubbo.common.URL; import org.apache.dubbo.registry.NotifyListener; import org.apache.dubbo.registry.RegistryFactory; import org.apache.dubbo.registry.support.FailbackRegistry; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.client.ServiceInstance; @@ -215,6 +214,33 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { generateId(url), serviceName); } + List allSubscribedURLs = new LinkedList<>(); + + Collection serviceInstances = serviceInstancesFunction + .apply(serviceName); + + if (CollectionUtils.isEmpty(serviceInstances)) { + dubboMetadataConfigServiceProxy.removeProxy(serviceName); + repository.removeInitializedService(serviceName); + repository.removeServiceMetadata(serviceName); + if (logger.isWarnEnabled()) { + logger.warn( + "There is no instance from service[name : {}], and then Dubbo Service[key : {}] will not be " + + "available , please make sure the further impact", + serviceName, url.getServiceKey()); + } + /** + * URLs with {@link RegistryConstants#EMPTY_PROTOCOL} + */ + allSubscribedURLs.addAll(emptyURLs(url)); + if (logger.isDebugEnabled()) { + logger.debug("The subscribed URL[{}] will notify all URLs : {}", url, + allSubscribedURLs); + } + listener.notify(allSubscribedURLs); + return; + } + DubboMetadataService dubboMetadataService = dubboMetadataConfigServiceProxy .getProxy(serviceName); @@ -239,50 +265,30 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { return; } - Collection serviceInstances = serviceInstancesFunction - .apply(serviceName); - - List allSubscribedURLs = new LinkedList<>(); - - if (CollectionUtils.isEmpty(serviceInstances)) { - if (logger.isWarnEnabled()) { - logger.warn( - "There is no instance from service[name : {}], and then Dubbo Service[key : {}] will not be " - + "available , please make sure the further impact", - serviceName, url.getServiceKey()); - } - /** - * URLs with {@link RegistryConstants#EMPTY_PROTOCOL} - */ - allSubscribedURLs.addAll(emptyURLs(url)); - } - else { - List exportedURLs = getExportedURLs(dubboMetadataService, url); - - for (URL exportedURL : exportedURLs) { - String protocol = exportedURL.getProtocol(); - List subscribedURLs = new LinkedList<>(); - serviceInstances.forEach(serviceInstance -> { - Integer port = repository.getDubboProtocolPort(serviceInstance, - protocol); - String host = serviceInstance.getHost(); - if (port == null) { - if (logger.isWarnEnabled()) { - logger.warn( - "The protocol[{}] port of Dubbo service instance[host : {}] " - + "can't be resolved", - protocol, host); - } - } - else { - URL subscribedURL = new URL(protocol, host, port, - exportedURL.getParameters()); - subscribedURLs.add(subscribedURL); + List exportedURLs = getExportedURLs(dubboMetadataService, url); + + for (URL exportedURL : exportedURLs) { + String protocol = exportedURL.getProtocol(); + List subscribedURLs = new LinkedList<>(); + serviceInstances.forEach(serviceInstance -> { + Integer port = repository.getDubboProtocolPort(serviceInstance, protocol); + String host = serviceInstance.getHost(); + if (port == null) { + if (logger.isWarnEnabled()) { + logger.warn( + "The protocol[{}] port of Dubbo service instance[host : {}] " + + "can't be resolved", + protocol, host); } - }); - - allSubscribedURLs.addAll(subscribedURLs); - } + } + else { + URL subscribedURL = new URL(protocol, host, port, + exportedURL.getParameters()); + subscribedURLs.add(subscribedURL); + } + }); + + allSubscribedURLs.addAll(subscribedURLs); } if (logger.isDebugEnabled()) { diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java index 21c019c23..1c13a23fc 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java @@ -52,6 +52,14 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab name -> newProxy(name, version)); } + /** + * Remove {@link DubboMetadataService}'s Proxy by service name + * @param serviceName the service name + */ + public void removeProxy(String serviceName) { + dubboMetadataServiceCache.remove(serviceName); + } + /** * Get a proxy instance of {@link DubboMetadataService} via the specified service name *