From 51146f726d38bc72b07547ddbf6de662976f2813 Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Tue, 20 Nov 2018 14:33:35 +0800 Subject: [PATCH] Split the Environment into two parts: Environment in Common and ConfigurationUtils in ConfigCenter --- .../config/ConfigConditionRouter.java | 8 +- .../java/org/apache/dubbo/common/URL.java | 6 + .../dubbo/common/config}/Environment.java | 64 +--------- .../dubbo/common/utils/ConfigUtils.java | 25 ---- .../dubbo/common/utils/ConfigUtilsTest.java | 27 ----- .../apache/dubbo/config/AbstractConfig.java | 2 +- .../dubbo/config/AbstractInterfaceConfig.java | 6 +- .../dubbo/config/ConfigCenterConfig.java | 2 +- .../apache/dubbo/config/RegistryConfig.java | 4 + .../apache/dubbo/config/ServiceConfig.java | 2 +- .../dubbo/config/spring/ConfigCenterBean.java | 8 +- .../configcenter/ConfigurationUtils.java | 112 ++++++++++++++++++ .../configcenter}/ConfigurationWrapper.java | 2 +- .../configcenter/DynamicConfiguration.java | 2 +- dubbo-container/dubbo-container-log4j/pom.xml | 5 + .../dubbo/container/log4j/Log4jContainer.java | 9 +- .../META-INF/spring/dubbo-demo-consumer.xml | 6 +- .../META-INF/spring/dubbo-demo-provider.xml | 6 +- .../integration/RegistryDirectory.java | 2 +- .../integration/RegistryProtocol.java | 6 +- .../org/apache/dubbo/registry/ZKTools.java | 32 ++--- dubbo-rpc/dubbo-rpc-dubbo/pom.xml | 5 + .../rpc/protocol/dubbo/DubboInvoker.java | 4 +- .../rpc/protocol/dubbo/DubboProtocol.java | 8 +- .../dubbo/DubboInvokerAvilableTest.java | 4 +- .../rpc/protocol/thrift/ThriftProtocol.java | 4 +- 26 files changed, 190 insertions(+), 171 deletions(-) rename {dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context => dubbo-common/src/main/java/org/apache/dubbo/common/config}/Environment.java (65%) create mode 100644 dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationUtils.java rename {dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context => dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter}/ConfigurationWrapper.java (97%) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ConfigConditionRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ConfigConditionRouter.java index 3d994c7b70..f18254a883 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ConfigConditionRouter.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ConfigConditionRouter.java @@ -58,11 +58,9 @@ public class ConfigConditionRouter extends AbstractRouter implements Configurati this.configuration = configuration; this.force = false; this.url = url; - String app = this.url.getParameter(Constants.APPLICATION_KEY); - String serviceKey = this.url.getServiceKey(); try { - String rawRule = this.configuration.getConfig(serviceKey + Constants.ROUTERS_SUFFIX, this); - String appRawRule = this.configuration.getConfig(app + Constants.ROUTERS_SUFFIX, this); + String rawRule = this.configuration.getConfig(url.getEncodedServiceKey() + Constants.ROUTERS_SUFFIX, this); + String appRawRule = this.configuration.getConfig(url.getParameter(Constants.APPLICATION_KEY) + Constants.ROUTERS_SUFFIX, this); if (!StringUtils.isEmpty(rawRule)) { try { routerRule = ConditionRuleParser.parse(rawRule); @@ -81,7 +79,7 @@ public class ConfigConditionRouter extends AbstractRouter implements Configurati } } catch (Exception e) { - throw new IllegalStateException("Failed to init the condition router for service " + serviceKey + ", application " + app, e); + throw new IllegalStateException("Failed to init the condition router for service " + url.getServiceKey() + ", application " + url.getParameter(Constants.APPLICATION_KEY), e); } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java index b0396bdfb9..c94cb5890c 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java @@ -1285,6 +1285,12 @@ public /**final**/ class URL implements Serializable { return new InetSocketAddress(host, port); } + public String getEncodedServiceKey() { + String serviceKey = this.getServiceKey(); + serviceKey = serviceKey.replaceFirst("/", "*"); + return serviceKey; + } + public String getServiceKey() { String inf = getServiceInterface(); if (inf == null) { diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java similarity index 65% rename from dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java rename to dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java index 870304e9c3..0e77565a0e 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java @@ -14,24 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.dubbo.config.context; +package org.apache.dubbo.common.config; import org.apache.dubbo.common.Constants; -import org.apache.dubbo.common.URL; -import org.apache.dubbo.common.config.CompositeConfiguration; -import org.apache.dubbo.common.config.EnvironmentConfiguration; -import org.apache.dubbo.common.config.InmemoryConfiguration; -import org.apache.dubbo.common.config.PropertiesConfiguration; -import org.apache.dubbo.common.config.SystemConfiguration; -import org.apache.dubbo.common.extension.ExtensionLoader; -import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.StringUtils; -import org.apache.dubbo.config.ConfigCenterConfig; -import org.apache.dubbo.configcenter.DynamicConfiguration; import java.util.HashMap; import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** @@ -46,12 +35,8 @@ public class Environment { private volatile Map externalConfsHolder = new ConcurrentHashMap<>(); private volatile Map appExternalConfsHolder = new ConcurrentHashMap<>(); private volatile Map startupCompositeConfsHolder = new ConcurrentHashMap<>(); - private volatile Map runtimeCompositeConfsHolder = new ConcurrentHashMap<>(); - - private volatile DynamicConfiguration dynamicConfiguration; private volatile boolean isConfigCenterFirst = true; - private volatile ConfigCenterConfig configCenter; private Map externalConfigurationMap = new HashMap<>(); private Map appExternalConfigurationMap = new HashMap<>(); @@ -88,24 +73,12 @@ public class Environment { return environmentConfsHolder.computeIfAbsent(toKey(prefix, id), k -> new EnvironmentConfiguration(prefix, id)); } - public void setConfigCenter(ConfigCenterConfig configCenter) { - this.configCenter = configCenter; - } - public synchronized void setExternalConfiguration(Map externalConfiguration) { this.externalConfigurationMap = externalConfiguration; - if (configCenter == null) { - configCenter = new ConfigCenterConfig(); - } - configCenter.init(); } public synchronized void setAppExternalConfiguration(Map appExternalConfiguration) { this.appExternalConfigurationMap = appExternalConfiguration; - if (configCenter == null) { - configCenter = new ConfigCenterConfig(); - } - configCenter.init(); } public void updateExternalConfigurationMap(Map externalMap) { @@ -127,41 +100,6 @@ public class Environment { }); } - /** - * FIXME This method will recreate Configuration for each RPC, how much latency affect will this action has on performance? - * - * @param url, the url metadata. - * @param method, the method name the RPC is trying to invoke. - * @return - */ - public CompositeConfiguration getRuntimeCompositeConf(URL url, String method) { - CompositeConfiguration compositeConfiguration = new CompositeConfiguration(); - - String app = url.getParameter(Constants.APPLICATION_KEY); - String service = url.getServiceKey(); - compositeConfiguration.addConfiguration(new ConfigurationWrapper(app, service, method, getDynamicConfiguration())); - - compositeConfiguration.addConfiguration(url.toConfiguration()); - compositeConfiguration.addConfiguration(this.getSystemConf(null, null)); - compositeConfiguration.addConfiguration(this.getPropertiesConf(null, null)); - return compositeConfiguration; - } - - /** - * If user opens DynamicConfig, the extension instance must has been created during the initialization of ConfigCenterConfig with the right extension type user specified. - * If no DynamicConfig presents, NopDynamicConfiguration will be used. - * - * @return - */ - public DynamicConfiguration getDynamicConfiguration() { - Set configurations = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getLoadedExtensionInstances(); - if (CollectionUtils.isEmpty(configurations)) { - return ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getDefaultExtension(); - } else { - return (DynamicConfiguration) configurations.iterator().next(); - } - } - private static String toKey(String keypart1, String keypart2) { StringBuilder sb = new StringBuilder(); if (StringUtils.isNotEmpty(keypart1)) { diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConfigUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConfigUtils.java index 436cf8f42e..fbab5eae18 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConfigUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConfigUtils.java @@ -304,29 +304,4 @@ public class ConfigUtils { } return PID; } - - @SuppressWarnings("deprecation") - public static int getServerShutdownTimeout() { - int timeout = Constants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT; - String value = ConfigUtils.getProperty(Constants.SHUTDOWN_WAIT_KEY); - if (value != null && value.length() > 0) { - try { - timeout = Integer.parseInt(value); - } catch (Exception e) { - // ignore - } - } else { - value = ConfigUtils.getProperty(Constants.SHUTDOWN_WAIT_SECONDS_KEY); - if (value != null && value.length() > 0) { - try { - timeout = Integer.parseInt(value) * 1000; - } catch (Exception e) { - // ignore - } - } - } - - return timeout; - } - } diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java index a540d64ec7..97398a0ea4 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java @@ -256,31 +256,4 @@ public class ConfigUtilsTest { public void testGetPid() throws Exception { assertThat(ConfigUtils.getPid(), greaterThan(0)); } - - @Test - public void testGetServerShutdownTimeoutFromShutdownWait() throws Exception { - System.setProperty(Constants.SHUTDOWN_WAIT_KEY, "1234"); - try { - assertThat(ConfigUtils.getServerShutdownTimeout(), equalTo(1234)); - } finally { - System.clearProperty(Constants.SHUTDOWN_WAIT_KEY); - } - } - - @Test - public void testGetServerShutdownTimeoutFromShutdownWaitSeconds() throws Exception { - System.setProperty(Constants.SHUTDOWN_WAIT_SECONDS_KEY, "1234"); - try { - assertThat(ConfigUtils.getServerShutdownTimeout(), equalTo(1234 * 1000)); - } finally { - System.clearProperty(Constants.SHUTDOWN_WAIT_SECONDS_KEY); - } - } - - @Test - public void testGetServerShutdownTimeoutFromDefault() throws Exception { - System.clearProperty(Constants.SHUTDOWN_WAIT_KEY); - System.clearProperty(Constants.SHUTDOWN_WAIT_SECONDS_KEY); - assertThat(ConfigUtils.getServerShutdownTimeout(), equalTo(Constants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT)); - } } \ No newline at end of file diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java index 0be4c41174..f60b378593 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java @@ -20,13 +20,13 @@ import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.config.CompositeConfiguration; import org.apache.dubbo.common.config.Configuration; +import org.apache.dubbo.common.config.Environment; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.ReflectUtils; import org.apache.dubbo.common.utils.StringUtils; -import org.apache.dubbo.config.context.Environment; import org.apache.dubbo.config.support.Parameter; import org.apache.dubbo.config.utils.ConfigConverter; import org.apache.dubbo.rpc.model.ConsumerMethodModel; diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java index 34fc01f667..e8649f0c4a 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java @@ -19,6 +19,7 @@ package org.apache.dubbo.config; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.Version; +import org.apache.dubbo.common.config.Environment; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.ConfigUtils; @@ -26,7 +27,6 @@ import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.common.utils.ReflectUtils; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.common.utils.UrlUtils; -import org.apache.dubbo.config.context.Environment; import org.apache.dubbo.config.support.Parameter; import org.apache.dubbo.configcenter.DynamicConfiguration; import org.apache.dubbo.metadata.integration.MetadataReportService; @@ -154,14 +154,16 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig { } } - // For compatibility purpose, use registry as the default config center if there's no one specified explicitly. + // For compatibility purpose, use registry as the default config center if the registry protocol is zookeeper and there's no config center specified explicitly. RegistryConfig registry = registries.get(0); if (registry.isZookeeperProtocol()) { Set loadedConfigurations = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getLoadedExtensionInstances(); + // we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated. if (CollectionUtils.isEmpty(loadedConfigurations)) { ConfigCenterConfig configCenterConfig = new ConfigCenterConfig(); configCenterConfig.setProtocol(registry.getProtocol()); configCenterConfig.setAddress(registry.getAddress()); + configCenterConfig.init(); } } } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java index 3d7c212e50..c957f1a31a 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java @@ -18,11 +18,11 @@ package org.apache.dubbo.config; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.config.Environment; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.common.utils.UrlUtils; -import org.apache.dubbo.config.context.Environment; import org.apache.dubbo.config.support.Parameter; import org.apache.dubbo.configcenter.DynamicConfiguration; diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryConfig.java index 4e4c35422c..5e8015ca73 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryConfig.java @@ -335,7 +335,11 @@ public class RegistryConfig extends AbstractConfig { this.isDefault = isDefault; } + @Parameter(excluded = true) public boolean isZookeeperProtocol() { + if (!isValid()) { + return false; + } boolean isZookeeper = StringUtils.isNotEmpty(this.getProtocol()) && this.getProtocol().equals("zookeeper"); if (!isZookeeper) { String address = this.getAddress(); diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java index 0133b014db..7c354ad7b9 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java @@ -20,13 +20,13 @@ import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.Version; import org.apache.dubbo.common.bytecode.Wrapper; +import org.apache.dubbo.common.config.Environment; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.utils.ClassHelper; import org.apache.dubbo.common.utils.ConfigUtils; import org.apache.dubbo.common.utils.NamedThreadFactory; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.config.annotation.Service; -import org.apache.dubbo.config.context.Environment; import org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker; import org.apache.dubbo.config.support.Parameter; import org.apache.dubbo.metadata.integration.MetadataReportService; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ConfigCenterBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ConfigCenterBean.java index 1a20434432..9ce2f46cc0 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ConfigCenterBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ConfigCenterBean.java @@ -76,7 +76,7 @@ public class ConfigCenterBean extends ConfigCenterConfig implements Initializing if ((getRegistry() == null)) { List registryConfigs = new ArrayList<>(); - if (getApplication() == null || getApplication().getRegistries() == null || getApplication().getRegistries().isEmpty()) { + if (getApplication() != null && getApplication().getRegistries() != null && !getApplication().getRegistries().isEmpty()) { registryConfigs = getApplication().getRegistries(); } else { Map registryConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, RegistryConfig.class, false, false); @@ -107,9 +107,9 @@ public class ConfigCenterBean extends ConfigCenterConfig implements Initializing if (auto) { Map externalProperties = getConfigurations(getConfigfile(), environment); Map appExternalProperties = getConfigurations("application." + getConfigfile(), environment); - org.apache.dubbo.config.context.Environment.getInstance().setConfigCenter(this); - org.apache.dubbo.config.context.Environment.getInstance().setExternalConfiguration(externalProperties); - org.apache.dubbo.config.context.Environment.getInstance().setAppExternalConfiguration(appExternalProperties); + org.apache.dubbo.common.config.Environment.getInstance().setExternalConfiguration(externalProperties); + org.apache.dubbo.common.config.Environment.getInstance().setAppExternalConfiguration(appExternalProperties); + this.init(); } } diff --git a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationUtils.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationUtils.java new file mode 100644 index 0000000000..cf57b6729f --- /dev/null +++ b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationUtils.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.configcenter; + +import org.apache.dubbo.common.Constants; +import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.config.CompositeConfiguration; +import org.apache.dubbo.common.config.Environment; +import org.apache.dubbo.common.extension.ExtensionLoader; +import org.apache.dubbo.common.utils.CollectionUtils; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * + */ +public class ConfigurationUtils { + private static final CompositeConfiguration compositeConfiguration; + + static { + compositeConfiguration = new CompositeConfiguration(); + compositeConfiguration.addConfiguration(getDynamicConfiguration()); + compositeConfiguration.addConfiguration(Environment.getInstance().getAppExternalConfiguration(null, null)); + compositeConfiguration.addConfiguration(Environment.getInstance().getExternalConfiguration(null, null)); + compositeConfiguration.addConfiguration(Environment.getInstance().getSystemConf(null, null)); + compositeConfiguration.addConfiguration(Environment.getInstance().getPropertiesConf(null, null)); + } + + private volatile Map runtimeCompositeConfsHolder = new ConcurrentHashMap<>(); + + /** + * FIXME This method will recreate Configuration for each RPC, how much latency affect will this action has on performance? + * + * @param url, the url metadata. + * @param method, the method name the RPC is trying to invoke. + * @return + */ + public static CompositeConfiguration getRuntimeCompositeConf(URL url, String method) { + CompositeConfiguration compositeConfiguration = new CompositeConfiguration(); + + String app = url.getParameter(Constants.APPLICATION_KEY); + String service = url.getServiceKey(); + compositeConfiguration.addConfiguration(new ConfigurationWrapper(app, service, method, getDynamicConfiguration())); + + compositeConfiguration.addConfiguration(url.toConfiguration()); + + return compositeConfiguration; + } + + /** + * If user opens DynamicConfig, the extension instance must has been created during the initialization of ConfigCenterConfig with the right extension type user specified. + * If no DynamicConfig presents, NopDynamicConfiguration will be used. + * + * @return + */ + public static DynamicConfiguration getDynamicConfiguration() { + Set configurations = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getLoadedExtensionInstances(); + if (CollectionUtils.isEmpty(configurations)) { + return ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getDefaultExtension(); + } else { + return (DynamicConfiguration) configurations.iterator().next(); + } + } + + @SuppressWarnings("deprecation") + public static int getServerShutdownTimeout() { + int timeout = Constants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT; + String value = getProperty(Constants.SHUTDOWN_WAIT_KEY); + if (value != null && value.length() > 0) { + try { + timeout = Integer.parseInt(value); + } catch (Exception e) { + // ignore + } + } else { + value = getProperty(Constants.SHUTDOWN_WAIT_SECONDS_KEY); + if (value != null && value.length() > 0) { + try { + timeout = Integer.parseInt(value) * 1000; + } catch (Exception e) { + // ignore + } + } + } + return timeout; + } + + public static String getProperty(String key) { + return compositeConfiguration.getString(key); + } + + public static String getProperty(String key, String defaultValue) { + return compositeConfiguration.getString(key, defaultValue); + } + +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigurationWrapper.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationWrapper.java similarity index 97% rename from dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigurationWrapper.java rename to dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationWrapper.java index 2d758ae13c..9a22dddcd4 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/ConfigurationWrapper.java +++ b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationWrapper.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.dubbo.config.context; +package org.apache.dubbo.configcenter; import org.apache.dubbo.common.config.AbstractConfiguration; import org.apache.dubbo.common.config.Configuration; diff --git a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java index caf9fd94dc..7adcc47cc5 100644 --- a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java +++ b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java @@ -23,7 +23,7 @@ import org.apache.dubbo.common.extension.SPI; /** * */ -@SPI("zookeeper") +@SPI("nop") public interface DynamicConfiguration extends Configuration { void init(); diff --git a/dubbo-container/dubbo-container-log4j/pom.xml b/dubbo-container/dubbo-container-log4j/pom.xml index 2197134743..91814b3a9d 100644 --- a/dubbo-container/dubbo-container-log4j/pom.xml +++ b/dubbo-container/dubbo-container-log4j/pom.xml @@ -34,5 +34,10 @@ dubbo-container-api ${project.parent.version} + + org.apache.dubbo + dubbo-configcenter-api + ${project.parent.version} + \ No newline at end of file diff --git a/dubbo-container/dubbo-container-log4j/src/main/java/org/apache/dubbo/container/log4j/Log4jContainer.java b/dubbo-container/dubbo-container-log4j/src/main/java/org/apache/dubbo/container/log4j/Log4jContainer.java index 3938e427aa..1d24236d93 100644 --- a/dubbo-container/dubbo-container-log4j/src/main/java/org/apache/dubbo/container/log4j/Log4jContainer.java +++ b/dubbo-container/dubbo-container-log4j/src/main/java/org/apache/dubbo/container/log4j/Log4jContainer.java @@ -16,9 +16,8 @@ */ package org.apache.dubbo.container.log4j; -import org.apache.dubbo.common.utils.ConfigUtils; +import org.apache.dubbo.configcenter.ConfigurationUtils; import org.apache.dubbo.container.Container; - import org.apache.log4j.Appender; import org.apache.log4j.FileAppender; import org.apache.log4j.LogManager; @@ -43,9 +42,9 @@ public class Log4jContainer implements Container { @Override @SuppressWarnings("unchecked") public void start() { - String file = ConfigUtils.getProperty(LOG4J_FILE); + String file = ConfigurationUtils.getProperty(LOG4J_FILE); if (file != null && file.length() > 0) { - String level = ConfigUtils.getProperty(LOG4J_LEVEL); + String level = ConfigurationUtils.getProperty(LOG4J_LEVEL); if (level == null || level.length() == 0) { level = DEFAULT_LOG4J_LEVEL; } @@ -59,7 +58,7 @@ public class Log4jContainer implements Container { properties.setProperty("log4j.appender.application.layout.ConversionPattern", "%d [%t] %-5p %C{6} (%F:%L) - %m%n"); PropertyConfigurator.configure(properties); } - String subdirectory = ConfigUtils.getProperty(LOG4J_SUBDIRECTORY); + String subdirectory = ConfigurationUtils.getProperty(LOG4J_SUBDIRECTORY); if (subdirectory != null && subdirectory.length() > 0) { Enumeration ls = LogManager.getCurrentLoggers(); while (ls.hasMoreElements()) { diff --git a/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml b/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml index 60810c3125..14b2718517 100644 --- a/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml +++ b/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml @@ -25,10 +25,10 @@ - + - + + diff --git a/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml b/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml index 87c67863e8..73878b0cc5 100644 --- a/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml +++ b/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml @@ -25,11 +25,11 @@ - + - + + diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java index 2a5e3183cb..ac29f28c02 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java @@ -194,7 +194,7 @@ public class RegistryDirectory extends AbstractDirectory implements Notify setConsumerUrl(url); String rawConfig = null; try { - rawConfig = dynamicConfiguration.getConfig(url.getServiceKey() + Constants.CONFIGURATORS_SUFFIX, this); + rawConfig = dynamicConfiguration.getConfig(url.getEncodedServiceKey() + Constants.CONFIGURATORS_SUFFIX, this); if (StringUtils.isNotEmpty(rawConfig)) { this.dynamicConfigurators = configToConfiguratiors(rawConfig); } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java index e0e0e48f97..2c4781ff98 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java @@ -22,13 +22,13 @@ import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.CollectionUtils; -import org.apache.dubbo.common.utils.ConfigUtils; import org.apache.dubbo.common.utils.NamedThreadFactory; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.common.utils.UrlUtils; import org.apache.dubbo.configcenter.ConfigChangeEvent; import org.apache.dubbo.configcenter.ConfigChangeType; import org.apache.dubbo.configcenter.ConfigurationListener; +import org.apache.dubbo.configcenter.ConfigurationUtils; import org.apache.dubbo.configcenter.DynamicConfiguration; import org.apache.dubbo.registry.NotifyListener; import org.apache.dubbo.registry.Registry; @@ -190,7 +190,7 @@ public class RegistryProtocol implements Protocol { listener.setAppDynamicConfigurators(appDynamicConfigurators); configurators.addAll(appDynamicConfigurators); } - String rawConfig = dynamicConfiguration.getConfig(providerUrl.getServiceKey() + Constants.CONFIGURATORS_SUFFIX, listener); + String rawConfig = dynamicConfiguration.getConfig(providerUrl.getEncodedServiceKey() + Constants.CONFIGURATORS_SUFFIX, listener); if (!StringUtils.isEmpty(rawConfig)) { List dynamicConfigurators = RegistryDirectory.configToConfiguratiors(rawConfig); listener.setDynamicConfigurators(dynamicConfigurators); @@ -637,7 +637,7 @@ public class RegistryProtocol implements Protocol { @Override public void run() { try { - int timeout = ConfigUtils.getServerShutdownTimeout(); + int timeout = ConfigurationUtils.getServerShutdownTimeout(); if (timeout > 0) { logger.info("Waiting " + timeout + "ms for registry to notify all consumers before unexport. Usually, this is called when you use dubbo API"); Thread.sleep(timeout); diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java index ab0894dbe0..15c002ea26 100644 --- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java +++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java @@ -43,8 +43,8 @@ public class ZKTools { new ExponentialBackoffRetry(1000, 3)); client.start(); - testStartupConfig(); -// testProviderConfig(); +// testStartupConfig(); + testProviderConfig(); // testPathCache(); // testTreeCache(); // testCuratorListener(); @@ -72,20 +72,22 @@ public class ZKTools { } public static void testProviderConfig() { - String str = "{\n" + - "\t\"service\": \"org.apache.dubbo.demo.DemoService\",\n" + - "\t\"items\": [{\n" + - "\t\t\"addresses\": [\"30.5.120.49\"],\n" + - "\t\t\"rules\": [{\n" + - "\t\t\t\"key\": \"weight\",\n" + - "\t\t\t\"value\": 500\n" + - "\t\t}],\n" + - "\t\t\"app\": \"demo-provider\",\n" + - "\t\t\"side\": \"provider\"\n" + - "\t}]\n" + - "}"; + String str = "---\n" + + "apiVersion: v2.7\n" + + "scope: service\n" + + "key: dd-test/org.apache.dubbo.demo.DemoService:1.0.4\n" + + "enabled: true\n" + + "configs:\n" + + "- addresses: ['0.0.0.0:20880']\n" + + " side: provider\n" + + " parameters:\n" + + " timeout: 6000\n" + + "..."; + + System.out.println(str); + try { - String path = "/dubbo/config/demo-provider/org.apache.dubbo.demo.DemoService.CONFIGURATORS"; + String path = "/dubbo/config/dd-test*org.apache.dubbo.demo.DemoService:1.0.4/configurators"; if (client.checkExists().forPath(path) == null) { client.create().creatingParentsIfNeeded().forPath(path); } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/pom.xml b/dubbo-rpc/dubbo-rpc-dubbo/pom.xml index 26915e458d..bf2f63cbda 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/pom.xml +++ b/dubbo-rpc/dubbo-rpc-dubbo/pom.xml @@ -54,6 +54,11 @@ + + org.apache.dubbo + dubbo-configcenter-api + ${project.parent.version} + org.apache.dubbo dubbo-remoting-netty4 diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java index 93343c0c26..60c56f0453 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvoker.java @@ -19,7 +19,7 @@ package org.apache.dubbo.rpc.protocol.dubbo; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.utils.AtomicPositiveInteger; -import org.apache.dubbo.common.utils.ConfigUtils; +import org.apache.dubbo.configcenter.ConfigurationUtils; import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.TimeoutException; import org.apache.dubbo.remoting.exchange.ExchangeClient; @@ -148,7 +148,7 @@ public class DubboInvoker extends AbstractInvoker { } for (ExchangeClient client : clients) { try { - client.close(ConfigUtils.getServerShutdownTimeout()); + client.close(ConfigurationUtils.getServerShutdownTimeout()); } catch (Throwable t) { logger.warn(t.getMessage(), t); } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java index 334f0fbaba..2b7c156790 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java @@ -22,9 +22,9 @@ import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.serialize.support.SerializableClassRegistry; import org.apache.dubbo.common.serialize.support.SerializationOptimizer; import org.apache.dubbo.common.utils.ConcurrentHashSet; -import org.apache.dubbo.common.utils.ConfigUtils; import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.common.utils.StringUtils; +import org.apache.dubbo.configcenter.ConfigurationUtils; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.Transporter; @@ -454,7 +454,7 @@ public class DubboProtocol extends AbstractProtocol { if (logger.isInfoEnabled()) { logger.info("Close dubbo server: " + server.getLocalAddress()); } - server.close(ConfigUtils.getServerShutdownTimeout()); + server.close(ConfigurationUtils.getServerShutdownTimeout()); } catch (Throwable t) { logger.warn(t.getMessage(), t); } @@ -468,7 +468,7 @@ public class DubboProtocol extends AbstractProtocol { if (logger.isInfoEnabled()) { logger.info("Close dubbo connect: " + client.getLocalAddress() + "-->" + client.getRemoteAddress()); } - client.close(ConfigUtils.getServerShutdownTimeout()); + client.close(ConfigurationUtils.getServerShutdownTimeout()); } catch (Throwable t) { logger.warn(t.getMessage(), t); } @@ -482,7 +482,7 @@ public class DubboProtocol extends AbstractProtocol { if (logger.isInfoEnabled()) { logger.info("Close dubbo connect: " + client.getLocalAddress() + "-->" + client.getRemoteAddress()); } - client.close(ConfigUtils.getServerShutdownTimeout()); + client.close(ConfigurationUtils.getServerShutdownTimeout()); } catch (Throwable t) { logger.warn(t.getMessage(), t); } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvilableTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvilableTest.java index ced3d06775..984ab71fd1 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvilableTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvilableTest.java @@ -20,8 +20,8 @@ package org.apache.dubbo.rpc.protocol.dubbo; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.extension.ExtensionLoader; -import org.apache.dubbo.common.utils.ConfigUtils; import org.apache.dubbo.common.utils.NetUtils; +import org.apache.dubbo.configcenter.ConfigurationUtils; import org.apache.dubbo.remoting.exchange.ExchangeClient; import org.apache.dubbo.rpc.Exporter; import org.apache.dubbo.rpc.ProxyFactory; @@ -91,7 +91,7 @@ public class DubboInvokerAvilableTest { try{ System.setProperty(Constants.SHUTDOWN_WAIT_KEY, "2000"); - System.out.println("------------ConfigUtils.getServerShutdownTimeout(): " + ConfigUtils.getServerShutdownTimeout()); + System.out.println("------------ConfigUtils.getServerShutdownTimeout(): " + ConfigurationUtils.getServerShutdownTimeout()); protocol.destroy(); }finally { System.getProperties().remove(Constants.SHUTDOWN_WAIT_KEY); diff --git a/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java b/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java index 96f4726f1d..731e94787c 100644 --- a/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java +++ b/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java @@ -19,7 +19,7 @@ package org.apache.dubbo.rpc.protocol.thrift; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.extension.ExtensionLoader; -import org.apache.dubbo.common.utils.ConfigUtils; +import org.apache.dubbo.configcenter.ConfigurationUtils; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.Transporter; @@ -146,7 +146,7 @@ public class ThriftProtocol extends AbstractProtocol { if (logger.isInfoEnabled()) { logger.info("Close dubbo server: " + server.getLocalAddress()); } - server.close(ConfigUtils.getServerShutdownTimeout()); + server.close(ConfigurationUtils.getServerShutdownTimeout()); } catch (Throwable t) { logger.warn(t.getMessage(), t); }