Skip to content

Commit

Permalink
Refactor ConfigManager (#4804)
Browse files Browse the repository at this point in the history
* Polish #4542 : [Enhancement] Adapt the Java standard Event/Listener mechanism

* Polish #4541 : [Feature] Add local File System DynamicConfigurationFactory‘s extension

* Polish #4541 : Bugfix

* Polish #4541 : Optimization

* Polish #4541 : Add the compatibility for PollingWatchService on the some platforms

* Polish #4541 : Add delay publish without ThreadPoolExecutor

* Polish #4541 : Refactor the extension name

* Polish #4541 : Add remove ops

* Polish #4541 : Add testable constructor

* Polish #4541 : Add getConfigGroups method

* Polish #4610 : [Refactor] Refactor the bootstrap module

* Polish #4541 : Fix the nulling URL issue

* Polish #4622 : [Refactor] Refactor ConfigManager

* Polish #4622 : [Refactor] Refactor ConfigManager

* Polish #4622 : Support multiple configcenters

* Polish #4671 : ServiceNameMapping will not map the group, version and protocol

* update referenceCount log (#4683)

Add comments to support multiple shared connections

* Polish /#4687 : Remove the duplicated test code in dubbo-config-spring (#4688)

* #4685  修改代码if判断false问题 if (hasException == false)修改成if (!hasException) (#4695)

* Fixed Service annotation method parameters are not in effect (#4598)

* keep demo simple, and switch to use zookeeper as registry center (#4705)

* keep demo simple, and switch to use zookeeper as registry center

* remove comment

* @reference auto-wires the instance of generic interface #4594 (#4677)

* try to shorten maven output to make travis build pass (#4710)

* use CountDownLatch to check zk registry if establish connection (#4589)

* Minor change

* Rename the extension name of WritableMetadataService

* Polish #4759 : [Refactor] Change the signature of methods of MetadataService #4759

* Merge remote-tracking branch 'upstream/master' into dubbo-cloud-native

# Conflicts:
#	dubbo-all/pom.xml
#	dubbo-bom/pom.xml
#	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
#	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
#	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
#	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
#	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryConfig.java
#	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
#	dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
#	dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java
#	dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java
#	dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java
#	dubbo-configcenter/dubbo-configcenter-etcd/src/test/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfigurationTest.java
#	dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
#	dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java
#	dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
#	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java
#	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
#	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
#	dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java
#	dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java
#	dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java
#	dubbo-metadata/pom.xml
#	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java
#	dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java
#	dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistryFactory.java
#	dubbo-rpc/dubbo-rpc-xml/src/main/java/org/apache/dubbo/xml/rpc/protocol/xmlrpc/XmlRpcProtocol.java

* Polish #3984 : Add the implementation of Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly)

* Code merge

* Fix the cases

* Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native

# Conflicts:
#	dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java
#	dubbo-metadata/dubbo-metadata-definition-protobuf/pom.xml
#	dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java
#	dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java
#	dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java

* Refactor ConfigManager

* Refactor ConfigManager

* Resolve the issues on ConfigManager

* Refactor and add test-cases for ConfigManager
  • Loading branch information
mercyblitz committed Aug 13, 2019
1 parent 932cace commit ade0caf
Show file tree
Hide file tree
Showing 5 changed files with 263 additions and 73 deletions.
Expand Up @@ -51,9 +51,7 @@
import org.apache.dubbo.config.utils.ReferenceConfigCache;
import org.apache.dubbo.event.EventDispatcher;
import org.apache.dubbo.event.EventListener;
import org.apache.dubbo.metadata.WritableMetadataService;
import org.apache.dubbo.metadata.report.MetadataReportInstance;
import org.apache.dubbo.metadata.store.RemoteWritableMetadataService;
import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;
import org.apache.dubbo.registry.client.DefaultServiceInstance;
import org.apache.dubbo.registry.client.ServiceDiscovery;
Expand Down Expand Up @@ -517,7 +515,7 @@ public DubboBootstrap start() {
exportServices();

// Not only provider register and some services are exported
if (!onlyRegisterProvider && !configManager.getServiceConfigs().isEmpty()) {
if (!onlyRegisterProvider && !configManager.getServices().isEmpty()) {
/**
* export {@link MetadataService}
*/
Expand Down Expand Up @@ -718,7 +716,7 @@ private List<URL> exportMetadataService(ApplicationConfig applicationConfig,
}

private void exportServices() {
configManager.getServiceConfigs().forEach(this::exportServiceConfig);
configManager.getServices().forEach(this::exportServiceConfig);
}

public void exportServiceConfig(ServiceConfig<?> serviceConfig) {
Expand All @@ -729,7 +727,7 @@ private void referServices() {
if (cache == null) {
cache = ReferenceConfigCache.getCache();
}
configManager.getReferenceConfigs().forEach(cache::get);
configManager.getReferences().forEach(cache::get);
}

public boolean isOnlyRegisterProvider() {
Expand Down Expand Up @@ -816,7 +814,7 @@ private void destroyProtocolConfigs() {
}

private void destroyReferenceConfigs() {
configManager.getReferenceConfigs().forEach(ReferenceConfig::destroy);
configManager.getReferences().forEach(ReferenceConfig::destroy);
if (logger.isDebugEnabled()) {
logger.debug(NAME + "'s all ReferenceConfigs have been destroyed.");
}
Expand Down
Expand Up @@ -41,7 +41,7 @@ public static void main(String[] args) throws Exception {

ConfigManager configManager = ConfigManager.getInstance();

ReferenceConfig<EchoService> referenceConfig = configManager.getReferenceConfig("ref");
ReferenceConfig<EchoService> referenceConfig = configManager.getReference("ref");

EchoService echoService = referenceConfig.get();

Expand Down
Expand Up @@ -40,6 +40,7 @@
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand Down Expand Up @@ -638,7 +639,7 @@ public boolean equals(Object obj) {
Method method2 = obj.getClass().getMethod(method1.getName(), method1.getParameterTypes());
Object value1 = method1.invoke(this, new Object[]{});
Object value2 = method2.invoke(obj, new Object[]{});
if ((value1 != null && value2 != null) && !value1.equals(value2)) {
if (!Objects.equals(value1, value2)) {
return false;
}
} catch (Exception e) {
Expand Down
Expand Up @@ -117,56 +117,6 @@ public Optional<ApplicationConfig> getApplication() {
return ofNullable(getConfig(ApplicationConfig.class));
}

/**
* Add the dubbo {@link AbstractConfig config}
*
* @param config the dubbo {@link AbstractConfig config}
*/
public void addConfig(AbstractConfig config) {
addConfig(config, false);
}

protected void addConfig(AbstractConfig config, boolean unique) {
if (config == null) {
return;
}
Class<? extends AbstractConfig> configType = config.getClass();
write(() -> {
Map<String, AbstractConfig> configsMap = configsCache.computeIfAbsent(configType, type -> newMap());
addIfAbsent(config, configsMap, unique);
});
}

protected <C extends AbstractConfig> Map<String, C> getConfigsMap(Class<? extends C> configType) {
return read(() -> (Map) configsCache.getOrDefault(configType, emptyMap()));
}

protected <C extends AbstractConfig> Collection<C> getConfigs(Class<C> configType) {
return read(() -> getConfigsMap(configType).values());
}

protected <C extends AbstractConfig> C getConfig(Class<C> configType, String id) {
return read(() -> {
Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());
return configsMap.get(id);
});
}

protected <C extends AbstractConfig> C getConfig(Class<C> configType) throws IllegalStateException {
return read(() -> {
Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());
int size = configsMap.size();
if (size < 1) {
// throw new IllegalStateException("No such " + configType.getName() + " is found");
return null;
} else if (size > 1) {
throw new IllegalStateException("The expected single matching " + configType.getName() + " but found " + size + " instances");
} else {
return configsMap.values().iterator().next();
}
});
}

// MonitorConfig correlative methods

public void setMonitor(MonitorConfig monitor) {
Expand All @@ -181,7 +131,6 @@ public Optional<MonitorConfig> getMonitor() {

public void setModule(ModuleConfig module) {
addConfig(module, true);

}

public Optional<ModuleConfig> getModule() {
Expand Down Expand Up @@ -234,6 +183,10 @@ public void addProvider(ProviderConfig providerConfig) {
addConfig(providerConfig);
}

public void addProviders(Iterable<ProviderConfig> providerConfigs) {
providerConfigs.forEach(this::addProvider);
}

public Optional<ProviderConfig> getProvider(String id) {
return ofNullable(getConfig(ProviderConfig.class, id));
}
Expand All @@ -252,6 +205,10 @@ public void addConsumer(ConsumerConfig consumerConfig) {
addConfig(consumerConfig);
}

public void addConsumers(Iterable<ConsumerConfig> consumerConfigs) {
consumerConfigs.forEach(this::addConsumer);
}

public Optional<ConsumerConfig> getConsumer(String id) {
return ofNullable(getConfig(ConsumerConfig.class, id));
}
Expand Down Expand Up @@ -341,11 +298,15 @@ public void addService(ServiceConfig<?> serviceConfig) {
addConfig(serviceConfig);
}

public Collection<ServiceConfig> getServiceConfigs() {
public void addServices(Iterable<ServiceConfig<?>> serviceConfigs) {
serviceConfigs.forEach(this::addService);
}

public Collection<ServiceConfig> getServices() {
return getConfigs(ServiceConfig.class);
}

public <T> ServiceConfig<T> getServiceConfig(String id) {
public <T> ServiceConfig<T> getService(String id) {
return getConfig(ServiceConfig.class, id);
}

Expand All @@ -355,11 +316,15 @@ public void addReference(ReferenceConfig<?> referenceConfig) {
addConfig(referenceConfig);
}

public Collection<ReferenceConfig> getReferenceConfigs() {
public void addReferences(Iterable<ReferenceConfig<?>> referenceConfigs) {
referenceConfigs.forEach(this::addReference);
}

public Collection<ReferenceConfig> getReferences() {
return getConfigs(ReferenceConfig.class);
}

public <T> ReferenceConfig<T> getReferenceConfig(String id) {
public <T> ReferenceConfig<T> getReference(String id) {
return getConfig(ReferenceConfig.class, id);
}

Expand Down Expand Up @@ -393,7 +358,57 @@ public void clear() {
});
}

private <C extends AbstractConfig> Collection<String> getConfigIds(Class<C> configType) {
/**
* Add the dubbo {@link AbstractConfig config}
*
* @param config the dubbo {@link AbstractConfig config}
*/
public void addConfig(AbstractConfig config) {
addConfig(config, false);
}

protected void addConfig(AbstractConfig config, boolean unique) {
if (config == null) {
return;
}
Class<? extends AbstractConfig> configType = config.getClass();
write(() -> {
Map<String, AbstractConfig> configsMap = configsCache.computeIfAbsent(configType, type -> newMap());
addIfAbsent(config, configsMap, unique);
});
}

protected <C extends AbstractConfig> Map<String, C> getConfigsMap(Class<? extends C> configType) {
return read(() -> (Map) configsCache.getOrDefault(configType, emptyMap()));
}

protected <C extends AbstractConfig> Collection<C> getConfigs(Class<C> configType) {
return read(() -> getConfigsMap(configType).values());
}

protected <C extends AbstractConfig> C getConfig(Class<C> configType, String id) {
return read(() -> {
Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());
return configsMap.get(id);
});
}

protected <C extends AbstractConfig> C getConfig(Class<C> configType) throws IllegalStateException {
return read(() -> {
Map<String, C> configsMap = (Map) configsCache.getOrDefault(configType, emptyMap());
int size = configsMap.size();
if (size < 1) {
// throw new IllegalStateException("No such " + configType.getName() + " is found");
return null;
} else if (size > 1) {
throw new IllegalStateException("The expected single matching " + configType.getName() + " but found " + size + " instances");
} else {
return configsMap.values().iterator().next();
}
});
}

protected <C extends AbstractConfig> Collection<String> getConfigIds(Class<C> configType) {
return getConfigs(configType)
.stream()
.map(AbstractConfig::getId)
Expand All @@ -406,8 +421,10 @@ private <V> V write(Callable<V> callable) {
try {
writeLock.lock();
value = callable.call();
} catch (RuntimeException e) {
throw e;
} catch (Throwable e) {
throw new RuntimeException(e);
throw new RuntimeException(e.getCause());
} finally {
writeLock.unlock();
}
Expand All @@ -421,12 +438,9 @@ private void write(Runnable runnable) {
});
}


private <V> V read(Callable<V> callable) {
Lock readLock = lock.readLock();

V value = null;

try {
readLock.lock();
value = callable.call();
Expand All @@ -435,7 +449,6 @@ private <V> V read(Callable<V> callable) {
} finally {
readLock.unlock();
}

return value;
}

Expand Down

0 comments on commit ade0caf

Please sign in to comment.