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

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


The following commit(s) were added to refs/heads/master by this push:
     new 23903ba  [Dubbo-3266] Change DynamicConfiguration definition to better 
adapt to Apollo's namespace storage model. (#3271)
23903ba is described below

commit 23903ba32aa3dd4878263e93e3267cfc8a7e0f26
Author: ken.lj <[email protected]>
AuthorDate: Mon May 20 09:59:30 2019 +0800

    [Dubbo-3266] Change DynamicConfiguration definition to better adapt to 
Apollo's namespace storage model. (#3271)
---
 .../dubbo/config/AbstractInterfaceConfig.java      |  4 +-
 .../apache/dubbo/config/ConfigCenterConfig.java    | 51 ++++++++++++++--------
 .../dubbo/config/builders/ConfigCenterBuilder.java |  6 ---
 .../apache/dubbo/config/AbstractConfigTest.java    | 20 +++++++++
 .../config/builders/ConfigCenterBuilderTest.java   | 10 +----
 .../dubbo/config/spring/ConfigCenterBean.java      | 39 +++--------------
 .../src/main/resources/META-INF/compat/dubbo.xsd   |  9 ++--
 .../src/main/resources/META-INF/dubbo.xsd          |  9 ++--
 .../dubbo/configcenter/DynamicConfiguration.java   | 29 ++++++++++--
 .../support/nop/NopDynamicConfiguration.java       |  5 +++
 .../mock/MockDynamicConfiguration.java             |  5 +++
 .../support/apollo/ApolloDynamicConfiguration.java | 32 ++++++++++++--
 .../consul/ConsulDynamicConfiguration.java         |  5 +++
 .../support/etcd/EtcdDynamicConfiguration.java     |  5 +++
 .../support/nacos/NacosDynamicConfiguration.java   |  5 +++
 .../zookeeper/ZookeeperDynamicConfiguration.java   | 14 ++++++
 .../ZookeeperDynamicConfigurationTest.java         |  2 +-
 17 files changed, 165 insertions(+), 85 deletions(-)

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 143d085..cc39451 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
@@ -287,12 +287,12 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
                 return;
             }
             DynamicConfiguration dynamicConfiguration = 
getDynamicConfiguration(configCenter.toUrl());
-            String configContent = 
dynamicConfiguration.getConfig(configCenter.getConfigFile(), 
configCenter.getGroup());
+            String configContent = 
dynamicConfiguration.getConfigs(configCenter.getConfigFile(), 
configCenter.getGroup());
 
             String appGroup = application != null ? application.getName() : 
