You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by me...@apache.org on 2019/11/18 09:22:46 UTC

[dubbo] branch master updated: [Refactor] Refactor the DynamicConfiguration interface #5339 (#5340)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new ec16ba4  [Refactor] Refactor the DynamicConfiguration interface #5339 (#5340)
ec16ba4 is described below

commit ec16ba4aef01ffe722b91d7281c4699a34290417
Author: Mercy Ma <me...@gmail.com>
AuthorDate: Mon Nov 18 17:22:25 2019 +0800

    [Refactor] Refactor the DynamicConfiguration interface #5339 (#5340)
    
    * Polish apache/dubbo#5306 : [Migration] Upgrade the @since tags in Javadoc migration cloud native to master
    
    * Polish apache/dubbo#5306 : [Migration] Upgrade the @since tags in Javadoc migration cloud native to master
    
    * Polish apache/dubbo#5309 : [ISSURE] The beans of Dubbo's Config can't be found on the ReferenceBean's initialization
    
    * Polish apache/dubbo#5312 : Resolve the demos' issues of zookeeper and nacos
    
    * Polish apache/dubbo#5313 : [Migration] migrate the code in common module from cloud-native branch to master
    
    * Polish apache/dubbo#5316 : [Refactor] Replace @EnableDubboConfigBinding Using spring-context-support
    
    * Polish apache/dubbo#5317 : [Refactor] Refactor ReferenceAnnotationBeanPostProcessor using Alibaba spring-context-suuport API
    
    * Polish apache/dubbo#5321 : Remove BeanFactoryUtils
    
    * Polish apache/dubbo#5321 : Remove AnnotatedBeanDefinitionRegistryUtils
    
    * Polish apache/dubbo#5321 : Remove AnnotationUtils
    
    * Polish apache/dubbo#5321 : Remove ClassUtils
    
    * Polish apache/dubbo#5321 : Remove BeanRegistrar
    
    * Polish apache/dubbo#5321 : Remove ObjectUtils
    
    * Polish apache/dubbo#5321 : Remove PropertySourcesUtils
    
    * Polish apache/dubbo#5325 : [Migration] To migrate dubbo-metadata-api from cloud-native branch
    
    * Polish apache/dubbo#5326 : [Migration] To migrate dubbo-metadata-processor from cloud-native branch
    
    * Polish apache/dubbo#5329 : [Feature] To add the default metadata into ServiceInstance
    
    * Polish apache/dubbo#5339 : [Refactor] Refactor the DynamicConfiguration interface
---
 .../cluster/support/AbstractClusterInvoker.java    |  2 +-
 .../config/configcenter/DynamicConfiguration.java  |  7 +---
 .../file/FileSystemDynamicConfiguration.java       |  2 +-
 .../configcenter/nop/NopDynamicConfiguration.java  |  2 +-
 .../wrapper/CompositeDynamicConfiguration.java     |  4 +-
 .../org/apache/dubbo/common/utils/StringUtils.java | 21 +++++-----
 .../AbstractDynamicConfigurationTest.java          |  2 +-
 .../consul/ConsulDynamicConfiguration.java         |  5 ++-
 .../support/nacos/NacosDynamicConfiguration.java   | 48 ++++++++++++----------
 .../nacos/NacosDynamicConfigurationTest.java       |  2 +-
 .../zookeeper/ZookeeperDynamicConfiguration.java   |  7 ++--
 .../ZookeeperDynamicConfigurationTest.java         |  2 +-
 .../DynamicConfigurationServiceNameMapping.java    | 29 ++++++-------
 ...DynamicConfigurationServiceNameMappingTest.java | 10 ++---
 .../java/org/apache/dubbo/qos/textui/TTable.java   | 10 ++---
 .../java/org/apache/dubbo/qos/textui/TTree.java    |  4 +-
 .../client/FileSystemServiceDiscovery.java         |  6 +--
 17 files changed, 79 insertions(+), 84 deletions(-)

diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java
index d5437bf..972e95c 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java
@@ -130,7 +130,7 @@ public abstract class AbstractClusterInvoker<T> implements Invoker<T> {
         if (CollectionUtils.isEmpty(invokers)) {
             return null;
         }
-        String methodName = invocation == null ? StringUtils.EMPTY : invocation.getMethodName();
+        String methodName = invocation == null ? StringUtils.EMPTY_STRING : invocation.getMethodName();
 
         boolean sticky = invokers.get(0).getUrl()
                 .getMethodParameter(methodName, CLUSTER_STICKY_KEY, DEFAULT_CLUSTER_STICKY);
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java
index 29b50b6..398ed6f 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java
@@ -45,8 +45,6 @@ public interface DynamicConfiguration extends Configuration, AutoCloseable {
 
     String DEFAULT_GROUP = "dubbo";
 
-    String DEFAULT_MAPPING_GROUP = "mapping";
-
     /**
      * {@link #addListener(String, String, ConfigurationListener)}
      *
@@ -138,7 +136,7 @@ public interface DynamicConfiguration extends Configuration, AutoCloseable {
      * @since 2.7.5
      */
     default boolean publishConfig(String key, String content) throws UnsupportedOperationException {
-        return publishConfig(key, DEFAULT_MAPPING_GROUP, content);
+        return publishConfig(key, DEFAULT_GROUP, content);
     }
 
     /**
@@ -159,12 +157,11 @@ public interface DynamicConfiguration extends Configuration, AutoCloseable {
      * Get the config keys by the specified group
      *
      * @param group the specified group
-     * @param rootKey the
      * @return the read-only non-null sorted {@link Set set} of config keys
      * @throws UnsupportedOperationException If the under layer does not support
      * @since 2.7.5
      */
-    default SortedSet<String> getConfigKeys(String group, String rootKey) throws UnsupportedOperationException {
+    default SortedSet<String> getConfigKeys(String group) throws UnsupportedOperationException {
         throw new UnsupportedOperationException("No support");
     }
 
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java
index e6b49f8..ff2432f 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java
@@ -368,7 +368,7 @@ public class FileSystemDynamicConfiguration extends AbstractDynamicConfiguration
     }
 
     @Override
-    public SortedSet<String> getConfigKeys(String group, String key) {
+    public SortedSet<String> getConfigKeys(String group) {
         File[] files = groupDirectory(group).listFiles(File::isFile);
         if (files == null) {
             return new TreeSet<>();
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java
index ae2b3a0..dfc0d0d 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java
@@ -66,7 +66,7 @@ public class NopDynamicConfiguration implements DynamicConfiguration {
      * @since 2.7.5
      */
     @Override
-    public SortedSet<String> getConfigKeys(String group, String key) {
+    public SortedSet<String> getConfigKeys(String group) {
         return null;
     }
 }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
index 4e21a01..c33a15d 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
@@ -78,8 +78,8 @@ public class CompositeDynamicConfiguration implements DynamicConfiguration {
 
     @Override
     @SuppressWarnings("unchecked")
-    public SortedSet<String> getConfigKeys(String group, String key) throws UnsupportedOperationException {
-        return (SortedSet<String>) iterateConfigOperation(configuration -> configuration.getConfigKeys(group, key));
+    public SortedSet<String> getConfigKeys(String group) throws UnsupportedOperationException {
+        return (SortedSet<String>) iterateConfigOperation(configuration -> configuration.getConfigKeys(group));
     }
 
     private void iterateListenerOperation(Consumer<DynamicConfiguration> consumer) {
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
index c904800..7ef3b08 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
@@ -50,7 +50,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
 
 public final class StringUtils {
 
-    public static final String EMPTY = "";
+    public static final String EMPTY_STRING = "";
     public static final int INDEX_NOT_FOUND = -1;
     public static final String[] EMPTY_STRING_ARRAY = new String[0];
 
@@ -82,10 +82,9 @@ public final class StringUtils {
 
     public static final String SLASH = valueOf(SLASH_CHAR);
 
-    /**
-     * The empty value
-     */
-    public static final String EMPTY_VALUE = "";
+    public static final char HYPHEN_CHAR = '-';
+
+    public static final String HYPHEN = valueOf(HYPHEN_CHAR);
 
     private StringUtils() {
     }
@@ -127,7 +126,7 @@ public final class StringUtils {
             return null;
         }
         if (repeat <= 0) {
-            return EMPTY;
+            return EMPTY_STRING;
         }
         final int inputLength = str.length();
         if (repeat == 1 || inputLength == 0) {
@@ -653,7 +652,7 @@ public final class StringUtils {
      */
     public static String join(String[] array) {
         if (ArrayUtils.isEmpty(array)) {
-            return EMPTY;
+            return EMPTY_STRING;
         }
         StringBuilder sb = new StringBuilder();
         for (String s : array) {
@@ -671,7 +670,7 @@ public final class StringUtils {
      */
     public static String join(String[] array, char split) {
         if (ArrayUtils.isEmpty(array)) {
-            return EMPTY;
+            return EMPTY_STRING;
         }
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < array.length; i++) {
@@ -692,7 +691,7 @@ public final class StringUtils {
      */
     public static String join(String[] array, String split) {
         if (ArrayUtils.isEmpty(array)) {
-            return EMPTY;
+            return EMPTY_STRING;
         }
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < array.length; i++) {
@@ -706,7 +705,7 @@ public final class StringUtils {
 
     public static String join(Collection<String> coll, String split) {
         if (CollectionUtils.isEmpty(coll)) {
-            return EMPTY;
+            return EMPTY_STRING;
         }
 
         StringBuilder sb = new StringBuilder();
@@ -858,7 +857,7 @@ public final class StringUtils {
         if (str != null && !isEmpty(str)) {
             int sz = str.length();
 
-            for(int i = 0; i < sz; ++i) {
+            for (int i = 0; i < sz; ++i) {
                 if (!Character.isUpperCase(str.charAt(i))) {
                     return false;
                 }
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationTest.java
index 5f41b09..00d58f6 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfigurationTest.java
@@ -111,7 +111,7 @@ public class AbstractDynamicConfigurationTest {
 
     @Test
     public void testGetConfigKeys() {
-        assertThrows(UnsupportedOperationException.class, () -> configuration.getConfigKeys(null, null), "No support");
+        assertThrows(UnsupportedOperationException.class, () -> configuration.getConfigKeys(null), "No support");
     }
 
     @Test
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 dc02de9..f1aeed2 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
@@ -46,6 +46,7 @@ import java.util.concurrent.ConcurrentMap;
 
 import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_NAMESPACE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;
+import static org.apache.dubbo.common.utils.StringUtils.EMPTY_STRING;
 
 /**
  * config center implementation for consul
@@ -95,9 +96,9 @@ public class ConsulDynamicConfiguration implements DynamicConfiguration {
     }
 
     @Override
-    public SortedSet<String> getConfigKeys(String group, String key) throws UnsupportedOperationException {
+    public SortedSet<String> getConfigKeys(String group) throws UnsupportedOperationException {
         SortedSet<String> configKeys = new TreeSet<>();
-        String normalizedKey = convertKey(group, key);
+        String normalizedKey = convertKey(group, EMPTY_STRING);
         List<String> keys = kvClient.getKeys(normalizedKey);
         if (CollectionUtils.isNotEmpty(keys)) {
             keys.stream()
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 cb5d930..11f02f6 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
@@ -61,6 +61,8 @@ import static com.alibaba.nacos.client.naming.utils.UtilAndComs.NACOS_NAMING_LOG
 import static java.util.Arrays.asList;
 import static java.util.Collections.emptyList;
 import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;
+import static org.apache.dubbo.common.utils.StringUtils.HYPHEN_CHAR;
+import static org.apache.dubbo.common.utils.StringUtils.SLASH_CHAR;
 
 /**
  * The nacos implementation of {@link DynamicConfiguration}
@@ -175,10 +177,12 @@ public class NacosDynamicConfiguration implements DynamicConfiguration {
 
     @Override
     public void addListener(String key, String group, ConfigurationListener listener) {
-        NacosConfigListener nacosConfigListener = watchListenerMap.computeIfAbsent(key, k -> createTargetListener(key, group));
+        String resolvedGroup = resolveGroup(group);
+        String listenerKey = buildListenerKey(key, group);
+        NacosConfigListener nacosConfigListener = watchListenerMap.computeIfAbsent(listenerKey, k -> createTargetListener(key, resolvedGroup));
         nacosConfigListener.addListener(listener);
         try {
-            configService.addListener(key, group, nacosConfigListener);
+            configService.addListener(key, resolvedGroup, nacosConfigListener);
         } catch (NacosException e) {
             logger.error(e.getMessage());
         }
@@ -186,7 +190,8 @@ public class NacosDynamicConfiguration implements DynamicConfiguration {
 
     @Override
     public void removeListener(String key, String group, ConfigurationListener listener) {
-        NacosConfigListener eventListener = watchListenerMap.get(key);
+        String listenerKey = buildListenerKey(key, group);
+        NacosConfigListener eventListener = watchListenerMap.get(listenerKey);
         if (eventListener != null) {
             eventListener.removeListener(listener);
         }
@@ -194,12 +199,13 @@ public class NacosDynamicConfiguration implements DynamicConfiguration {
 
     @Override
     public String getConfig(String key, String group, long timeout) throws IllegalStateException {
+        String resolvedGroup = resolveGroup(group);
         try {
             long nacosTimeout = timeout < 0 ? DEFAULT_TIMEOUT : timeout;
-            if (StringUtils.isEmpty(group)) {
-                group = DEFAULT_GROUP;
+            if (StringUtils.isEmpty(resolvedGroup)) {
+                resolvedGroup = DEFAULT_GROUP;
             }
-            return configService.getConfig(key, group, nacosTimeout);
+            return configService.getConfig(key, resolvedGroup, nacosTimeout);
         } catch (NacosException e) {
             logger.error(e.getMessage());
         }
@@ -219,12 +225,13 @@ public class NacosDynamicConfiguration implements DynamicConfiguration {
     @Override
     public boolean publishConfig(String key, String group, String content) {
         boolean published = false;
+        String resolvedGroup = resolveGroup(group);
         try {
-            String value = configService.getConfig(key, group, -1L);
+            String value = configService.getConfig(key, resolvedGroup, -1L);
             if (StringUtils.isNotEmpty(value)) {
                 content = value + "," + content;
             }
-            published = configService.publishConfig(key, group, content);
+            published = configService.publishConfig(key, resolvedGroup, content);
         } catch (NacosException e) {
             logger.error(e.getErrMsg());
         }
@@ -234,19 +241,19 @@ public class NacosDynamicConfiguration implements DynamicConfiguration {
     /**
      * TODO Nacos does not support atomic update of the value mapped to a key.
      *
-     * @param group the specified group
      * @param key
+     * @param group the specified group
      * @return
      */
     @Override
-    public SortedSet<String> getConfigKeys(String group, String key) {
+    public SortedSet<String> getConfigKeys(String group) {
         // TODO use Nacos Client API to replace HTTP Open API
         SortedSet<String> keys = new TreeSet<>();
         try {
             List<String> paramsValues = asList(
                     "search", "accurate",
                     "dataId", "",
-                    "group", group,
+                    "group", resolveGroup(group),
                     "pageNo", "1",
                     "pageSize", String.valueOf(Integer.MAX_VALUE)
             );
@@ -260,17 +267,6 @@ public class NacosDynamicConfiguration implements DynamicConfiguration {
             }
         }
         return keys;
-
-//        SortedSet<String> configKeys = new TreeSet<>();
-//        try {
-//            String value = configService.getConfig(key, group, -1L);
-//            if (value != null) {
-//                Collections.addAll(configKeys, value.split(","));
-//            }
-//        } catch (NacosException e) {
-//            logger.error(e.getErrMsg());
-//        }
-//        return configKeys;
     }
 
     private Stream<String> toKeysStream(String content) {
@@ -336,4 +332,12 @@ public class NacosDynamicConfiguration implements DynamicConfiguration {
             return ConfigChangeType.MODIFIED;
         }
     }
+
+    protected String buildListenerKey(String key, String group) {
+        return key + HYPHEN_CHAR + resolveGroup(group);
+    }
+
+    protected String resolveGroup(String group) {
+        return group.replace(SLASH_CHAR, HYPHEN_CHAR);
+    }
 }
diff --git a/dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java b/dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java
index 8537bec..ac2978d 100644
--- a/dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java
+++ b/dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java
@@ -106,7 +106,7 @@ public class NacosDynamicConfigurationTest {
         put("key1", "a");
         put("key2", "b");
 
-        SortedSet<String> keys = config.getConfigKeys(DynamicConfiguration.DEFAULT_GROUP, null);
+        SortedSet<String> keys = config.getConfigKeys(DynamicConfiguration.DEFAULT_GROUP);
 
         Assertions.assertFalse(keys.isEmpty());
 
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 50aac74..039b57f 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
@@ -40,14 +40,13 @@ import static java.util.Collections.unmodifiableSortedSet;
 import static org.apache.dubbo.common.config.configcenter.Constants.CONFIG_NAMESPACE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;
 import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;
+import static org.apache.dubbo.common.utils.StringUtils.EMPTY_STRING;
 
 /**
  *
  */
 public class ZookeeperDynamicConfiguration implements DynamicConfiguration {
 
-    private static final String EMPTY_STRING = "";
-
     private static final Logger logger = LoggerFactory.getLogger(ZookeeperDynamicConfiguration.class);
 
     private Executor executor;
@@ -118,8 +117,8 @@ public class ZookeeperDynamicConfiguration implements DynamicConfiguration {
     }
 
     @Override
-    public SortedSet<String> getConfigKeys(String group, String key) {
-        String path = getPathKey(group, key);
+    public SortedSet<String> getConfigKeys(String group) {
+        String path = getPathKey(group, EMPTY_STRING);
         List<String> nodes = zkClient.getChildren(path);
         return isEmpty(nodes) ? emptySortedSet() : unmodifiableSortedSet(new TreeSet<>(nodes));
     }
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 aa77fbb..cc2ac4c 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
@@ -149,7 +149,7 @@ public class ZookeeperDynamicConfigurationTest {
         assertTrue(configuration.publishConfig(key, group, content));
         assertTrue(configuration.publishConfig(key2, group, content));
 
-        Set<String> configKeys = configuration.getConfigKeys(group, key);
+        Set<String> configKeys = configuration.getConfigKeys(group);
 
         assertEquals(new TreeSet(asList(content)), configKeys);
     }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMapping.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMapping.java
index 65981f5..d84eba0 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMapping.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMapping.java
@@ -19,27 +19,25 @@ package org.apache.dubbo.metadata;
 import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
-import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
+import static java.lang.String.valueOf;
 import static java.util.Arrays.asList;
-import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.DEFAULT_MAPPING_GROUP;
-import static org.apache.dubbo.common.utils.StringUtils.isBlank;
+import static org.apache.dubbo.common.utils.StringUtils.SLASH;
+import static org.apache.dubbo.rpc.model.ApplicationModel.getName;
 
 /**
  * The {@link ServiceNameMapping} implementation based on {@link DynamicConfiguration}
  */
 public class DynamicConfigurationServiceNameMapping implements ServiceNameMapping {
 
-    private static final List<String> IGNORED_SERVICE_INTERFACES = asList(MetadataService.class.getName());
-
-    private static final String SEPARATOR = ":";
+    public static String DEFAULT_MAPPING_GROUP = "mapping";
 
-    private static final String EMPTY = "";
+    private static final List<String> IGNORED_SERVICE_INTERFACES = asList(MetadataService.class.getName());
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
@@ -55,12 +53,13 @@ public class DynamicConfigurationServiceNameMapping implements ServiceNameMappin
         // the Dubbo Service Key as group
         // the service(application) name as key
         // It does matter whatever the content is, we just need a record
-        String app = ApplicationModel.getApplication();
+        String key = getName();
+        String content = valueOf(System.currentTimeMillis());
         execute(() -> {
-            dynamicConfiguration.publishConfig(buildKey(serviceInterface, group, version, protocol), app);
+            dynamicConfiguration.publishConfig(key, buildGroup(serviceInterface, group, version, protocol), content);
             if (logger.isInfoEnabled()) {
                 logger.info(String.format("Dubbo service[%s] mapped to interface name[%s].",
-                        app, serviceInterface, app));
+                        group, serviceInterface, group));
             }
         });
     }
@@ -72,24 +71,20 @@ public class DynamicConfigurationServiceNameMapping implements ServiceNameMappin
 
         Set<String> serviceNames = new LinkedHashSet<>();
         execute(() -> {
-            Set<String> keys = dynamicConfiguration.getConfigKeys(DEFAULT_MAPPING_GROUP, buildKey(serviceInterface, group, version, protocol));
+            Set<String> keys = dynamicConfiguration.getConfigKeys(buildGroup(serviceInterface, group, version, protocol));
             serviceNames.addAll(keys);
         });
         return Collections.unmodifiableSet(serviceNames);
     }
 
-    protected static String buildKey(String serviceInterface, String group, String version, String protocol) {
+    protected static String buildGroup(String serviceInterface, String group, String version, String protocol) {
         //        the issue : https://github.com/apache/dubbo/issues/4671
         //        StringBuilder groupBuilder = new StringBuilder(serviceInterface)
         //                .append(KEY_SEPARATOR).append(defaultString(group))
         //                .append(KEY_SEPARATOR).append(defaultString(version))
         //                .append(KEY_SEPARATOR).append(defaultString(protocol));
         //        return groupBuilder.toString();
-        return serviceInterface;
-    }
-
-    private static String defaultString(String value) {
-        return isBlank(value) ? EMPTY : value;
+        return DEFAULT_MAPPING_GROUP + SLASH + serviceInterface;
     }
 
     private void execute(Runnable runnable) {
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMappingTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMappingTest.java
index 9cb78a1..fd1bfe2 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMappingTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMappingTest.java
@@ -28,7 +28,7 @@ import java.util.TreeSet;
 
 import static java.util.Arrays.asList;
 import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;
-import static org.apache.dubbo.metadata.DynamicConfigurationServiceNameMapping.buildKey;
+import static org.apache.dubbo.metadata.DynamicConfigurationServiceNameMapping.buildGroup;
 import static org.apache.dubbo.metadata.ServiceNameMapping.getDefaultExtension;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -54,10 +54,10 @@ public class DynamicConfigurationServiceNameMappingTest {
 
     @Test
     public void testBuildGroup() {
-        assertEquals("test", buildKey("test", null, null, null));
-        assertEquals("test", buildKey("test", "default", null, null));
-        assertEquals("test", buildKey("test", "default", "1.0.0", null));
-        assertEquals("test", buildKey("test", "default", "1.0.0", "dubbo"));
+        assertEquals("test", buildGroup("test", null, null, null));
+        assertEquals("test", buildGroup("test", "default", null, null));
+        assertEquals("test", buildGroup("test", "default", "1.0.0", null));
+        assertEquals("test", buildGroup("test", "default", "1.0.0", "dubbo"));
     }
 
     @Test
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTable.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTable.java
index c9a6715..24b8308 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTable.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTable.java
@@ -24,7 +24,7 @@ import java.util.Scanner;
 import static java.lang.Math.abs;
 import static java.lang.Math.max;
 import static java.lang.String.format;
-import static org.apache.dubbo.common.utils.StringUtils.EMPTY;
+import static org.apache.dubbo.common.utils.StringUtils.EMPTY_STRING;
 import static org.apache.dubbo.common.utils.StringUtils.length;
 import static org.apache.dubbo.common.utils.StringUtils.repeat;
 import static org.apache.dubbo.common.utils.StringUtils.replace;
@@ -128,7 +128,7 @@ public class TTable implements TComponent {
                             && border.has(Border.BORDER_INNER_V)) {
                         borderChar = "|";
                     } else {
-                        borderChar = EMPTY;
+                        borderChar = EMPTY_STRING;
                     }
 
 
@@ -143,7 +143,7 @@ public class TTable implements TComponent {
                         data = scanner.nextLine();
                         hasNextLine = true;
                     } else {
-                        data = EMPTY;
+                        data = EMPTY_STRING;
                     }
 
                     if (width > 0) {
@@ -181,7 +181,7 @@ public class TTable implements TComponent {
 
     private String getData(int rowIndex, ColumnDefine columnDefine) {
         return columnDefine.getRowCount() <= rowIndex
-                ? EMPTY
+                ? EMPTY_STRING
                 : columnDefine.rows.get(rowIndex);
     }
 
@@ -278,7 +278,7 @@ public class TTable implements TComponent {
                         && null != columnDataArray[index]) {
                     columnDefine.rows.add(replaceTab(columnDataArray[index].toString()));
                 } else {
-                    columnDefine.rows.add(EMPTY);
+                    columnDefine.rows.add(EMPTY_STRING);
                 }
             }
         }
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTree.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTree.java
index 50dca53..337f0b2 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTree.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTree.java
@@ -22,7 +22,7 @@ import java.util.List;
 import java.util.Scanner;
 
 import static java.lang.System.currentTimeMillis;
-import static org.apache.dubbo.common.utils.StringUtils.EMPTY;
+import static org.apache.dubbo.common.utils.StringUtils.EMPTY_STRING;
 import static org.apache.dubbo.common.utils.StringUtils.length;
 import static org.apache.dubbo.common.utils.StringUtils.repeat;
 
@@ -87,7 +87,7 @@ public class TTree implements TComponent {
                         } else {
                             treeSB.append(prefix)
                                     .append(repeat(' ', stepStringLength))
-                                    .append(hasChild ? "|" : EMPTY)
+                                    .append(hasChild ? "|" : EMPTY_STRING)
                                     .append(repeat(' ', costPrefixLength))
                                     .append(scanner.nextLine())
                                     .append(System.lineSeparator());
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java
index 7765444..82bc860 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java
@@ -45,7 +45,7 @@ import java.util.stream.Collectors;
 import static com.alibaba.fastjson.JSON.toJSONString;
 import static java.lang.String.format;
 import static java.nio.channels.FileChannel.open;
-import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.DEFAULT_MAPPING_GROUP;
+import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.DEFAULT_GROUP;
 import static org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration.CONFIG_CENTER_DIR_PARAM_NAME;
 
 /**
@@ -80,7 +80,7 @@ public class FileSystemServiceDiscovery implements ServiceDiscovery, EventListen
 
     private void registerListener() {
         getServices().forEach(serviceName -> {
-            dynamicConfiguration.getConfigKeys(DEFAULT_MAPPING_GROUP, serviceName).forEach(serviceInstanceId -> {
+            dynamicConfiguration.getConfigKeys(DEFAULT_GROUP).forEach(serviceInstanceId -> {
                 dynamicConfiguration.addListener(serviceInstanceId, serviceName, this::onConfigChanged);
             });
         });
@@ -121,7 +121,7 @@ public class FileSystemServiceDiscovery implements ServiceDiscovery, EventListen
 
     @Override
     public List<ServiceInstance> getInstances(String serviceName) {
-        return dynamicConfiguration.getConfigKeys(DEFAULT_MAPPING_GROUP, serviceName)
+        return dynamicConfiguration.getConfigKeys(DEFAULT_GROUP)
                 .stream()
                 .map(serviceInstanceId -> dynamicConfiguration.getConfig(serviceInstanceId, serviceName))
                 .map(content -> JSON.parseObject(content, DefaultServiceInstance.class))