You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2018/11/21 09:43:16 UTC

[incubator-dubbo] branch dev-metadata updated: Merge pull request #2810, code review and refactor for dubbo-configcenter.

This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch dev-metadata
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/dev-metadata by this push:
     new 6a1b9ee  Merge pull request #2810, code review and refactor for dubbo-configcenter.
6a1b9ee is described below

commit 6a1b9ee657ad01f6786d609bf55f7fd7aecc2441
Author: Ian Luo <ia...@gmail.com>
AuthorDate: Wed Nov 21 17:43:11 2018 +0800

    Merge pull request #2810, code review and refactor for dubbo-configcenter.
---
 .../org/apache/dubbo/rpc/cluster/RouterChain.java  |  2 +-
 .../apache/dubbo/common/config/Configuration.java  | 11 +++-
 .../dubbo/common/extension/ExtensionLoader.java    | 12 ++--
 .../dubbo/config/AbstractInterfaceConfig.java      |  2 +-
 .../apache/dubbo/config/ConfigCenterConfig.java    | 15 ++---
 dubbo-configcenter/dubbo-configcenter-api/pom.xml  |  4 +-
 .../configcenter/AbstractDynamicConfiguration.java | 72 +++++++++++++++-------
 .../dubbo/configcenter/ConfigChangeEvent.java      |  2 +
 .../dubbo/configcenter/ConfigChangeType.java       | 13 +++-
 .../org/apache/dubbo/configcenter/ConfigType.java  |  9 ++-
 .../dubbo/configcenter/ConfigurationListener.java  |  9 ++-
 .../dubbo/configcenter/ConfigurationUtils.java     | 13 ++--
 .../dubbo/configcenter/ConfigurationWrapper.java   |  3 +-
 .../dubbo/configcenter/DynamicConfiguration.java   | 61 +++++++++++++++---
 .../support/nop/NopDynamicConfiguration.java       | 15 ++---
 .../support/apollo/ApolloDynamicConfiguration.java |  7 ++-
 .../archaius/ArchaiusDynamicConfiguration.java     |  8 ++-
 .../dubbo/container/log4j/Log4jContainer.java      |  1 +
 .../registry/integration/RegistryProtocol.java     |  7 +--
 19 files changed, 183 insertions(+), 83 deletions(-)

diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java
index 32457e9..7b13b9e 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java
@@ -51,7 +51,7 @@ public class RouterChain<T> {
 
     public static <T> RouterChain<T> buildChain(DynamicConfiguration dynamicConfiguration, URL url) {
         RouterChain<T> routerChain = new RouterChain<>(url);
-        List<RouterFactory> extensionFactories = ExtensionLoader.getExtensionLoader(RouterFactory.class).getActivateExtension(dynamicConfiguration.getUrl(), (String[]) null);
+        List<RouterFactory> extensionFactories = ExtensionLoader.getExtensionLoader(RouterFactory.class).getActivateExtension(url, (String[]) null);
         List<Router> routers = extensionFactories.stream()
                 .map(factory -> {
                     Router router = factory.getRouter(dynamicConfiguration, url);
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java
index 2d76882..8380b59 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java
@@ -17,7 +17,7 @@
 package org.apache.dubbo.common.config;
 
 /**
- *
+ * Configuration interface, to fetch the value for the specified key.
  */
 public interface Configuration {
     /**
@@ -58,6 +58,15 @@ public interface Configuration {
      */
     Object getProperty(String key);
 
+    /**
+     * Gets a property from the configuration. The default value will return if the configuration doesn't contain
+     * the mapping for the specified key.
+     *
+     * @param key property to retrieve
+     * @param defaultValue default value
+     * @return the value to which this configuration maps the specified key, or default value if the configuration
+     * contains no mapping for this key.
+     */
     Object getProperty(String key, Object defaultValue);
 
     /**
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
index 1e9c538..83a6c7f 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
@@ -302,10 +302,6 @@ public class ExtensionLoader<T> {
         return Collections.unmodifiableSet(new TreeSet<String>(cachedInstances.keySet()));
     }
 
-    public Set<Object> getLoadedExtensionInstances() {
-        return Collections.unmodifiableSet(cachedInstances.values().stream().map(Holder::get).collect(Collectors.toSet()));
-    }
-
     public Object getLoadedAdaptiveExtensionInstances() {
         return cachedAdaptiveInstance.get();
     }
@@ -341,6 +337,14 @@ public class ExtensionLoader<T> {
     }
 
     /**
+     * Return all available extension instances.
+     */
+    public Set<T> getExtensions() {
+        return Collections.unmodifiableSet(getSupportedExtensions().stream().map(this::getExtension)
+                .collect(Collectors.toSet()));
+    }
+
+    /**
      * Return default extension, return <code>null</code> if it's not configured.
      */
     public T getDefaultExtension() {
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 e8649f0..b1f7223 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
@@ -157,7 +157,7 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
         // 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<Object> loadedConfigurations = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getLoadedExtensionInstances();
+            Set<DynamicConfiguration> loadedConfigurations = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getExtensions();
             // we use the loading status of DynamicConfiguration to decide whether ConfigCenter has been initiated.
             if (CollectionUtils.isEmpty(loadedConfigurations)) {
                 ConfigCenterConfig configCenterConfig = new ConfigCenterConfig();
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 c957f1a..0b884cc 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
@@ -20,7 +20,6 @@ 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.support.Parameter;
@@ -31,7 +30,6 @@ import java.io.StringReader;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Set;
 
 /**
  *
@@ -102,16 +100,11 @@ public class ConfigCenterConfig extends AbstractConfig {
 //        checkConfigCenter();
 
         URL url = toConfigUrl();
-        Set<Object> loadedConfigurations = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getLoadedExtensionInstances();
-        if (CollectionUtils.isEmpty(loadedConfigurations)) {
-            DynamicConfiguration dynamicConfiguration = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getExtension(url.getProtocol());
-            // TODO, maybe we need a factory to do this?
-            dynamicConfiguration.setUrl(url);
-            dynamicConfiguration.init();
-            return dynamicConfiguration;
-        }
 
-        return (DynamicConfiguration) loadedConfigurations.iterator().next();
+        DynamicConfiguration dynamicConfiguration = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getExtension(url.getProtocol());
+        // TODO, maybe we need a factory to do this?
+        dynamicConfiguration.initWith(url);
+        return dynamicConfiguration;
     }
 
     private URL toConfigUrl() {
diff --git a/dubbo-configcenter/dubbo-configcenter-api/pom.xml b/dubbo-configcenter/dubbo-configcenter-api/pom.xml
index e75fb9e..68b51ff 100644
--- a/dubbo-configcenter/dubbo-configcenter-api/pom.xml
+++ b/dubbo-configcenter/dubbo-configcenter-api/pom.xml
@@ -25,7 +25,7 @@
     <artifactId>dubbo-configcenter-api</artifactId>
     <packaging>jar</packaging>
     <name>${project.artifactId}</name>
-    <description>The api definition of the service configcenter module</description>
+    <description>The api definition of the service config-center module</description>
     <properties>
         <skip_maven_deploy>false</skip_maven_deploy>
     </properties>
@@ -37,4 +37,4 @@
             <version>${project.parent.version}</version>
         </dependency>
     </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/AbstractDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/AbstractDynamicConfiguration.java
index 3411032..258ce52 100644
--- a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/AbstractDynamicConfiguration.java
+++ b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/AbstractDynamicConfiguration.java
@@ -23,23 +23,36 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 /**
+ * Dynamic configuration template class. The concrete implementation needs to provide implementation for three methods.
  *
+ * @see AbstractDynamicConfiguration#getTargetConfig(String, String, long)
+ * @see AbstractDynamicConfiguration#addListener(String, ConfigurationListener)
+ * @see AbstractDynamicConfiguration#createTargetListener(String, ConfigurationListener)
  */
-public abstract class AbstractDynamicConfiguration<TargetConfigListener> extends AbstractConfiguration implements DynamicConfiguration {
-    public static final String DEFAULT_GROUP = "dubbo";
+public abstract class AbstractDynamicConfiguration<TargetListener> extends AbstractConfiguration
+        implements DynamicConfiguration {
+    protected static final String DEFAULT_GROUP = "dubbo";
+
     protected URL url;
-    /**
-     * One key can register multiple target listeners, but one target listener only maps to one configuration listener
-     */
-    private ConcurrentMap<String, ConcurrentMap<ConfigurationListener, TargetConfigListener>> listenerToTargetListenerMap = new ConcurrentHashMap<>();
+
+    // One key can register multiple target listeners, but one target listener only maps to one configuration listener
+    private ConcurrentMap<String, ConcurrentMap<ConfigurationListener, TargetListener>> targetListeners =
+            new ConcurrentHashMap<>();
 
     public AbstractDynamicConfiguration() {
     }
 
     @Override
+    public void initWith(URL url) {
+        this.url = url;
+    }
+
+    @Override
     public void addListener(String key, ConfigurationListener listener) {
-        ConcurrentMap<ConfigurationListener, TargetConfigListener> listeners = listenerToTargetListenerMap.computeIfAbsent(key, k -> new ConcurrentHashMap<>());
-        TargetConfigListener targetListener = listeners.computeIfAbsent(listener, k -> createTargetConfigListener(key, listener));
+        ConcurrentMap<ConfigurationListener, TargetListener> listeners = targetListeners.computeIfAbsent(key,
+                k -> new ConcurrentHashMap<>());
+        TargetListener targetListener = listeners.computeIfAbsent(listener,
+                k -> createTargetListener(key, listener));
         addTargetListener(key, targetListener);
     }
 
@@ -60,33 +73,48 @@ public abstract class AbstractDynamicConfiguration<TargetConfigListener> extends
 
     @Override
     public String getConfig(String key, String group, ConfigurationListener listener) {
-        return getConfig(key, group, 0l, listener);
+        return getConfig(key, group, listener, 0L);
     }
 
     @Override
-    public String getConfig(String key, String group, long timeout, ConfigurationListener listener) {
+    public String getConfig(String key, String group, ConfigurationListener listener, long timeout) {
         try {
             if (listener != null) {
                 this.addListener(key, listener);
             }
-            return getInternalProperty(key, group, timeout);
+            return getTargetConfig(key, group, timeout);
         } catch (Exception e) {
             throw new IllegalStateException(e.getMessage(), e);
         }
     }
 
-    public URL getUrl() {
-        return url;
-    }
-
-    public void setUrl(URL url) {
-        this.url = url;
-    }
-
-    protected abstract String getInternalProperty(String key, String group, long timeout);
+    /**
+     * Fetch dynamic configuration from backend config storage. If timeout exceeds, exception should be thrown.
+     *
+     * @param key     property key
+     * @param group   group
+     * @param timeout timeout
+     * @return target config value
+     */
+    protected abstract String getTargetConfig(String key, String group, long timeout);
 
-    protected abstract void addTargetListener(String key, TargetConfigListener listener);
+    /**
+     * Register a native listener to the backend config storage so that Dubbo has chance to get notified when the
+     * value changes.
+     *
+     * @param key      property key listener is interested.
+     * @param listener native listener for the backend config storage
+     */
+    protected abstract void addTargetListener(String key, TargetListener listener);
 
-    protected abstract TargetConfigListener createTargetConfigListener(String key, ConfigurationListener listener);
+    /**
+     * Create a native listener for the backend config storage, eventually ConfigurationListener will get notified once
+     * the value changes.
+     *
+     * @param key      property key the native listener will listen on
+     * @param listener ConfigurationListener instance
+     * @return native listener for the backend config storage
+     */
+    protected abstract TargetListener createTargetListener(String key, ConfigurationListener listener);
 
 }
diff --git a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeEvent.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeEvent.java
index d99d400..403ec75 100644
--- a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeEvent.java
+++ b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeEvent.java
@@ -17,7 +17,9 @@
 package org.apache.dubbo.configcenter;
 
 /**
+ * Config change event.
  *
+ * @see ConfigChangeType
  */
 public class ConfigChangeEvent {
     private String key;
diff --git a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeType.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeType.java
index 00f56f3..e810ddc 100644
--- a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeType.java
+++ b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeType.java
@@ -17,10 +17,21 @@
 package org.apache.dubbo.configcenter;
 
 /**
- *
+ * Config change event type
  */
 public enum ConfigChangeType {
+    /**
+     * A config is created.
+     */
     ADDED,
+
+    /**
+     * A config is updated.
+     */
     MODIFIED,
+
+    /**
+     * A config is deleted.
+     */
     DELETED
 }
diff --git a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigType.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigType.java
index e5ec836..d38e39d 100644
--- a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigType.java
+++ b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigType.java
@@ -17,9 +17,16 @@
 package org.apache.dubbo.configcenter;
 
 /**
- *
+ * Config type
  */
 public enum ConfigType {
+    /**
+     * For Dubbo dynamic config other than routing rules.
+     */
     CONFIGURATORS,
+
+    /**
+     * For Dubbo routing rules
+     */
     ROUTERS
 }
diff --git a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationListener.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationListener.java
index 50b2f42..bacaa14 100644
--- a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationListener.java
+++ b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationListener.java
@@ -19,11 +19,18 @@ package org.apache.dubbo.configcenter;
 import org.apache.dubbo.common.URL;
 
 /**
- *
+ * Config listener, will get notified when the config it listens on changes.
  */
 public interface ConfigurationListener {
 
+    /**
+     * Listener call back method. Listener gets notified by this method once there's any change happens on the config
+     * the listener listens on.
+     *
+     * @param event config change event
+     */
     void process(ConfigChangeEvent event);
 
+    // FIXME: why we need this?
     URL getUrl();
 }
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
index cf57b67..ef3e6d6 100644
--- 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
@@ -28,7 +28,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- *
+ * Utilities for manipulating configurations from different sources
  */
 public class ConfigurationUtils {
     private static final CompositeConfiguration compositeConfiguration;
@@ -64,17 +64,16 @@ public class ConfigurationUtils {
     }
 
     /**
-     * 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
+     * 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.
      */
     public static DynamicConfiguration getDynamicConfiguration() {
-        Set<Object> configurations = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getLoadedExtensionInstances();
+        Set<DynamicConfiguration> configurations = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getExtensions();
         if (CollectionUtils.isEmpty(configurations)) {
             return ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getDefaultExtension();
         } else {
-            return (DynamicConfiguration) configurations.iterator().next();
+            return configurations.iterator().next();
         }
     }
 
diff --git a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationWrapper.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationWrapper.java
index 9a22ddd..f60d560 100644
--- a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationWrapper.java
+++ b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationWrapper.java
@@ -20,7 +20,7 @@ import org.apache.dubbo.common.config.AbstractConfiguration;
 import org.apache.dubbo.common.config.Configuration;
 
 /**
- *
+ * A wrapper to fetch a config for the specific key with the different prefix in the specified order.
  */
 public class ConfigurationWrapper extends AbstractConfiguration {
     private String application;
@@ -36,6 +36,7 @@ public class ConfigurationWrapper extends AbstractConfiguration {
         this.delegate = configuration;
     }
 
+    // FIXME: I think the order is wrong, service.method.key go first, then service.key, and then application.key
     @Override
     protected Object getInternalProperty(String key) {
         Object value = delegate.getProperty(application + "." + key);
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 7adcc47..83faee6 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
@@ -21,27 +21,72 @@ import org.apache.dubbo.common.config.Configuration;
 import org.apache.dubbo.common.extension.SPI;
 
 /**
- *
+ * Dynamic configuration
  */
 @SPI("nop")
 public interface DynamicConfiguration extends Configuration {
 
-    void init();
-
-    URL getUrl();
-
-    void setUrl(URL url);
+    /**
+     * Init dynamic configuration from URL
+     *
+     * @param url the url in which info for initializing dynamic configuration is contained.
+     */
+    void initWith(URL url);
 
+    /**
+     * Register a configuration listener for a specified key
+     *
+     * @param key      the key to represent a configuration
+     * @param listener configuration listener
+     */
     void addListener(String key, ConfigurationListener listener);
 
+    /**
+     * Get the configuration mapped to the given key
+     *
+     * @param key property key
+     * @return target configuration mapped to the given key
+     */
     String getConfig(String key);
 
+    /**
+     * Get the configuration mapped to the given key and the given group
+     *
+     * @param key   property key
+     * @param group group
+     * @return target configuration mapped to the given key and the given group
+     */
     String getConfig(String key, String group);
 
+    /**
+     * Get the configuration mapped to the given key, and notify the passed-in listener
+     *
+     * @param key      property key
+     * @param listener configuration listener
+     * @return
+     */
     String getConfig(String key, ConfigurationListener listener);
 
-    String getConfig(String key, String group, long timeout, ConfigurationListener listener);
-
+    /**
+     * Get the configuration mapped to the given key and the given group, and notify the passed-in listener
+     *
+     * @param key      property key
+     * @param group    group
+     * @param listener configuration listener
+     * @return target configuration mapped to the given key and the given group
+     */
     String getConfig(String key, String group, ConfigurationListener listener);
 
+    /**
+     * Get the configuration mapped to the given key and the given group, and notify the passed-in listener. If the
+     * configuration fails to fetch after timeout exceeds, IllegalStateException will be thrown.
+     *
+     * @param key      property key
+     * @param group    group
+     * @param listener configuration listener
+     * @param timeout  timeout value for fetching the target config
+     * @return target configuration mapped to the given key and the given group, IllegalStateException will be thrown
+     * if timeout exceeds.
+     */
+    String getConfig(String key, String group, ConfigurationListener listener, long timeout);
 }
diff --git a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/support/nop/NopDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/support/nop/NopDynamicConfiguration.java
index f506935..1dc0794 100644
--- a/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/support/nop/NopDynamicConfiguration.java
+++ b/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/support/nop/NopDynamicConfiguration.java
@@ -21,28 +21,23 @@ import org.apache.dubbo.configcenter.ConfigurationListener;
 import org.apache.dubbo.configcenter.DynamicConfiguration;
 
 /**
- * The default extension of {@link DynamicConfiguration}.
- * If user does not specify a config centre, or specifies one that is not a valid extension, it will default to this one.
+ * The default extension of {@link DynamicConfiguration}. If user does not specify a config centre, or specifies one
+ * that is not a valid extension, it will default to this one.
  */
 public class NopDynamicConfiguration extends AbstractDynamicConfiguration {
 
     @Override
-    public void init() {
-
-    }
-
-    @Override
-    protected String getInternalProperty(String key, String group, long timeout) {
+    protected String getTargetConfig(String key, String group, long timeout) {
         return null;
     }
 
     @Override
     protected void addTargetListener(String key, Object o) {
-
+        // no-op
     }
 
     @Override
-    protected Object createTargetConfigListener(String key, ConfigurationListener listener) {
+    protected Object createTargetListener(String key, ConfigurationListener listener) {
         return null;
     }
 
diff --git a/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java
index f3f392d..efec2fb 100644
--- a/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java
+++ b/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java
@@ -52,7 +52,8 @@ public class ApolloDynamicConfiguration extends AbstractDynamicConfiguration<Con
     }
 
     @Override
-    public void init() {
+    public void initWith(URL url) {
+        super.initWith(url);
         /**
          * Instead of using Dubbo's configuration, I would suggest use the original configuration method Apollo provides.
          */
@@ -94,7 +95,7 @@ public class ApolloDynamicConfiguration extends AbstractDynamicConfiguration<Con
      * @return
      */
     @Override
-    protected String getInternalProperty(String key, String group, long timeout) {
+    protected String getTargetConfig(String key, String group, long timeout) {
         if (StringUtils.isNotEmpty(group) && !url.getParameter(Constants.CONFIG_GROUP_KEY, DEFAULT_GROUP).equals(group)) {
             Config config = ConfigService.getConfig(group);
             if (config != null) {
@@ -126,7 +127,7 @@ public class ApolloDynamicConfiguration extends AbstractDynamicConfiguration<Con
     }
 
     @Override
-    protected ConfigChangeListener createTargetConfigListener(String key, ConfigurationListener listener) {
+    protected ConfigChangeListener createTargetListener(String key, ConfigurationListener listener) {
         return new ApolloListener(listener);
     }
 
diff --git a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/archaius/ArchaiusDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/archaius/ArchaiusDynamicConfiguration.java
index 014958d..9ca06ec 100644
--- a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/archaius/ArchaiusDynamicConfiguration.java
+++ b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/archaius/ArchaiusDynamicConfiguration.java
@@ -42,7 +42,9 @@ public class ArchaiusDynamicConfiguration extends AbstractDynamicConfiguration<R
     }
 
     @Override
-    public void init() {
+    public void initWith(URL url) {
+        super.initWith(url);
+
         //  String address = env.getCompositeConf().getString(ADDRESS_KEY);
         //  String app = env.getCompositeConf().getString(APP_KEY);
 
@@ -80,7 +82,7 @@ public class ArchaiusDynamicConfiguration extends AbstractDynamicConfiguration<R
      * @return
      */
     @Override
-    protected String getInternalProperty(String key, String group, long timeout) {
+    protected String getTargetConfig(String key, String group, long timeout) {
         if (StringUtils.isNotEmpty(group)) {
             key = group + "." + key;
         }
@@ -112,7 +114,7 @@ public class ArchaiusDynamicConfiguration extends AbstractDynamicConfiguration<R
     }
 
     @Override
-    protected Runnable createTargetConfigListener(String key, ConfigurationListener listener) {
+    protected Runnable createTargetListener(String key, ConfigurationListener listener) {
         return new ArchaiusListener(key, listener);
     }
 
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 1d24236..78304bb 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
@@ -18,6 +18,7 @@ package org.apache.dubbo.container.log4j;
 
 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;
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 9ad920c..ca6dc2c 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
@@ -87,12 +87,7 @@ public class RegistryProtocol implements Protocol {
 
     public RegistryProtocol() {
         INSTANCE = this;
-        Set<Object> configurations = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getLoadedExtensionInstances();
-        if (CollectionUtils.isEmpty(configurations)) {
-            dynamicConfiguration = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getDefaultExtension();
-        } else {
-            dynamicConfiguration = (DynamicConfiguration) configurations.iterator().next();
-        }
+        dynamicConfiguration = ConfigurationUtils.getDynamicConfiguration();
     }
 
     public static RegistryProtocol getRegistryProtocol() {