null;
             String appConfigContent = null;
             if (StringUtils.isNotEmpty(appGroup)) {
-                appConfigContent = dynamicConfiguration.getConfig
+                appConfigContent = dynamicConfiguration.getConfigs
                         
(StringUtils.isNotEmpty(configCenter.getAppConfigFile()) ? 
configCenter.getAppConfigFile() : configCenter.getConfigFile(),
                          appGroup
                         );
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 d65f2e2..ed511fd 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,6 +18,7 @@ package org.apache.dubbo.config;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.config.Environment;
+import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.common.utils.UrlUtils;
 import org.apache.dubbo.config.support.Parameter;
@@ -28,15 +29,14 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;
 import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;
-import static org.apache.dubbo.config.Constants.CONFIG_APPNAME_KEY;
 import static 
org.apache.dubbo.common.constants.ConfigConstants.CONFIG_CHECK_KEY;
 import static 
org.apache.dubbo.common.constants.ConfigConstants.CONFIG_CLUSTER_KEY;
-import static org.apache.dubbo.config.Constants.CONFIG_CONFIGFILE_KEY;
-import static org.apache.dubbo.config.Constants.CONFIG_ENABLE_KEY;
 import static 
org.apache.dubbo.common.constants.ConfigConstants.CONFIG_GROUP_KEY;
 import static 
org.apache.dubbo.common.constants.ConfigConstants.CONFIG_NAMESPACE_KEY;
-import static org.apache.dubbo.config.Constants.CONFIG_TIMEOUT_KEY;
 import static 
org.apache.dubbo.common.constants.ConfigConstants.ZOOKEEPER_PROTOCOL;
+import static org.apache.dubbo.config.Constants.CONFIG_CONFIGFILE_KEY;
+import static org.apache.dubbo.config.Constants.CONFIG_ENABLE_KEY;
+import static org.apache.dubbo.config.Constants.CONFIG_TIMEOUT_KEY;
 
 /**
  * ConfigCenterConfig
@@ -46,20 +46,44 @@ public class ConfigCenterConfig extends AbstractConfig {
 
     private String protocol;
     private String address;
+
+    /* The config center cluster, it's real meaning may very on different 
Config Center products. */
     private String cluster;
-    private String namespace = "dubbo";
-    private String group = "dubbo";
+
+    /* The namespace of the config center, generally it's used for 
multi-tenant,
+    but it's real meaning depends on the actual Config Center you use.
+    */
+
+    private String namespace = CommonConstants.DUBBO;
+    /* The group of the config center, generally it's used to identify an 
isolated space for a batch of config items,
+    but it's real meaning depends on the actual Config Center you use.
+    */
+    private String group = CommonConstants.DUBBO;
     private String username;
     private String password;
     private Long timeout = 3000L;
+
+    // If the Config Center is given the highest priority, it will override 
all the other configurations
     private Boolean highestPriority = true;
+
+    // Decide the behaviour when initial connection try fails, 'true' means 
interrupt the whole process once fail.
     private Boolean check = true;
 
-    private String appName;
-    private String configFile = "dubbo.properties";
+    /* Used to specify the key that your properties file mapping to, most of 
the time you do not need to change this parameter.
+    Notice that for Apollo, this parameter is meaningless, set the 'namespace' 
is enough.
+    */
+    private String configFile = CommonConstants.DEFAULT_DUBBO_PROPERTIES;
+
+    /* the .properties file under 'configFile' is global shared while 
.properties under this one is limited only to this application
+    */
     private String appConfigFile;
 
-    // customized parameters
+    /* If the Config Center product you use have some special parameters that 
is not covered by this class, you can add it to here.
+    For example, with XML:
+      <dubbo:config-center>
+           <dubbo:parameter key="config.{your key}" value="{your value}" />
+      </dubbo:config-center>
+     */
     private Map<String, String> parameters;
 
     public ConfigCenterConfig() {
@@ -195,15 +219,6 @@ public class ConfigCenterConfig extends AbstractConfig {
         this.appConfigFile = appConfigFile;
     }
 
-    @Parameter(key = CONFIG_APPNAME_KEY, useKeyAsProperty = false)
-    public String getAppName() {
-        return appName;
-    }
-
-    public void setAppName(String appName) {
-        this.appName = appName;
-    }
-
     public Map<String, String> getParameters() {
         return parameters;
     }
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/builders/ConfigCenterBuilder.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/builders/ConfigCenterBuilder.java
index 44110e1..87ac00f 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/builders/ConfigCenterBuilder.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/builders/ConfigCenterBuilder.java
@@ -94,11 +94,6 @@ public class ConfigCenterBuilder extends 
AbstractBuilder<ConfigCenterConfig, Con
         return getThis();
     }
 
-    public ConfigCenterBuilder appName(String appName) {
-        this.appName = appName;
-        return getThis();
-    }
-
     public ConfigCenterBuilder configFile(String configFile) {
         this.configFile = configFile;
         return getThis();
@@ -133,7 +128,6 @@ public class ConfigCenterBuilder extends 
AbstractBuilder<ConfigCenterConfig, Con
         configCenter.setTimeout(timeout);
         configCenter.setHighestPriority(highestPriority);
         configCenter.setCheck(check);
-        configCenter.setAppName(appName);
         configCenter.setConfigFile(configFile);
         configCenter.setAppConfigFile(appConfigFile);
         configCenter.setParameters(parameters);
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
index 10cac65..9c57b32 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
@@ -467,6 +467,26 @@ public class AbstractConfigTest {
         Assertions.assertNull(metaData.get("key2"));
     }
 
+    @Test
+    public void testEquals() {
+        ApplicationConfig application1 = new ApplicationConfig();
+        ApplicationConfig application2 = new ApplicationConfig();
+        application1.setName("app1");
+        application2.setName("app2");
+        Assertions.assertNotEquals(application1, application2);
+        application1.setName("sameName");
+        application2.setName("sameName");
+        Assertions.assertEquals(application1, application2);
+
+        ProtocolConfig protocol1 = new ProtocolConfig();
+        protocol1.setHost("127.0.0.1");// excluded
+        protocol1.setName("dubbo");
+        ProtocolConfig protocol2 = new ProtocolConfig();
+        protocol2.setHost("127.0.0.2");// excluded
+        protocol2.setName("dubbo");
+        Assertions.assertEquals(protocol1, protocol2);
+    }
+
     @Retention(RetentionPolicy.RUNTIME)
     @Target({ElementType.ANNOTATION_TYPE})
     public @interface ConfigField {
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/builders/ConfigCenterBuilderTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/builders/ConfigCenterBuilderTest.java
index daf1fa8..1ab5acc 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/builders/ConfigCenterBuilderTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/builders/ConfigCenterBuilderTest.java
@@ -97,13 +97,6 @@ class ConfigCenterBuilderTest {
     }
 
     @Test
-    void appName() {
-        ConfigCenterBuilder builder = new ConfigCenterBuilder();
-        builder.appName("appName");
-        Assertions.assertEquals("appName", builder.build().getAppName());
-    }
-
-    @Test
     void configFile() {
         ConfigCenterBuilder builder = new ConfigCenterBuilder();
         builder.configFile("configFile");
@@ -146,7 +139,7 @@ class ConfigCenterBuilderTest {
     @Test
     void build() {
         ConfigCenterBuilder builder = new ConfigCenterBuilder();
-        
builder.check(true).protocol("protocol").address("address").appConfigFile("appConfigFile").appName("appName")
+        
builder.check(true).protocol("protocol").address("address").appConfigFile("appConfigFile")
                 
.cluster("cluster").configFile("configFile").group("group").highestPriority(false)
                 
.namespace("namespace").password("password").timeout(1000L).username("usernama")
                 .appendParameter("default.num", 
"one").id("id").prefix("prefix");
@@ -160,7 +153,6 @@ class ConfigCenterBuilderTest {
         Assertions.assertEquals("protocol", config.getProtocol());
         Assertions.assertEquals("address", config.getAddress());
         Assertions.assertEquals("appConfigFile", config.getAppConfigFile());
-        Assertions.assertEquals("appName", config.getAppName());
         Assertions.assertEquals("cluster", config.getCluster());
         Assertions.assertEquals("configFile", config.getConfigFile());
         Assertions.assertEquals("group", config.getGroup());
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 1ea2485..062c9da 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
@@ -18,13 +18,10 @@ package org.apache.dubbo.config.spring;
 
 import org.apache.dubbo.common.config.ConfigurationUtils;
 import org.apache.dubbo.common.utils.StringUtils;
-import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ConfigCenterConfig;
 import org.apache.dubbo.config.spring.extension.SpringExtensionFactory;
 
-import org.springframework.beans.factory.BeanFactoryUtils;
 import org.springframework.beans.factory.DisposableBean;
-import org.springframework.beans.factory.InitializingBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.context.EnvironmentAware;
@@ -41,12 +38,11 @@ import java.util.Map;
  * <p>
  * If use ConfigCenterConfig directly, you should make sure 
ConfigCenterConfig.init() is called before actually export/refer any Dubbo 
service.
  */
-public class ConfigCenterBean extends ConfigCenterConfig implements 
InitializingBean, ApplicationContextAware, DisposableBean, EnvironmentAware {
+public class ConfigCenterBean extends ConfigCenterConfig implements 
ApplicationContextAware, DisposableBean, EnvironmentAware {
 
     private transient ApplicationContext applicationContext;
 
     private Boolean includeSpringEnv = false;
-    private ApplicationConfig application;
 
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) {
@@ -55,27 +51,6 @@ public class ConfigCenterBean extends ConfigCenterConfig 
implements Initializing
     }
 
     @Override
-    public void afterPropertiesSet() throws Exception {
-        if (getApplication() == null) {
-            Map<String, ApplicationConfig> applicationConfigMap = 
applicationContext == null ? null : 
BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, 
ApplicationConfig.class, false, false);
-            if (applicationConfigMap != null && applicationConfigMap.size() > 
0) {
-                ApplicationConfig applicationConfig = null;
-                for (ApplicationConfig config : applicationConfigMap.values()) 
{
-                    if (config.isDefault() == null || config.isDefault()) {
-                        if (applicationConfig != null) {
-                            throw new IllegalStateException("Duplicate 
application configs: " + applicationConfig + " and " + config);
-                        }
-                        applicationConfig = config;
-                    }
-                }
-                if (applicationConfig != null) {
-                    setApplication(applicationConfig);
-                }
-            }
-        }
-    }
-
-    @Override
     public void destroy() throws Exception {
 
     }
@@ -83,8 +58,11 @@ public class ConfigCenterBean extends ConfigCenterConfig 
implements Initializing
     @Override
     public void setEnvironment(Environment environment) {
         if (includeSpringEnv) {
+            // Get PropertySource mapped to 'dubbo.properties' in Spring 
Environment.
             Map<String, String> externalProperties = 
getConfigurations(getConfigFile(), environment);
-            Map<String, String> appExternalProperties = 
getConfigurations(StringUtils.isNotEmpty(getAppConfigFile()) ? 
getAppConfigFile() : (StringUtils.isEmpty(getAppName()) ? ("application." + 
getConfigFile()) : (getAppName() + "." + getConfigFile())), environment);
+            // Get PropertySource mapped to 'application.dubbo.properties' in 
Spring Environment.
+            Map<String, String> appExternalProperties = 
getConfigurations(StringUtils.isNotEmpty(getAppConfigFile()) ? 
getAppConfigFile() : ("application." + getConfigFile()), environment);
+            // Refresh Dubbo Environment
             
org.apache.dubbo.common.config.Environment.getInstance().setExternalConfigMap(externalProperties);
             
org.apache.dubbo.common.config.Environment.getInstance().setAppExternalConfigMap(appExternalProperties);
         }
@@ -130,11 +108,4 @@ public class ConfigCenterBean extends ConfigCenterConfig 
implements Initializing
         this.includeSpringEnv = includeSpringEnv;
     }
 
-    public ApplicationConfig getApplication() {
-        return application;
-    }
-
-    public void setApplication(ApplicationConfig application) {
-        this.application = application;
-    }
 }
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 9e179ef..c12389f 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
@@ -650,18 +650,19 @@
         </xsd:attribute>
         <xsd:attribute name="cluster" type="xsd:string" use="optional">
             <xsd:annotation>
-                <xsd:documentation><![CDATA[ The config center cluster. 
]]></xsd:documentation>
+                <xsd:documentation><![CDATA[ The config center cluster, it's 
real meaning may very on different Config Center products. 
]]></xsd:documentation>
             </xsd:annotation>
         </xsd:attribute>
         <xsd:attribute name="namespace" type="xsd:string" use="optional">
             <xsd:annotation>
                 <xsd:documentation>
-                    <![CDATA[ The group of the config center, an isolated 
space for config items in the same config center. ]]></xsd:documentation>
+                    <![CDATA[ The namespace of the config center, generally 
it's used for multi-tenant, but it's real meaning depends on the actual Config 
Center you use. ]]></xsd:documentation>
             </xsd:annotation>
         </xsd:attribute>
-        <xsd:attribute name="app-name" type="xsd:string" use="optional">
+        <xsd:attribute name="group" type="xsd:string" use="optional">
             <xsd:annotation>
-                <xsd:documentation><![CDATA[ The group of the config center. 
]]></xsd:documentation>
+                <xsd:documentation>
+                    <![CDATA[ The group of the config center, generally it's 
used to identify an isolated space for a batch of config items, but it's real 
meaning depends on the actual Config Center you use.. ]]></xsd:documentation>
             </xsd:annotation>
         </xsd:attribute>
         <xsd:attribute name="config-file" 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 e517f0c..5cc621f 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
@@ -644,18 +644,19 @@
         </xsd:attribute>
         <xsd:attribute name="cluster" type="xsd:string" use="optional">
             <xsd:annotation>
-                <xsd:documentation><![CDATA[ The config center cluster. 
]]></xsd:documentation>
+                <xsd:documentation><![CDATA[ The config center cluster, it's 
real meaning may very on different Config Center products. 
]]></xsd:documentation>
             </xsd:annotation>
         </xsd:attribute>
         <xsd:attribute name="namespace" type="xsd:string" use="optional">
             <xsd:annotation>
                 <xsd:documentation>
-                    <![CDATA[ The group of the config center, an isolated 
space for config items in the same config center. ]]></xsd:documentation>
+                    <![CDATA[ The namespace of the config center, generally 
it's used for multi-tenant, but it's real meaning depends on the actual Config 
Center you use. ]]></xsd:documentation>
             </xsd:annotation>
         </xsd:attribute>
-        <xsd:attribute name="app-name" type="xsd:string" use="optional">
+        <xsd:attribute name="group" type="xsd:string" use="optional">
             <xsd:annotation>
-                <xsd:documentation><![CDATA[ The group of the config center. 
]]></xsd:documentation>
+                <xsd:documentation>
+                    <![CDATA[ The group of the config center, generally it's 
used to identify an isolated space for a batch of config items, but it's real 
meaning depends on the actual Config Center you use. ]]></xsd:documentation>
             </xsd:annotation>
         </xsd:attribute>
         <xsd:attribute name="config-file" type="xsd:string" use="optional">
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 620e8c2..23fc0f5 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
@@ -24,7 +24,14 @@ import java.util.Optional;
 import static 
org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;
 
 /**
- * Dynamic configuration
+ * Dynamic Configuration
+ * <br/>
+ * From the use scenario internally in framework, there're mainly three kinds 
of methods:
+ * <ul>
+ *     <li>1. getConfig, get governance rules or single config item from 
Config Center.</li>
+ *     <li>2. getConfigFile, get configuration file from Config Center at 
start up.</li>
+ *     <li>3. addListener/removeListener, add or remove listeners for 
governance rules or config items that need to watch.</li>
+ * </ul>
  */
 public interface DynamicConfiguration extends Configuration {
     String DEFAULT_GROUP = "dubbo";
@@ -78,7 +85,7 @@ public interface DynamicConfiguration extends Configuration {
      * @return target configuration mapped to the given key
      */
     default String getConfig(String key) {
-        return getConfig(key, null, 0L);
+        return getConfig(key, null, -1L);
     }
 
     /**
@@ -89,7 +96,7 @@ public interface DynamicConfiguration extends Configuration {
      * @return target configuration mapped to the given key and the given group
      */
     default String getConfig(String key, String group) {
-        return getConfig(key, group, 0L);
+        return getConfig(key, group, -1L);
     }
 
     /**
@@ -105,6 +112,22 @@ public interface DynamicConfiguration extends 
Configuration {
     String getConfig(String key, String group, long timeout) throws 
IllegalStateException;
 
     /**
+     * {@see #getConfig(String, String, long)}
+     *
+     * This method are mostly used to get a compound config file, such as a 
complete dubbo.properties file.
+     */
+    default String getConfigs(String key, String group) throws 
IllegalStateException {
+        return getConfigs(key, group, -1L);
+    }
+
+    /**
+     * {@see #getConfig(String, String, long)}
+     *
+     * This method are mostly used to get a compound config file, such as a 
complete dubbo.properties file.
+     */
+    String getConfigs(String key, String group, long timeout) throws 
IllegalStateException;
+
+    /**
      * Find DynamicConfiguration instance
      *
      * @return DynamicConfiguration instance
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 baa6f16..dbb91fd 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
@@ -50,4 +50,9 @@ public class NopDynamicConfiguration implements 
DynamicConfiguration {
     public String getConfig(String key, String group, long timeout) throws 
IllegalStateException {
         return null;
     }
+
+    @Override
+    public String getConfigs(String key, String group, long timeout) throws 
IllegalStateException {
+        return null;
+    }
 }
diff --git 
a/dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java
 
b/dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java
index ecc939f..05ce68b 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java
@@ -46,4 +46,9 @@ public class MockDynamicConfiguration implements 
DynamicConfiguration {
     public String getConfig(String key, String group, long timeout) throws 
IllegalStateException {
         return null;
     }
+
+    @Override
+    public String getConfigs(String key, String group, long timeout) throws 
IllegalStateException {
+        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 b89477b..120e025 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
@@ -27,7 +27,9 @@ import org.apache.dubbo.configcenter.DynamicConfiguration;
 
 import com.ctrip.framework.apollo.Config;
 import com.ctrip.framework.apollo.ConfigChangeListener;
+import com.ctrip.framework.apollo.ConfigFile;
 import com.ctrip.framework.apollo.ConfigService;
+import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
 import com.ctrip.framework.apollo.enums.ConfigSourceType;
 import com.ctrip.framework.apollo.enums.PropertyChangeType;
 import com.ctrip.framework.apollo.model.ConfigChange;
@@ -41,10 +43,10 @@ import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.stream.Collectors;
 
 import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;
+import static 
org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
 import static 
org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
 import static 
org.apache.dubbo.common.constants.ConfigConstants.CONFIG_CHECK_KEY;
 import static 
org.apache.dubbo.common.constants.ConfigConstants.CONFIG_CLUSTER_KEY;
-import static 
org.apache.dubbo.common.constants.ConfigConstants.CONFIG_GROUP_KEY;
 import static 
org.apache.dubbo.common.constants.ConfigConstants.CONFIG_NAMESPACE_KEY;
 
 /**
@@ -56,9 +58,11 @@ public class ApolloDynamicConfiguration implements 
DynamicConfiguration {
     private static final String APOLLO_ADDR_KEY = "apollo.meta";
     private static final String APOLLO_CLUSTER_KEY = "apollo.cluster";
     private static final String APOLLO_PROTOCOL_PREFIX = "http://";;
+    private static final String APOLLO_APPLICATION_KEY = "application";
 
     private URL url;
     private Config dubboConfig;
+    private ConfigFile dubboConfigFile;
     private ConcurrentMap<String, ApolloListener> listeners = new 
ConcurrentHashMap<>();
 
     ApolloDynamicConfiguration(URL url) {
@@ -78,6 +82,7 @@ public class ApolloDynamicConfiguration implements 
DynamicConfiguration {
         }
 
         dubboConfig = 
ConfigService.getConfig(url.getParameter(CONFIG_NAMESPACE_KEY, DEFAULT_GROUP));
+        dubboConfigFile = 
ConfigService.getConfigFile(url.getParameter(CONFIG_NAMESPACE_KEY, 
DEFAULT_GROUP), ConfigFileFormat.Properties);
         // Decide to fail or to continue when failed to connect to remote 
server.
         boolean check = url.getParameter(CONFIG_CHECK_KEY, true);
         if (dubboConfig.getSourceType() != ConfigSourceType.REMOTE) {
@@ -136,13 +141,32 @@ public class ApolloDynamicConfiguration implements 
DynamicConfiguration {
      */
     @Override
     public String getConfig(String key, String group, long timeout) throws 
IllegalStateException {
-        if (StringUtils.isNotEmpty(group) && 
!url.getParameter(CONFIG_GROUP_KEY, DEFAULT_GROUP).equals(group)) {
-            Config config = ConfigService.getAppConfig();
-            return config.getProperty(key, null);
+        if (StringUtils.isNotEmpty(group)) {
+            if (group.equals(url.getParameter(APPLICATION_KEY))) {
+                return ConfigService.getAppConfig().getProperty(key, null);
+            } else {
+                return ConfigService.getConfig(group).getProperty(key, null);
+            }
         }
         return dubboConfig.getProperty(key, null);
     }
 
+    @Override
+    public String getConfigs(String key, String group, long timeout) throws 
IllegalStateException {
+        if(StringUtils.isEmpty(group)) {
+            return dubboConfigFile.getContent();
+        }
+        if (group.equals(url.getParameter(APPLICATION_KEY))) {
+            return ConfigService.getConfigFile(APOLLO_APPLICATION_KEY, 
ConfigFileFormat.Properties).getContent();
+        }
+
+        ConfigFile configFile = ConfigService.getConfigFile(group, 
ConfigFileFormat.Properties);
+        if (configFile == null) {
+            throw new IllegalStateException("There is no namespace named " + 
group + " in Apollo.");
+        }
+        return configFile.getContent();
+    }
+
     /**
      * This method will be used by Configuration to get valid value at runtime.
      * The group is expected to be 'app level', which can be fetched from the 
'config.appnamespace' in url if necessary.
diff --git 
a/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java
 
b/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java
index 6727ed4..bdf337f 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java
@@ -104,6 +104,11 @@ public class ConsulDynamicConfiguration implements 
DynamicConfiguration {
     }
 
     @Override
+    public String getConfigs(String key, String group, long timeout) throws 
IllegalStateException {
+        return getConfig(key, group, timeout);
+    }
+
+    @Override
     public Object getInternalProperty(String key) {
         logger.info("get config from: " + key);
         Response<GetValue> response = getValue(key);
diff --git 
a/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java
 
b/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java
index 78f5242..2e373ed 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java
@@ -107,6 +107,11 @@ public class EtcdDynamicConfiguration implements 
DynamicConfiguration {
     }
 
     @Override
+    public String getConfigs(String key, String group, long timeout) throws 
IllegalStateException {
+        return getConfig(key, group, timeout);
+    }
+
+    @Override
     public Object getInternalProperty(String key) {
         return etcdClient.getKVValue(key);
     }
diff --git 
a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
 
b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
index afdc97f..5f9307a 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
@@ -202,6 +202,11 @@ public class NacosDynamicConfiguration implements 
DynamicConfiguration {
     }
 
     @Override
+    public String getConfigs(String key, String group, long timeout) throws 
IllegalStateException {
+        return getConfig(key, group, timeout);
+    }
+
+    @Override
     public Object getInternalProperty(String key) {
         try {
             String[] keyAndGroup = getKeyAndGroup(key);
diff --git 
a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
 
b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
index 2ee6426..c912add 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
@@ -110,4 +110,18 @@ public class ZookeeperDynamicConfiguration implements 
DynamicConfiguration {
 
         return (String) getInternalProperty(rootPath + "/" + key);
     }
+
+    /**
+     * For zookeeper, {@link #getConfig(String, String, long)} and {@link 
#getConfigs(String, String, long)} have the same meaning.
+     *
+     * @param key
+     * @param group
+     * @param timeout
+     * @return
+     * @throws IllegalStateException
+     */
+    @Override
+    public String getConfigs(String key, String group, long timeout) throws 
IllegalStateException {
+        return (String) getConfig(key, group, timeout);
+    }
 }
diff --git 
a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/test/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationTest.java
 
b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/test/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationTest.java
index 40f9f04..64e0bec 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/test/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationTest.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/test/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationTest.java
@@ -87,7 +87,7 @@ public class ZookeeperDynamicConfigurationTest {
     @Test
     public void testGetConfig() throws Exception {
         Assertions.assertEquals("Never change value from configurators", 
configuration.getConfig("never.change.DemoService.configurators"));
-        Assertions.assertEquals("The content from dubbo.properties", 
configuration.getConfig("dubbo.properties", "dubbo"));
+        Assertions.assertEquals("The content from dubbo.properties", 
configuration.getConfigs("dubbo.properties", "dubbo"));
     }
 
     @Test

Reply via email to