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/15 03:30:10 UTC

[incubator-dubbo] branch dev-metadata updated (21b4334 -> d11b876)

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

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


    from 21b4334  Merge branch 'dev-metadata' of github.com:apache/incubator-dubbo into dev-metadata
     new 042ab09  support standard spring PropertySource
     new e3916ef  add cluster-style address support for configcenter
     new d11b876  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/org/apache/dubbo/common/Constants.java    |  2 +-
 .../org/apache/dubbo/config/AbstractConfig.java    |  2 +-
 .../dubbo/config/AbstractInterfaceConfig.java      | 16 ++++-
 .../org/apache/dubbo/config/ApplicationConfig.java | 24 +------
 .../apache/dubbo/config/ConfigCenterConfig.java    | 84 ++++++++++++----------
 .../org/apache/dubbo/config/ServiceConfig.java     | 15 +++-
 .../apache/dubbo/config/context/Environment.java   | 22 ++++++
 .../org/apache/dubbo/config/support/Parameter.java |  2 +
 .../dubbo/config/spring/ConfigCenterBean.java      | 53 +++++++++++---
 .../src/main/resources/META-INF/compat/dubbo.xsd   |  4 +-
 .../src/main/resources/META-INF/dubbo.xsd          |  4 +-
 .../META-INF/spring/dubbo-demo-consumer.xml        |  2 +-
 .../META-INF/spring/dubbo-demo-provider.xml        |  2 +-
 .../governance/DynamicConfigurationFactory.java    |  2 +-
 .../support/apollo/ApolloDynamicConfiguration.java |  2 +-
 .../archaius/ArchaiusDynamicConfiguration.java     |  2 +-
 16 files changed, 155 insertions(+), 83 deletions(-)


[incubator-dubbo] 01/03: support standard spring PropertySource

Posted by li...@apache.org.
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

commit 042ab09db1940c73b5171b88b2cbb1607477af4d
Author: ken.lj <ke...@gmail.com>
AuthorDate: Tue Nov 13 23:02:39 2018 +0800

    support standard spring PropertySource
---
 .../dubbo/config/spring/ConfigCenterBean.java      | 25 ++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

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 653a2f5..a0bc0a6 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
@@ -25,7 +25,9 @@ import org.springframework.beans.factory.InitializingBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.context.EnvironmentAware;
+import org.springframework.core.env.ConfigurableEnvironment;
 import org.springframework.core.env.Environment;
+import org.springframework.core.env.PropertySource;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -85,9 +87,20 @@ public class ConfigCenterBean extends ConfigCenterConfig implements Initializing
             Map<String, String> externalProperties = new HashMap<>();
             try {
                 if (rawProperties instanceof Map) {
-                    externalProperties = (Map<String, String>) rawProperties;
+                    externalProperties.putAll((Map<String, String>) rawProperties);
                 } else if (rawProperties instanceof String) {
-                    externalProperties = parseProperties((String) rawProperties);
+                    externalProperties.putAll(parseProperties((String) rawProperties));
+                }
+
+                if (environment instanceof ConfigurableEnvironment && externalProperties.isEmpty()) {
+                    ConfigurableEnvironment configurableEnvironment = (ConfigurableEnvironment) environment;
+                    PropertySource propertySource = configurableEnvironment.getPropertySources().get("dubbo.properties");
+                    Object source = propertySource.getSource();
+                    if (source instanceof Map) {
+                        ((Map<String, Object>) source).forEach((k, v) -> {
+                            externalProperties.put(k, (String) v);
+                        });
+                    }
                 }
                 org.apache.dubbo.config.context.Environment.getInstance().updateExternalConfigurationMap(externalProperties);
             } catch (Exception e) {
@@ -95,4 +108,12 @@ public class ConfigCenterBean extends ConfigCenterConfig implements Initializing
             }
         }
     }
+
+    public boolean isAuto() {
+        return auto;
+    }
+
+    public void setAuto(boolean auto) {
+        this.auto = auto;
+    }
 }


[incubator-dubbo] 03/03: Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata

Posted by li...@apache.org.
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

