Skip to content

Commit

Permalink
Polish apache#4622 : [Refactor] Refactor ConfigManager
Browse files Browse the repository at this point in the history
  • Loading branch information
mercyblitz committed Jul 25, 2019
1 parent 3218a1f commit d5c78ac
Show file tree
Hide file tree
Showing 12 changed files with 557 additions and 275 deletions.
6 changes: 6 additions & 0 deletions dubbo-bootstrap/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,12 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-test</artifactId>
<scope>test</scope>
</dependency>

</dependencies>

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand Down Expand Up @@ -149,7 +150,7 @@ public DubboBootstrap metadataReport(MetadataReportConfig metadataReportConfig)
}

public DubboBootstrap metadataReport(List<MetadataReportConfig> metadataReportConfigs) {
configManager.addMetadataReport(metadataReportConfigs);
configManager.addMetadataReports(metadataReportConfigs);
return this;
}

Expand Down Expand Up @@ -193,22 +194,48 @@ public DubboBootstrap application(ApplicationConfig applicationConfig) {

// {@link RegistryConfig} correlative methods

/**
* Add an instance of {@link RegistryConfig} with {@link #DEFAULT_REGISTRY_ID default ID}
*
* @param consumerBuilder the {@link Consumer} of {@link RegistryBuilder}
* @return current {@link DubboBootstrap} instance
*/
public DubboBootstrap registry(Consumer<RegistryBuilder> consumerBuilder) {
return registry(DEFAULT_REGISTRY_ID, consumerBuilder);
}

/**
* Add an instance of {@link RegistryConfig} with the specified ID
*
* @param id the {@link RegistryConfig#getId() id} of {@link RegistryConfig}
* @param consumerBuilder the {@link Consumer} of {@link RegistryBuilder}
* @return current {@link DubboBootstrap} instance
*/
public DubboBootstrap registry(String id, Consumer<RegistryBuilder> consumerBuilder) {
RegistryBuilder builder = createRegistryBuilder(id);
consumerBuilder.accept(builder);
return registry(builder.build());
}

/**
* Add an instance of {@link RegistryConfig}
*
* @param registryConfig an instance of {@link RegistryConfig}
* @return current {@link DubboBootstrap} instance
*/
public DubboBootstrap registry(RegistryConfig registryConfig) {
return registries(asList(registryConfig));
configManager.addRegistry(registryConfig);
return this;
}

public DubboBootstrap registries(List<RegistryConfig> registryConfigs) {
configManager.addRegistries(registryConfigs, true);
/**
* Add an instance of {@link RegistryConfig}
*
* @param registryConfigs the multiple instances of {@link RegistryConfig}
* @return current {@link DubboBootstrap} instance
*/
public DubboBootstrap registries(Iterable<RegistryConfig> registryConfigs) {
registryConfigs.forEach(this::registry);
return this;
}

Expand Down Expand Up @@ -315,7 +342,7 @@ public DubboBootstrap configCenter(ConfigCenterConfig configCenterConfig) {
}

public DubboBootstrap configCenter(List<ConfigCenterConfig> configCenterConfigs) {
configManager.addConfigCenter(configCenterConfigs);
configManager.addConfigCenters(configCenterConfigs);
return this;
}

Expand Down Expand Up @@ -358,7 +385,7 @@ private void loadRemoteConfigs() {
}
});

configManager.addRegistries(tmpRegistries, true);
configManager.addRegistries(tmpRegistries);

