mirror of
https://gitee.com/mirrors/Spring-Cloud-Alibaba.git
synced 2021-06-26 13:25:11 +08:00
Merge pull request #973 from fangjian0423/master
Some optimizations about Dubbo Spring Cloud
This commit is contained in:
commit
3c8596248e
@ -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) {
|
||||
@ -645,8 +646,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
|
||||
|
@ -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 "
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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<Integer, ReferenceBean<GenericService>> cache = new ConcurrentHashMap<>();
|
||||
private final ConcurrentMap<String, ReferenceBean<GenericService>> cache = new ConcurrentHashMap<>();
|
||||
|
||||
@Autowired
|
||||
private ObjectProvider<List<RegistryConfig>> 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<GenericService> 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<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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user