commit d11b8762ba3c99c42ffc863b8225a153595ec47f
Merge: e3916ef 21b4334
Author: ken.lj <ke...@gmail.com>
AuthorDate: Thu Nov 15 11:29:41 2018 +0800

    Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata

 .../java/org/apache/dubbo/common/Constants.java    |  6 +-
 .../src/main/java/org/apache/dubbo/common/URL.java |  8 +-
 .../dubbo/config/RegistryDataConfigTest.java       | 87 ++++++++++++++++++++++
 .../dubbo/config/AbstractInterfaceConfig.java      |  5 +-
 .../apache/dubbo/config/RegistryDataConfig.java    |  2 +-
 .../annotation/DubboConfigConfiguration.java       |  6 +-
 .../src/main/resources/META-INF/compat/dubbo.xsd   | 20 ++---
 .../src/main/resources/META-INF/dubbo.xsd          | 20 ++---
 .../META-INF/spring/dubbo-demo-provider.xml        |  2 +-
 .../registry/integration/RegistryProtocol.java     | 25 ++-----
 .../dubbo/registry/dubbo/RegistryProtocolTest.java | 11 ---
 .../registry/integration/RegistryProtocolTest.java | 23 ++++++
 12 files changed, 156 insertions(+), 59 deletions(-)

diff --cc dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml
index 566a7c7,5f0d473..f1e28d2
--- 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,10 -25,10 +25,10 @@@
      <dubbo:application name="demo-provider"/>
      <!--<dubbo:provider tag="tag3"/>-->
  
-     <dubbo:registry group="dubboregistrygroup1" address="zookeeper://127.0.0.1:2181" simple="false">
+     <dubbo:registry group="dubboregistrygroup1" address="zookeeper://127.0.0.1:2181">
      </dubbo:registry>
  
 -    <dubbo:configcenter type="zookeeper" address="127.0.0.1:2181" namespace="dubboregistrygroup1"
 +    <dubbo:configcenter address="zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182" namespace="dubboregistrygroup1"
                          configfile="dubbo.properties" appname="demo-provider"/>
  
      <!-- use dubbo protocol to export service on port 20880 -->


[incubator-dubbo] 02/03: add cluster-style address support for configcenter

Posted by li...@apache.org.
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

commit e3916ef64ade94129dc7866909ee4c2e237838cd
Author: ken.lj <ke...@gmail.com>
AuthorDate: Thu Nov 15 10:58:39 2018 +0800

    add cluster-style address support for configcenter
---
 .../java/org/apache/dubbo/common/Constants.java    |  2 +-
 .../org/apache/dubbo/config/AbstractConfig.java    |  2 +-
 .../dubbo/config/AbstractInterfaceConfig.java      | 16 ++++-
 .../org/apache/dubbo/config/ApplicationConfig.java | 24 +------
 .../apache/dubbo/config/ConfigCenterConfig.java    | 84 ++++++++++++----------
 .../org/apache/dubbo/config/ServiceConfig.java     | 15 +++-
 .../apache/dubbo/config/context/Environment.java   | 22 ++++++
 .../org/apache/dubbo/config/support/Parameter.java |  2 +
 .../dubbo/config/spring/ConfigCenterBean.java      | 40 +++++++----
 .../src/main/resources/META-INF/compat/dubbo.xsd   |  4 +-
 .../src/main/resources/META-INF/dubbo.xsd          |  4 +-
 .../META-INF/spring/dubbo-demo-consumer.xml        |  2 +-
 .../META-INF/spring/dubbo-demo-provider.xml        |  2 +-
 .../governance/DynamicConfigurationFactory.java    |  2 +-
 .../support/apollo/ApolloDynamicConfiguration.java |  2 +-
 .../archaius/ArchaiusDynamicConfiguration.java     |  2 +-
 16 files changed, 138 insertions(+), 87 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