// protocol ids to protocol configs
List<ProtocolConfig> tmpProtocols = new ArrayList<>();
Expand All @@ -382,22 +409,20 @@ private void loadRemoteConfigs() {
* there's no config center specified explicitly.
*/
private void useRegistryAsConfigCenterIfNecessary() {
configManager.getDefaultRegistries().ifPresent(registryConfigs -> {
for (RegistryConfig registryConfig : registryConfigs) {
if (registryConfig != null && registryConfig.isZookeeperProtocol()) {
// we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated.
Environment.getInstance().getDynamicConfiguration().orElseGet(() -> {
Set<ConfigCenterConfig> configCenters = configManager.getConfigCenters();
if (CollectionUtils.isEmpty(configCenters)) {
ConfigCenterConfig cc = new ConfigCenterConfig();
cc.setProtocol(registryConfig.getProtocol());
cc.setAddress(registryConfig.getAddress());
cc.setHighestPriority(false);
configManager.addConfigCenter(cc);
}
return null;
});
}
configManager.getDefaultRegistries().forEach(registryConfig -> {
if (registryConfig != null && registryConfig.isZookeeperProtocol()) {
// we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated.
Environment.getInstance().getDynamicConfiguration().orElseGet(() -> {
Collection<ConfigCenterConfig> configCenters = configManager.getConfigCenters();
if (CollectionUtils.isEmpty(configCenters)) {
ConfigCenterConfig cc = new ConfigCenterConfig();
cc.setProtocol(registryConfig.getProtocol());
cc.setAddress(registryConfig.getAddress());
cc.setHighestPriority(false);
configManager.addConfigCenter(cc);
}
return null;
});
}
startConfigCenter();
});
Expand Down Expand Up @@ -432,8 +457,8 @@ public DubboBootstrap start() {
// TODO, only export to default registry?
List<URL> exportedURLs = exportMetadataService(
configManager.getApplication().orElseThrow(() -> new IllegalStateException("ApplicationConfig cannot be null")),
configManager.getDefaultRegistries().orElseThrow(() -> new IllegalStateException("No default RegistryConfig")),
configManager.getDefaultProtocols().orElseThrow(() -> new IllegalStateException("No default ProtocolConfig"))
configManager.getRegistries().values(),
configManager.getProtocols().values()
);

/**
Expand Down Expand Up @@ -541,7 +566,7 @@ private void startMetadataReport() {
ApplicationConfig applicationConfig = configManager.getApplication().orElseThrow(() -> new IllegalStateException("There's no ApplicationConfig specified."));

// FIXME, multiple metadata config support.
Set<MetadataReportConfig> metadataReportConfigs = configManager.getMetadataConfigs();
Collection<MetadataReportConfig> metadataReportConfigs = configManager.getMetadataConfigs();
if (CollectionUtils.isEmpty(metadataReportConfigs)) {
if (CommonConstants.METADATA_REMOTE.equals(applicationConfig.getMetadata())) {
throw new IllegalStateException("No MetadataConfig found, you must specify the remote Metadata Center address when set 'metadata=remote'.");
Expand All @@ -559,7 +584,7 @@ private void startMetadataReport() {
}

private void startConfigCenter() {
Set<ConfigCenterConfig> configCenters = configManager.getConfigCenters();
Collection<ConfigCenterConfig> configCenters = configManager.getConfigCenters();

if (CollectionUtils.isNotEmpty(configCenters)) {
CompositeDynamicConfiguration compositeDynamicConfiguration = new CompositeDynamicConfiguration();
Expand Down Expand Up @@ -619,8 +644,8 @@ public DubboBootstrap addEventListener(EventListener<?> listener) {
}

private List<URL> exportMetadataService(ApplicationConfig applicationConfig,
List<RegistryConfig> globalRegistryConfigs,
List<ProtocolConfig> globalProtocolConfigs) {
Collection<RegistryConfig> globalRegistryConfigs,
Collection<ProtocolConfig> globalProtocolConfigs) {
ConfigurableMetadataServiceExporter exporter = new ConfigurableMetadataServiceExporter();
exporter.setApplicationConfig(applicationConfig);
exporter.setRegistries(globalRegistryConfigs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,6 @@
*/
package org.apache.dubbo.bootstrap;

import org.apache.dubbo.config.builders.ApplicationBuilder;
import org.apache.dubbo.config.builders.ProtocolBuilder;
import org.apache.dubbo.config.builders.RegistryBuilder;
import org.apache.dubbo.config.builders.ServiceBuilder;

import org.junit.jupiter.api.Test;

import java.io.IOException;
Expand All @@ -35,14 +30,5 @@ public class DubboBootstrapTest {
@Test
public void test() throws IOException {

new DubboBootstrap()
.application(ApplicationBuilder.newBuilder().name("dubbo-provider-demo").build())
.registry(RegistryBuilder.newBuilder().address("zookeeper://127.0.0.1:2181?registry-type=service&metadata=remote").build())
.protocol(ProtocolBuilder.newBuilder().port(-1).name("dubbo").build())
.service(ServiceBuilder.newBuilder().id("test").interfaceClass(EchoService.class).ref(new EchoServiceImpl()).build())
.start()
.await();

System.in.read();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@ public static void main(String[] args) throws Exception {

new DubboBootstrap()
.application("dubbo-consumer-demo")
.registry(builder -> builder.address("zookeeper://127.0.0.1:2181?registry-type=service&subscribed-services=dubbo-provider-demo"))
// Zookeeper
// .registry("zookeeper", builder -> builder.address("zookeeper://127.0.0.1:2181?registry-type=service&subscribed-services=dubbo-provider-demo"))
// Nacos
.registry("nacos", builder -> builder.address("nacos://127.0.0.1:8848?registry-type=service&subscribed-services=dubbo-provider-demo"))
.reference("ref", builder -> builder.interfaceClass(EchoService.class))
.onlyRegisterProvider(true)
.start()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
*/
package org.apache.dubbo.bootstrap;

import org.apache.curator.test.TestingServer;

import java.io.IOException;

/**
Expand All @@ -25,14 +27,34 @@
*/
public class DubboServiceProviderBootstrap {

public static void main(String[] args) throws IOException {
private static final String ZK_ADDRESS = "127.0.0.1";

private static final int ZK_PORT = 2181;

public static void main(String[] args) throws Exception {

String address = "zookeeper://" + ZK_ADDRESS + ":" + ZK_PORT + "?registry-type=service";

TestingServer testingServer = new TestingServer(2181, true);

new DubboBootstrap()
.application("dubbo-provider-demo")
.registry(builder -> builder.address("zookeeper://127.0.0.1:2181?registry-type=service"))
// Zookeeper in service registry type
.registry("zookeeper", builder -> builder.address(address))
// Nacos
// .registry("nacos", builder -> builder.address("nacos://127.0.0.1:8848?registry-type=service"))
.protocol(builder -> builder.port(-1).name("dubbo"))
.service(builder -> builder.id("test").interfaceClass(EchoService.class).ref(new EchoServiceImpl()))
.start()
.await();


// shutdown Zookeeper server
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
testingServer.close();
} catch (IOException e) {
}
}));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
import javassist.CtMethod;
import javassist.NotFoundException;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
Expand Down Expand Up @@ -48,6 +51,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.Arrays.asList;
import static java.util.Collections.unmodifiableSet;
Expand Down Expand Up @@ -1127,7 +1131,7 @@ public static Type[] getReturnTypes(Method method) {
}
return new Type[]{returnType, genericReturnType};
}

/**
* Find the {@link Set} of {@link ParameterizedType}
*
Expand Down Expand Up @@ -1184,4 +1188,28 @@ public static <T> Set<Class<T>> findHierarchicalTypes(Class<?> sourceClass, Clas

return unmodifiableSet(hierarchicalTypes);
}

public static <T> T getProperty(Object bean, String propertyName) {
Class<?> beanClass = bean.getClass();
BeanInfo beanInfo = null;
T propertyValue = null;
try {
beanInfo = Introspector.getBeanInfo(beanClass);
propertyValue = (T) Stream.of(beanInfo.getPropertyDescriptors())
.filter(propertyDescriptor -> propertyName.equals(propertyDescriptor.getName()))
.map(PropertyDescriptor::getReadMethod)
.findFirst()
.map(method -> {
try {
return method.invoke(bean);
} catch (Exception e) {
}
return null;
}).get();
} catch (Exception e) {

}
return propertyValue;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,6 @@ protected void checkMetadataReport() {
}

/**
*
* Load the registry and conversion it to {@link URL}, the priority order is: system property > dubbo registry config
*
* @param provider whether it is the provider side
Expand Down Expand Up @@ -298,7 +297,6 @@ protected List<URL> loadRegistries(boolean provider) {
}

/**
*
* Load the monitor config from the system properties and conversation it to {@link URL}
*
* @param registryURL
Expand Down Expand Up @@ -358,7 +356,7 @@ static void appendRuntimeParameters(Map<String, String> map) {
* methods configured in the configuration file are included in the interface of remote service
*
* @param interfaceClass the interface of remote service
* @param methods the methods configured
* @param methods the methods configured
*/
protected void checkInterfaceAndMethods(Class<?> interfaceClass, List<MethodConfig> methods) {
// interface cannot be null
Expand Down Expand Up @@ -466,15 +464,14 @@ private void verify(Class<?> interfaceClass, Class<?> localClass) {
private void convertRegistryIdsToRegistries() {
if (StringUtils.isEmpty(registryIds)) {
if (CollectionUtils.isEmpty(registries)) {
setRegistries(
ConfigManager.getInstance().getDefaultRegistries()
.filter(CollectionUtils::isNotEmpty)
.orElseGet(() -> {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.refresh();
return Arrays.asList(registryConfig);
})
);
List<RegistryConfig> registryConfigs = ConfigManager.getInstance().getDefaultRegistries();
if (registryConfigs.isEmpty()) {
registryConfigs = new ArrayList<>();
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.refresh();
registryConfigs.add(registryConfig);
}
setRegistries(registryConfigs);
}
} else {
String[] ids = COMMA_SPLIT_PATTERN.split(registryIds);
Expand Down Expand Up @@ -668,7 +665,7 @@ public List<RegistryConfig> getRegistries() {

@SuppressWarnings({"unchecked"})
public void setRegistries(List<? extends RegistryConfig> registries) {
ConfigManager.getInstance().addRegistries((List<RegistryConfig>) registries, false);
ConfigManager.getInstance().addRegistries((List<RegistryConfig>) registries);
this.registries = (List<RegistryConfig>) registries;
}

Expand Down
Loading

0 comments on commit d5c78ac

Please sign in to comment.