From 4d5b0fd191d97423aac4927a1f06ec4fae552bfa Mon Sep 17 00:00:00 2001 From: fangjian0423 Date: Sun, 29 Sep 2019 16:23:58 +0800 Subject: [PATCH 1/2] fix #936 --- .../DubboServiceMetadataRepository.java | 3 ++- .../registry/AbstractSpringCloudRegistry.java | 10 ++++++++-- .../dubbo/registry/SpringCloudRegistry.java | 7 +++++-- .../registry/SpringCloudRegistryFactory.java | 7 ++++++- .../service/DubboGenericServiceFactory.java | 19 ++++++++++++++++--- 5 files changed, 37 insertions(+), 9 deletions(-) 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 124989c3e..b8e3219a2 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 @@ -645,8 +645,9 @@ public class DubboServiceMetadataRepository dubboMetadataConfigServiceProxy.initProxy(serviceName, version); } - public void removeServiceMetadata(String serviceName) { + public void removeMetadata(String serviceName) { dubboRestServiceMetadataRepository.remove(serviceName); + subscribedDubboMetadataServiceURLs.remove(serviceName); } @Override 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 0d4c02576..6844f1425 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 @@ -26,6 +26,7 @@ import java.util.stream.Collectors; import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; import com.alibaba.cloud.dubbo.registry.event.ServiceInstancesChangedEvent; +import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; import com.alibaba.cloud.dubbo.service.DubboMetadataService; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; import com.alibaba.cloud.dubbo.util.JSONUtils; @@ -90,12 +91,15 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { private final JSONUtils jsonUtils; + private final DubboGenericServiceFactory dubboGenericServiceFactory; + private final ConfigurableApplicationContext applicationContext; public AbstractSpringCloudRegistry(URL url, DiscoveryClient discoveryClient, DubboServiceMetadataRepository dubboServiceMetadataRepository, DubboMetadataServiceProxy dubboMetadataConfigServiceProxy, - JSONUtils jsonUtils, ConfigurableApplicationContext applicationContext) { + JSONUtils jsonUtils, DubboGenericServiceFactory dubboGenericServiceFactory, + ConfigurableApplicationContext applicationContext) { super(url); this.servicesLookupInterval = url .getParameter(SERVICES_LOOKUP_INTERVAL_PARAM_NAME, 60L); @@ -103,6 +107,7 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { this.repository = dubboServiceMetadataRepository; this.dubboMetadataConfigServiceProxy = dubboMetadataConfigServiceProxy; this.jsonUtils = jsonUtils; + this.dubboGenericServiceFactory = dubboGenericServiceFactory; this.applicationContext = applicationContext; } @@ -220,7 +225,8 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { if (CollectionUtils.isEmpty(serviceInstances)) { dubboMetadataConfigServiceProxy.removeProxy(serviceName); repository.removeInitializedService(serviceName); - repository.removeServiceMetadata(serviceName); + repository.removeMetadata(serviceName); + dubboGenericServiceFactory.destroy(serviceName); if (logger.isWarnEnabled()) { logger.warn( "There is no instance from service[name : {}], and then Dubbo Service[key : {}] will not be " diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistry.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistry.java index c9caa957a..3e4a1a5c2 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistry.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistry.java @@ -17,6 +17,7 @@ package com.alibaba.cloud.dubbo.registry; import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; +import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; import com.alibaba.cloud.dubbo.util.JSONUtils; import org.apache.dubbo.common.URL; @@ -38,9 +39,11 @@ public class SpringCloudRegistry extends AbstractSpringCloudRegistry { public SpringCloudRegistry(URL url, DiscoveryClient discoveryClient, DubboServiceMetadataRepository dubboServiceMetadataRepository, DubboMetadataServiceProxy dubboMetadataConfigServiceProxy, - JSONUtils jsonUtils, ConfigurableApplicationContext applicationContext) { + JSONUtils jsonUtils, DubboGenericServiceFactory dubboGenericServiceFactory, + ConfigurableApplicationContext applicationContext) { super(url, discoveryClient, dubboServiceMetadataRepository, - dubboMetadataConfigServiceProxy, jsonUtils, applicationContext); + dubboMetadataConfigServiceProxy, jsonUtils, dubboGenericServiceFactory, + applicationContext); this.dubboServiceMetadataRepository = dubboServiceMetadataRepository; } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java index 08e460166..be13cb911 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java @@ -17,6 +17,7 @@ package com.alibaba.cloud.dubbo.registry; import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; +import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; import com.alibaba.cloud.dubbo.util.JSONUtils; import org.apache.dubbo.common.URL; @@ -62,6 +63,8 @@ public class SpringCloudRegistryFactory implements RegistryFactory { private JSONUtils jsonUtils; + private DubboGenericServiceFactory dubboGenericServiceFactory; + private volatile boolean initialized = false; public SpringCloudRegistryFactory() { @@ -82,6 +85,8 @@ public class SpringCloudRegistryFactory implements RegistryFactory { this.dubboMetadataConfigServiceProxy = applicationContext .getBean(DubboMetadataServiceProxy.class); this.jsonUtils = applicationContext.getBean(JSONUtils.class); + this.dubboGenericServiceFactory = applicationContext + .getBean(DubboGenericServiceFactory.class); } @Override @@ -89,7 +94,7 @@ public class SpringCloudRegistryFactory implements RegistryFactory { init(); return new SpringCloudRegistry(url, discoveryClient, dubboServiceMetadataRepository, dubboMetadataConfigServiceProxy, - jsonUtils, applicationContext); + jsonUtils, dubboGenericServiceFactory, applicationContext); } } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java index 5fcf8100b..9ddee6b3b 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java @@ -18,9 +18,11 @@ package com.alibaba.cloud.dubbo.service; import java.beans.PropertyEditorSupport; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -57,7 +59,7 @@ public class DubboGenericServiceFactory { private final Logger logger = LoggerFactory.getLogger(getClass()); - private final ConcurrentMap> cache = new ConcurrentHashMap<>(); + private final ConcurrentMap> cache = new ConcurrentHashMap<>(); @Autowired private ObjectProvider> registryConfigs; @@ -96,12 +98,13 @@ public class DubboGenericServiceFactory { Integer key = Objects.hash(interfaceName, version, group, dubboTranslatedAttributes); - return cache.computeIfAbsent(key, k -> { + return cache.computeIfAbsent(group + key, k -> { ReferenceBean referenceBean = new ReferenceBean<>(); referenceBean.setGeneric(true); referenceBean.setInterface(interfaceName); referenceBean.setVersion(version); referenceBean.setGroup(group); + referenceBean.setCheck(false); bindReferenceBean(referenceBean, dubboTranslatedAttributes); return referenceBean; }); @@ -149,7 +152,17 @@ public class DubboGenericServiceFactory { @PreDestroy public void destroy() { destroyReferenceBeans(); - cache.values(); + cache.clear(); + } + + public synchronized void destroy(String serviceName) { + Set removeGroups = new HashSet<>(cache.keySet()); + for (String key : removeGroups) { + if (key.contains(serviceName)) { + ReferenceBean referenceBean = cache.remove(key); + referenceBean.destroy(); + } + } } private void destroyReferenceBeans() { From 3b6220dd484a1ae967ed6592b89f5d2912a352d3 Mon Sep 17 00:00:00 2001 From: fangjian0423 Date: Sun, 29 Sep 2019 16:36:02 +0800 Subject: [PATCH 2/2] do some optimizations about GenericService --- .../repository/DubboServiceMetadataRepository.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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 b8e3219a2..7a78e4451 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 @@ -289,9 +289,7 @@ public class DubboServiceMetadataRepository serviceName); } - // Keep the order in following invocations initSubscribedDubboMetadataService(serviceName); - initDubboRestServiceMetadataRepository(serviceName); // mark this service name having been initialized initializedServices.add(serviceName); } @@ -392,9 +390,11 @@ public class DubboServiceMetadataRepository return emptyList(); } - return hasText(protocol) ? urls.stream() - .filter(url -> url.getProtocol().equalsIgnoreCase(protocol)) - .collect(Collectors.toList()) : unmodifiableList(urls); + return hasText(protocol) + ? urls.stream() + .filter(url -> url.getProtocol().equalsIgnoreCase(protocol)) + .collect(Collectors.toList()) + : unmodifiableList(urls); } /** @@ -630,6 +630,7 @@ public class DubboServiceMetadataRepository } }); }); + initDubboRestServiceMetadataRepository(serviceName); } private void initSubscribedDubboMetadataServiceURL(URL dubboMetadataServiceURL) {