index a4b64ca..2d01407 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
@@ -58,7 +58,7 @@ public class Constants {
 
     public static final String ROUTERS_SUFFIX = ".routers";
 
-    public static final String CONFIG_TYPE_KEY = "config.type";
+    public static final String DEFAULT_CONFIG_PROTOCOL = "nop";
     public static final String CONFIG_ADDRESS_KEY = "config.address";
     public static final String CONFIG_ENV_KEY = "config.env";
     public static final String CONFIG_CLUSTER_KEY = "config.cluster";
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 ffb0f03..243e8d2 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
@@ -570,7 +570,7 @@ public abstract class AbstractConfig implements Serializable {
             getter = getClass().getMethod("is" + propertyName);
         }
         Parameter parameter = getter.getAnnotation(Parameter.class);
-        if (parameter != null && StringUtils.isNotEmpty(parameter.key())) {
+        if (parameter != null && StringUtils.isNotEmpty(parameter.key()) && parameter.propertyKey()) {
             propertyName = parameter.key();
         } else {
             propertyName = propertyName.toLowerCase();
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 6e41fe6..e1f42ad 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
@@ -25,6 +25,7 @@ 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.metadata.integration.MetadataReportService;
 import org.apache.dubbo.monitor.MonitorFactory;
@@ -36,6 +37,7 @@ import org.apache.dubbo.rpc.cluster.Cluster;
 import org.apache.dubbo.rpc.support.MockInvoker;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -125,8 +127,18 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
 
         if (registries == null || registries.isEmpty()) {
             registries = new ArrayList<>();
-            RegistryConfig registryConfig = new RegistryConfig();
-            registries.add(registryConfig);
+            String registryIds = Environment.getInstance().getStartupCompositeConf(null, null).getString("dubbo.registries");
+            if (StringUtils.isNotEmpty(registryIds)) {
+                Arrays.stream(Constants.COMMA_SPLIT_PATTERN.split(registryIds))
+                        .map(regId -> {
+                            RegistryConfig registryConfig = new RegistryConfig();
+                            registryConfig.setId(regId);
+                            return registryConfig;
+                        })
+                        .forEach(registries::add);
+            } else {
+                registries.add(new RegistryConfig());
+            }
         }
 
         for (RegistryConfig registryConfig : registries) {
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
index 6328725..f4c529a 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
@@ -81,10 +81,6 @@ public class ApplicationConfig extends AbstractConfig {
     // should we accept foreign ip or not?
     private Boolean qosAcceptForeignIp;
 
-    // used for dynamic configuration
-    private String config;
-    private String address;
-
     // customized parameters
     private Map<String, String> parameters;
 
@@ -99,7 +95,7 @@ public class ApplicationConfig extends AbstractConfig {
         setName(name);
     }
 
-    @Parameter(key = Constants.APPLICATION_KEY, required = true)
+    @Parameter(key = Constants.APPLICATION_KEY, required = true, propertyKey = false)
     public String getName() {
         return name;
     }
@@ -255,24 +251,6 @@ public class ApplicationConfig extends AbstractConfig {
         this.qosAcceptForeignIp = qosAcceptForeignIp;
     }
 
-    @Parameter(key = "config.type")
-    public String getConfig() {
-        return config;
-    }
-
-    public void setConfig(String config) {
-        this.config = config;
-    }
-
-    @Parameter(key = "config.address")
-    public String getAddress() {
-        return address;
-    }
-
-    public void setAddress(String address) {
-        this.address = address;
-    }
-
     public Map<String, String> getParameters() {
         return parameters;
     }
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 da0151f..6904413 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,6 +20,7 @@ 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.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.governance.DynamicConfiguration;
@@ -35,7 +36,7 @@ import java.util.Properties;
  *
  */
 public class ConfigCenterConfig extends AbstractConfig {
-    private String type;
+    private String protocol;
     private String address;
     private String env;
     private String cluster;
@@ -61,46 +62,50 @@ public class ConfigCenterConfig extends AbstractConfig {
     public ConfigCenterConfig() {
     }
 
-    private URL toConfigUrl() {
-        String host = address;
-        int port = 0;
+    public void init() {
+        DynamicConfiguration dynamicConfiguration = startDynamicConfiguration();
+        String configContent = dynamicConfiguration.getConfig(configfile, group);
+
+        String appGroup = getApplicationName();
+        String appConfigContent = null;
+        if (StringUtils.isNotEmpty(appGroup)) {
+            appConfigContent = dynamicConfiguration.getConfig
+                    (
+                            StringUtils.isNotEmpty(localconfigfile) ? localconfigfile : configfile,
+                            appGroup
+                    );
+        }
         try {
-            if (StringUtils.isNotEmpty(address)) {
-                String[] addrs = address.split(":");
-                if (addrs.length == 2) {
-                    host = addrs[0];
-                    port = Integer.parseInt(addrs[1]);
-                }
-            }
-        } catch (Exception e) {
-            throw e;
+            Environment.getInstance().setConfigCenterFirst(priority);
+            Environment.getInstance().updateExternalConfigurationMap(parseProperties(configContent));
+            Environment.getInstance().updateAppExternalConfigurationMap(parseProperties(appConfigContent));
+        } catch (IOException e) {
+            throw new IllegalStateException("Failed to parse configurations from Config Center.", e);
         }
-
-        Map<String, String> map = this.getMetaData();
-        return new URL(Constants.CONFIG_PROTOCOL, username, password, host, port, ConfigCenterConfig.class.getSimpleName(), map);
     }
 
-    public void init() {
+    /*public void initWithoutRemoteConfig() {
+        startDynamicConfiguration();
+    }*/
+
+    private DynamicConfiguration startDynamicConfiguration() {
         // give jvm properties the chance to override local configs, e.g., -Ddubbo.configcenter.config.priority
         refresh();
+//        checkConfigCenter();
 
         URL url = toConfigUrl();
         DynamicConfiguration dynamicConfiguration = ExtensionLoader.getExtensionLoader(DynamicConfigurationFactory.class).getAdaptiveExtension().getDynamicConfiguration(url);
         Environment.getInstance().setDynamicConfiguration(dynamicConfiguration);
-        String configContent = dynamicConfiguration.getConfig(configfile, group);
+        return dynamicConfiguration;
+    }
 
-        String appConfigContent = dynamicConfiguration.getConfig
-                (
-                        StringUtils.isNotEmpty(localconfigfile) ? localconfigfile : configfile,
-                        getApplicationName()
-                );
-        try {
-            Environment.getInstance().setConfigCenterFirst(priority);
-            Environment.getInstance().updateExternalConfigurationMap(parseProperties(configContent));
-            Environment.getInstance().updateAppExternalConfigurationMap(parseProperties(appConfigContent));
-        } catch (IOException e) {
-            throw new IllegalStateException("Failed to parse configurations from Config Center.", e);
+    private URL toConfigUrl() {
+        Map<String, String> map = this.getMetaData();
+        if (StringUtils.isNotEmpty(env) && StringUtils.isEmpty(address)) {
+            address = Constants.ANYHOST_VALUE;
         }
+        map.put(Constants.PATH_KEY, ConfigCenterConfig.class.getSimpleName());
+        return UrlUtils.parseURL(address, map);
     }
 
     private String getApplicationName() {
@@ -116,7 +121,7 @@ public class ConfigCenterConfig extends AbstractConfig {
 
     protected Map<String, String> parseProperties(String content) throws IOException {
         Map<String, String> map = new HashMap<>();
-        if (content == null) {
+        if (StringUtils.isEmpty(content)) {
             logger.warn("You specified the config centre, but there's not even one single config item in it.");
         } else {
             Properties properties = new Properties();
@@ -128,16 +133,16 @@ public class ConfigCenterConfig extends AbstractConfig {
         return map;
     }
 
-    @Parameter(key = Constants.CONFIG_TYPE_KEY)
-    public String getType() {
-        return type;
+
+    public String getProtocol() {
+        return protocol;
     }
 
-    public void setType(String type) {
-        this.type = type;
+    public void setProtocol(String protocol) {
+        this.protocol = protocol;
     }
 
-    @Parameter(key = Constants.CONFIG_ADDRESS_KEY)
+    @Parameter(excluded = true)
     public String getAddress() {
         return address;
     }
@@ -268,4 +273,11 @@ public class ConfigCenterConfig extends AbstractConfig {
     public void setApplication(ApplicationConfig application) {
         this.application = application;
     }
+
+    private void checkConfigCenter() {
+        if ((StringUtils.isEmpty(env) && StringUtils.isEmpty(address))
+                || (StringUtils.isEmpty(protocol) && (StringUtils.isEmpty(address) || !address.contains("://")))) {
+            throw new IllegalStateException("You must specify the right parameter for configcenter.");
+        }
+    }
 }
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 4d314ef..394a8f6 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
@@ -26,6 +26,7 @@ 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;
@@ -729,7 +730,19 @@ public class ServiceConfig<T> extends AbstractServiceConfig {
         }
         // backward compatibility
         if (protocols == null || protocols.isEmpty()) {
-            setProtocol(new ProtocolConfig());
+            //check 'dubbo.protocols=dubboProtocolId,hessianProtocolId' and decide if we need multiple protocols
+            String protocolIds = Environment.getInstance().getStartupCompositeConf(null, null).getString("dubbo.protocols");
+            if (StringUtils.isNotEmpty(protocolIds)) {
+                Arrays.stream(Constants.COMMA_SPLIT_PATTERN.split(protocolIds))
+                        .map(pId -> {
+                            ProtocolConfig protocolConfig = new ProtocolConfig();
+                            protocolConfig.setId(pId);
+                            return protocolConfig;
+                        })
+                        .forEach(protocols::add);
+            } else {
+                setProtocol(new ProtocolConfig());
+            }
         }
         for (ProtocolConfig protocolConfig : protocols) {
             if (StringUtils.isEmpty(protocolConfig.getName())) {
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java
index 0a2bf12..c3e07cc 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java
@@ -25,6 +25,7 @@ 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.StringUtils;
+import org.apache.dubbo.config.ConfigCenterConfig;
 import org.apache.dubbo.governance.DynamicConfiguration;
 import org.apache.dubbo.governance.DynamicConfigurationFactory;
 
@@ -49,6 +50,7 @@ public class Environment {
     private volatile DynamicConfiguration dynamicConfiguration;
 
     private volatile boolean isConfigCenterFirst = true;
+    private volatile ConfigCenterConfig configCenter;
 
     private Map<String, String> externalConfigurationMap = new HashMap<>();
     private Map<String, String> appExternalConfigurationMap = new HashMap<>();
@@ -85,6 +87,26 @@ 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<String, String> externalConfiguration) {
+        this.externalConfigurationMap = externalConfiguration;
+        if (configCenter == null) {
+            configCenter = new ConfigCenterConfig();
+        }
+        configCenter.init();
+    }
+
+    public synchronized void setAppExternalConfiguration(Map<String, String> appExternalConfiguration) {
+        this.appExternalConfigurationMap = appExternalConfiguration;
+        if (configCenter == null) {
+            configCenter = new ConfigCenterConfig();
+        }
+        configCenter.init();
+    }
+
     public void updateExternalConfigurationMap(Map<String, String> externalMap) {
         this.externalConfigurationMap.putAll(externalMap);
     }
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/support/Parameter.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/support/Parameter.java
index 0183a22..56336aa 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/support/Parameter.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/support/Parameter.java
@@ -42,4 +42,6 @@ public @interface Parameter {
 
     boolean append() default false;
 
+    boolean propertyKey() default true;
+
 }
\ No newline at end of file
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 a0bc0a6..0ff972a 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
@@ -19,6 +19,7 @@ package org.apache.dubbo.config.spring;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ConfigCenterConfig;
 import org.apache.dubbo.config.spring.extension.SpringExtensionFactory;
+import org.apache.dubbo.config.support.Parameter;
 import org.springframework.beans.factory.BeanFactoryUtils;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -83,18 +84,28 @@ public class ConfigCenterBean extends ConfigCenterConfig implements Initializing
     @Override
     public void setEnvironment(Environment environment) {
         if (auto) {
-            Object rawProperties = environment.getProperty("dubbo.properties", Object.class);
-            Map<String, String> externalProperties = new HashMap<>();
-            try {
-                if (rawProperties instanceof Map) {
-                    externalProperties.putAll((Map<String, String>) rawProperties);
-                } else if (rawProperties instanceof String) {
-                    externalProperties.putAll(parseProperties((String) rawProperties));
-                }
+            Map<String, String> externalProperties = getConfigurations(getConfigfile(), environment);
+            Map<String, String> 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);
+        }
+    }
+
+    private Map<String, String> getConfigurations(String key, Environment environment) {
+        Object rawProperties = environment.getProperty(key, Object.class);
+        Map<String, String> externalProperties = new HashMap<>();
+        try {
+            if (rawProperties instanceof Map) {
+                externalProperties.putAll((Map<String, String>) rawProperties);
+            } else if (rawProperties instanceof String) {
+                externalProperties.putAll(parseProperties((String) rawProperties));
+            }
 
-                if (environment instanceof ConfigurableEnvironment && externalProperties.isEmpty()) {
-                    ConfigurableEnvironment configurableEnvironment = (ConfigurableEnvironment) environment;
-                    PropertySource propertySource = configurableEnvironment.getPropertySources().get("dubbo.properties");
+            if (environment instanceof ConfigurableEnvironment && externalProperties.isEmpty()) {
+                ConfigurableEnvironment configurableEnvironment = (ConfigurableEnvironment) environment;
+                PropertySource propertySource = configurableEnvironment.getPropertySources().get(key);
+                if (propertySource != null) {
                     Object source = propertySource.getSource();
                     if (source instanceof Map) {
                         ((Map<String, Object>) source).forEach((k, v) -> {
@@ -102,13 +113,14 @@ public class ConfigCenterBean extends ConfigCenterConfig implements Initializing
                         });
                     }
                 }
-                org.apache.dubbo.config.context.Environment.getInstance().updateExternalConfigurationMap(externalProperties);
-            } catch (Exception e) {
-                throw new IllegalStateException(e);
             }
+        } catch (Exception e) {
+            throw new IllegalStateException(e);
         }
+        return externalProperties;
     }
 
+    @Parameter(excluded = true)
     public boolean isAuto() {
         return auto;
     }
diff --git a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd
index 9810969..b1a2fc3 100644
--- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd
+++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd
@@ -597,9 +597,9 @@
         <xsd:sequence minOccurs="0" maxOccurs="unbounded">
             <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
         </xsd:sequence>
-        <xsd:attribute name="type" type="xsd:string" use="required">
+        <xsd:attribute name="protocol" type="xsd:string" use="optional">
             <xsd:annotation>
-                <xsd:documentation><![CDATA[ The config center type. ]]></xsd:documentation>
+                <xsd:documentation><![CDATA[ The config center protocol. ]]></xsd:documentation>
             </xsd:annotation>
         </xsd:attribute>
         <xsd:attribute name="address" type="xsd:string" use="optional">
diff --git a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd
index b2ff6cb..51b29f5 100644
--- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd
+++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd
@@ -591,9 +591,9 @@
         <xsd:sequence minOccurs="0" maxOccurs="unbounded">
             <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
         </xsd:sequence>
-        <xsd:attribute name="type" type="xsd:string" use="required">
+        <xsd:attribute name="protocol" type="xsd:string">
             <xsd:annotation>
-                <xsd:documentation><![CDATA[ The config center type. ]]></xsd:documentation>
+                <xsd:documentation><![CDATA[ The config center protocol. ]]></xsd:documentation>
             </xsd:annotation>
         </xsd:attribute>
         <xsd:attribute name="address" type="xsd:string" use="optional">
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 108b566..dc303db 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
@@ -27,7 +27,7 @@
 
     <dubbo:registry group="dubboregistrygroup1" address="zookeeper://127.0.0.1:2181"/>
 
-    <dubbo:configcenter type="zookeeper" address="127.0.0.1:2181" namespace="dubboregistrygroup1"
+    <dubbo:configcenter protocol="zookeeper" address="127.0.0.1:2181" namespace="dubboregistrygroup1"
                         configfile="dubbo.properties"/>
 
     <!-- generate proxy for the remote service, then demoService can be used in the same way as the
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 7af535e..566a7c7 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
@@ -28,7 +28,7 @@
     <dubbo:registry group="dubboregistrygroup1" address="zookeeper://127.0.0.1:2181" simple="false">
     </dubbo:registry>
 
-    <dubbo:configcenter type="zookeeper" address="127.0.0.1:2181" namespace="dubboregistrygroup1"
+    <dubbo:configcenter address="zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182" namespace="dubboregistrygroup1"
                         configfile="dubbo.properties" appname="demo-provider"/>
 
     <!-- use dubbo protocol to export service on port 20880 -->
diff --git a/dubbo-governance/dubbo-governance-api/src/main/java/org/apache/dubbo/governance/DynamicConfigurationFactory.java b/dubbo-governance/dubbo-governance-api/src/main/java/org/apache/dubbo/governance/DynamicConfigurationFactory.java
index d986eae..d4340d8 100644
--- a/dubbo-governance/dubbo-governance-api/src/main/java/org/apache/dubbo/governance/DynamicConfigurationFactory.java
+++ b/dubbo-governance/dubbo-governance-api/src/main/java/org/apache/dubbo/governance/DynamicConfigurationFactory.java
@@ -27,7 +27,7 @@ import org.apache.dubbo.common.extension.SPI;
 @SPI("nop")
 public interface DynamicConfigurationFactory {
 
-    @Adaptive({Constants.CONFIG_TYPE_KEY})
+    @Adaptive({Constants.PROTOCOL_KEY})
     DynamicConfiguration getDynamicConfiguration(URL url);
 
     DynamicConfiguration getExistedDynamicConfiguration();
diff --git a/dubbo-governance/dubbo-governance-apollo/src/main/java/org/apache/dubbo/governance/support/apollo/ApolloDynamicConfiguration.java b/dubbo-governance/dubbo-governance-apollo/src/main/java/org/apache/dubbo/governance/support/apollo/ApolloDynamicConfiguration.java
index 749f290..f74ec14 100644
--- a/dubbo-governance/dubbo-governance-apollo/src/main/java/org/apache/dubbo/governance/support/apollo/ApolloDynamicConfiguration.java
+++ b/dubbo-governance/dubbo-governance-apollo/src/main/java/org/apache/dubbo/governance/support/apollo/ApolloDynamicConfiguration.java
@@ -59,7 +59,7 @@ public class ApolloDynamicConfiguration extends AbstractDynamicConfiguration<Con
 //        String configEnv = env.getCompositeConf().getString(ENV_KEY);
 //        String configCluster = env.getCompositeConf().getString(CLUSTER_KEY);
         String configEnv = url.getParameter(Constants.CONFIG_ENV_KEY);
-        String configAddr = url.getAddress();
+        String configAddr = url.getBackupAddress();
         String configCluster = url.getParameter(Constants.CONFIG_CLUSTER_KEY);
         if (configEnv != null) {
             System.setProperty(APOLLO_ENV_KEY, configEnv);
diff --git a/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/ArchaiusDynamicConfiguration.java b/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/ArchaiusDynamicConfiguration.java
index e35f95d..15e24bd 100644
--- a/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/ArchaiusDynamicConfiguration.java
+++ b/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/ArchaiusDynamicConfiguration.java
@@ -43,7 +43,7 @@ public class ArchaiusDynamicConfiguration extends AbstractDynamicConfiguration<R
         //  String address = env.getCompositeConf().getString(ADDRESS_KEY);
         //  String app = env.getCompositeConf().getString(APP_KEY);
 
-        String address = url.getParameter(Constants.CONFIG_ADDRESS_KEY, url.getAddress());
+        String address = url.getBackupAddress();
         if (!address.equals(Constants.ANYHOST_VALUE)) {
             System.setProperty(ZooKeeperConfigurationSource.ARCHAIUS_SOURCE_ADDRESS_KEY, address);
         }