Merge pull request #973 from fangjian0423/master

Some optimizations about Dubbo Spring Cloud
pull/985/head
format 5 years ago committed by GitHub
commit 3c8596248e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -289,9 +289,7 @@ public class DubboServiceMetadataRepository
serviceName); serviceName);
} }
// Keep the order in following invocations
initSubscribedDubboMetadataService(serviceName); initSubscribedDubboMetadataService(serviceName);
initDubboRestServiceMetadataRepository(serviceName);
// mark this service name having been initialized // mark this service name having been initialized
initializedServices.add(serviceName); initializedServices.add(serviceName);
} }
@ -392,9 +390,11 @@ public class DubboServiceMetadataRepository
return emptyList(); return emptyList();
} }
return hasText(protocol) ? urls.stream() return hasText(protocol)
? urls.stream()
.filter(url -> url.getProtocol().equalsIgnoreCase(protocol)) .filter(url -> url.getProtocol().equalsIgnoreCase(protocol))
.collect(Collectors.toList()) : unmodifiableList(urls); .collect(Collectors.toList())
: unmodifiableList(urls);
} }
/** /**
@ -630,6 +630,7 @@ public class DubboServiceMetadataRepository
} }
}); });
}); });
initDubboRestServiceMetadataRepository(serviceName);
} }
private void initSubscribedDubboMetadataServiceURL(URL dubboMetadataServiceURL) { private void initSubscribedDubboMetadataServiceURL(URL dubboMetadataServiceURL) {
@ -645,8 +646,9 @@ public class DubboServiceMetadataRepository
dubboMetadataConfigServiceProxy.initProxy(serviceName, version); dubboMetadataConfigServiceProxy.initProxy(serviceName, version);
} }
public void removeServiceMetadata(String serviceName) { public void removeMetadata(String serviceName) {
dubboRestServiceMetadataRepository.remove(serviceName); dubboRestServiceMetadataRepository.remove(serviceName);
subscribedDubboMetadataServiceURLs.remove(serviceName);
} }
@Override @Override

@ -26,6 +26,7 @@ import java.util.stream.Collectors;
import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository;
import com.alibaba.cloud.dubbo.registry.event.ServiceInstancesChangedEvent; 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.DubboMetadataService;
import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy;
import com.alibaba.cloud.dubbo.util.JSONUtils; import com.alibaba.cloud.dubbo.util.JSONUtils;
@ -90,12 +91,15 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry {
private final JSONUtils jsonUtils; private final JSONUtils jsonUtils;
private final DubboGenericServiceFactory dubboGenericServiceFactory;
private final ConfigurableApplicationContext applicationContext; private final ConfigurableApplicationContext applicationContext;
public AbstractSpringCloudRegistry(URL url, DiscoveryClient discoveryClient, public AbstractSpringCloudRegistry(URL url, DiscoveryClient discoveryClient,
DubboServiceMetadataRepository dubboServiceMetadataRepository, DubboServiceMetadataRepository dubboServiceMetadataRepository,
DubboMetadataServiceProxy dubboMetadataConfigServiceProxy, DubboMetadataServiceProxy dubboMetadataConfigServiceProxy,
JSONUtils jsonUtils, ConfigurableApplicationContext applicationContext) { JSONUtils jsonUtils, DubboGenericServiceFactory dubboGenericServiceFactory,
ConfigurableApplicationContext applicationContext) {
super(url); super(url);
this.servicesLookupInterval = url this.servicesLookupInterval = url
.getParameter(SERVICES_LOOKUP_INTERVAL_PARAM_NAME, 60L); .getParameter(SERVICES_LOOKUP_INTERVAL_PARAM_NAME, 60L);
@ -103,6 +107,7 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry {
this.repository = dubboServiceMetadataRepository; this.repository = dubboServiceMetadataRepository;
this.dubboMetadataConfigServiceProxy = dubboMetadataConfigServiceProxy; this.dubboMetadataConfigServiceProxy = dubboMetadataConfigServiceProxy;
this.jsonUtils = jsonUtils; this.jsonUtils = jsonUtils;
this.dubboGenericServiceFactory = dubboGenericServiceFactory;
this.applicationContext = applicationContext; this.applicationContext = applicationContext;
} }
@ -220,7 +225,8 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry {
if (CollectionUtils.isEmpty(serviceInstances)) { if (CollectionUtils.isEmpty(serviceInstances)) {
dubboMetadataConfigServiceProxy.removeProxy(serviceName); dubboMetadataConfigServiceProxy.removeProxy(serviceName);
repository.removeInitializedService(serviceName); repository.removeInitializedService(serviceName);
repository.removeServiceMetadata(serviceName); repository.removeMetadata(serviceName);
dubboGenericServiceFactory.destroy(serviceName);
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
logger.warn( logger.warn(
"There is no instance from service[name : {}], and then Dubbo Service[key : {}] will not be " "There is no instance from service[name : {}], and then Dubbo Service[key : {}] will not be "

@ -17,6 +17,7 @@
package com.alibaba.cloud.dubbo.registry; package com.alibaba.cloud.dubbo.registry;
import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; 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.service.DubboMetadataServiceProxy;
import com.alibaba.cloud.dubbo.util.JSONUtils; import com.alibaba.cloud.dubbo.util.JSONUtils;
import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URL;
@ -38,9 +39,11 @@ public class SpringCloudRegistry extends AbstractSpringCloudRegistry {
public SpringCloudRegistry(URL url, DiscoveryClient discoveryClient, public SpringCloudRegistry(URL url, DiscoveryClient discoveryClient,
DubboServiceMetadataRepository dubboServiceMetadataRepository, DubboServiceMetadataRepository dubboServiceMetadataRepository,
DubboMetadataServiceProxy dubboMetadataConfigServiceProxy, DubboMetadataServiceProxy dubboMetadataConfigServiceProxy,
JSONUtils jsonUtils, ConfigurableApplicationContext applicationContext) { JSONUtils jsonUtils, DubboGenericServiceFactory dubboGenericServiceFactory,
ConfigurableApplicationContext applicationContext) {
super(url, discoveryClient, dubboServiceMetadataRepository, super(url, discoveryClient, dubboServiceMetadataRepository,
dubboMetadataConfigServiceProxy, jsonUtils, applicationContext); dubboMetadataConfigServiceProxy, jsonUtils, dubboGenericServiceFactory,
applicationContext);
this.dubboServiceMetadataRepository = dubboServiceMetadataRepository; this.dubboServiceMetadataRepository = dubboServiceMetadataRepository;
} }

@ -17,6 +17,7 @@
package com.alibaba.cloud.dubbo.registry; package com.alibaba.cloud.dubbo.registry;
import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; 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.service.DubboMetadataServiceProxy;
import com.alibaba.cloud.dubbo.util.JSONUtils; import com.alibaba.cloud.dubbo.util.JSONUtils;
import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URL;
@ -62,6 +63,8 @@ public class SpringCloudRegistryFactory implements RegistryFactory {
private JSONUtils jsonUtils; private JSONUtils jsonUtils;
private DubboGenericServiceFactory dubboGenericServiceFactory;
private volatile boolean initialized = false; private volatile boolean initialized = false;
public SpringCloudRegistryFactory() { public SpringCloudRegistryFactory() {
@ -82,6 +85,8 @@ public class SpringCloudRegistryFactory implements RegistryFactory {
this.dubboMetadataConfigServiceProxy = applicationContext this.dubboMetadataConfigServiceProxy = applicationContext
.getBean(DubboMetadataServiceProxy.class); .getBean(DubboMetadataServiceProxy.class);
this.jsonUtils = applicationContext.getBean(JSONUtils.class); this.jsonUtils = applicationContext.getBean(JSONUtils.class);
this.dubboGenericServiceFactory = applicationContext
.getBean(DubboGenericServiceFactory.class);
} }
@Override @Override
@ -89,7 +94,7 @@ public class SpringCloudRegistryFactory implements RegistryFactory {
init(); init();
return new SpringCloudRegistry(url, discoveryClient, return new SpringCloudRegistry(url, discoveryClient,
dubboServiceMetadataRepository, dubboMetadataConfigServiceProxy, dubboServiceMetadataRepository, dubboMetadataConfigServiceProxy,
jsonUtils, applicationContext); jsonUtils, dubboGenericServiceFactory, applicationContext);
} }
} }

@ -18,9 +18,11 @@ package com.alibaba.cloud.dubbo.service;
import java.beans.PropertyEditorSupport; import java.beans.PropertyEditorSupport;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
@ -57,7 +59,7 @@ public class DubboGenericServiceFactory {
private final Logger logger = LoggerFactory.getLogger(getClass()); private final Logger logger = LoggerFactory.getLogger(getClass());
private final ConcurrentMap<Integer, ReferenceBean<GenericService>> cache = new ConcurrentHashMap<>(); private final ConcurrentMap<String, ReferenceBean<GenericService>> cache = new ConcurrentHashMap<>();
@Autowired @Autowired
private ObjectProvider<List<RegistryConfig>> registryConfigs; private ObjectProvider<List<RegistryConfig>> registryConfigs;
@ -96,12 +98,13 @@ public class DubboGenericServiceFactory {
Integer key = Objects.hash(interfaceName, version, group, Integer key = Objects.hash(interfaceName, version, group,
dubboTranslatedAttributes); dubboTranslatedAttributes);
return cache.computeIfAbsent(key, k -> { return cache.computeIfAbsent(group + key, k -> {
ReferenceBean<GenericService> referenceBean = new ReferenceBean<>(); ReferenceBean<GenericService> referenceBean = new ReferenceBean<>();
referenceBean.setGeneric(true); referenceBean.setGeneric(true);
referenceBean.setInterface(interfaceName); referenceBean.setInterface(interfaceName);
referenceBean.setVersion(version); referenceBean.setVersion(version);
referenceBean.setGroup(group); referenceBean.setGroup(group);
referenceBean.setCheck(false);
bindReferenceBean(referenceBean, dubboTranslatedAttributes); bindReferenceBean(referenceBean, dubboTranslatedAttributes);
return referenceBean; return referenceBean;
}); });
@ -149,7 +152,17 @@ public class DubboGenericServiceFactory {
@PreDestroy @PreDestroy
public void destroy() { public void destroy() {
destroyReferenceBeans(); destroyReferenceBeans();
cache.values(); cache.clear();
}
public synchronized void destroy(String serviceName) {
Set<String> removeGroups = new HashSet<>(cache.keySet());
for (String key : removeGroups) {
if (key.contains(serviceName)) {
ReferenceBean<GenericService> referenceBean = cache.remove(key);
referenceBean.destroy();
}
}
} }
private void destroyReferenceBeans() { private void destroyReferenceBeans() {

Loading…
Cancel
Save