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/09/04 06:44:55 UTC

[incubator-dubbo] branch dev-metadata updated: To identify app level or service level changes

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

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


The following commit(s) were added to refs/heads/dev-metadata by this push:
     new aaa8758  To identify app level or service level changes
aaa8758 is described below

commit aaa875882b57ebf81351b37bc34e192ad2c39fda
Author: ken.lj <ke...@gmail.com>
AuthorDate: Tue Sep 4 14:44:45 2018 +0800

    To identify app level or service level changes
---
 .../support/apollo/ApolloDynamicConfiguration.java |  4 +-
 .../archaius/ArchaiusDynamicConfiguration.java     |  8 ++-
 .../sources/ZooKeeperConfigurationSource.java      |  2 +-
 .../registry/integration/RegistryDirectory.java    | 28 ++++----
 .../registry/integration/RegistryProtocol.java     | 49 ++++++++------
 .../registry/integration/parser/ConfigParser.java  |  6 --
 .../java/org/apache/dubbo/registry/ZKTools.java    | 79 +++++++++++++++++-----
 .../src/test/resources/AppAnyServices.yml          |  0
 .../src/test/resources/AppMultiServices.yml        |  0
 .../src/test/resources/AppNoService.yml            |  2 +-
 .../src/test/resources/ConditionRule.yml           |  9 +++
 .../src/test/resources/ServiceGroupVersion.yml     |  0
 .../src/test/resources/ServiceMultiApps.yml        |  0
 .../src/test/resources/ServiceNoApp.yml            |  0
 .../src/test/resources/ServiceNoRule.yml           |  0
 15 files changed, 123 insertions(+), 64 deletions(-)

diff --git a/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/apollo/ApolloDynamicConfiguration.java b/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/apollo/ApolloDynamicConfiguration.java
index 196581a..7b718f4 100644
--- a/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/apollo/ApolloDynamicConfiguration.java
+++ b/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/apollo/ApolloDynamicConfiguration.java
@@ -121,13 +121,15 @@ public class ApolloDynamicConfiguration extends AbstractDynamicConfiguration {
             this.listener = listener;
         }
 
+        // FIXME will Apollo consider an empty value ("") as deleted?
         @Override
         public void onChange(ConfigChangeEvent changeEvent) {
             for (String key : changeEvent.changedKeys()) {
                 ConfigChange change = changeEvent.getChange(key);
+                // Maybe we no longer need to identify the type of change. Because there's no scenario that a callback will subscribe for both configurators and routers
                 if (change.getPropertyName().endsWith(Constants.CONFIGURATORS_SUFFIX)) {
                     listener.process(new org.apache.dubbo.config.dynamic.ConfigChangeEvent(key, change.getNewValue(), ConfigType.CONFIGURATORS, getChangeType(change.getChangeType())));
-                } else if (change.getPropertyName().endsWith(Constants.ROUTERS_SUFFIX)) {
+                } else {
                     listener.process(new org.apache.dubbo.config.dynamic.ConfigChangeEvent(key, change.getNewValue(), ConfigType.ROUTERS, getChangeType(change.getChangeType())));
                 }
             }
diff --git a/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/archaius/ArchaiusDynamicConfiguration.java b/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/archaius/ArchaiusDynamicConfiguration.java
index 912eefa..d0f68f6 100644
--- a/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/archaius/ArchaiusDynamicConfiguration.java
+++ b/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/archaius/ArchaiusDynamicConfiguration.java
@@ -98,9 +98,15 @@ public class ArchaiusDynamicConfiguration extends AbstractDynamicConfiguration {
             this.key = key;
             this.listener = listener;
             this.url = listener.getUrl();
+            // Maybe we no longer need to identify the type of change. Because there's no scenario that a callback will subscribe for both configurators and routers
             if (key.endsWith(Constants.CONFIGURATORS_SUFFIX)) {
                 type = ConfigType.CONFIGURATORS;
-            } else if (key.endsWith(Constants.ROUTERS_SUFFIX)) {
+            } else {
+                /**
+                 * Works for any router rules:
+                 * {@link Constants.ROUTERS_SUFFIX}
+                 * {@link org.apache.dubbo.rpc.cluster.router.group.TagRouter.TAGRULE_DATAID}
+                 */
                 type = ConfigType.ROUTERS;
             }
         }
diff --git a/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/archaius/sources/ZooKeeperConfigurationSource.java b/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/archaius/sources/ZooKeeperConfigurationSource.java
index 5dd3640..c95033b 100644
--- a/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/archaius/sources/ZooKeeperConfigurationSource.java
+++ b/dubbo-config/dubbo-config-dynamic/src/main/java/org/apache/dubbo/config/dynamic/support/archaius/sources/ZooKeeperConfigurationSource.java
@@ -165,7 +165,7 @@ public class ZooKeeperConfigurationSource implements WatchedConfigurationSource,
         if (StringUtils.isEmpty(path)) {
             return path;
         }
-        return path.replace(configRootPath, "").replaceAll("/", ".");
+        return path.replace(configRootPath + "/", "").replaceAll("/", ".");
     }
 
     @Override
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
index 30c14b3..4415bc2 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
@@ -26,7 +26,6 @@ import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.dynamic.ConfigChangeEvent;
 import org.apache.dubbo.config.dynamic.ConfigChangeType;
-import org.apache.dubbo.config.dynamic.ConfigType;
 import org.apache.dubbo.config.dynamic.ConfigurationListener;
 import org.apache.dubbo.config.dynamic.DynamicConfiguration;
 import org.apache.dubbo.registry.NotifyListener;
@@ -60,6 +59,9 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import static org.apache.dubbo.common.Constants.APPLICATION_KEY;
+import static org.apache.dubbo.common.Constants.CONFIGURATORS_SUFFIX;
+
 /**
  * RegistryDirectory
  */
@@ -653,22 +655,18 @@ public class RegistryDirectory<T> extends AbstractDirectory<T> implements Notify
 
     @Override
     public void process(ConfigChangeEvent event) {
-        ConfigType configType = event.getType();
-        ConfigChangeType changeType = event.getChangeType();
-
-        List<URL> urls = new ArrayList<>();
-        if (changeType.equals(ConfigChangeType.DELETED)) {
-            if (ConfigType.CONFIGURATORS.equals(configType)) {
-                urls.add(getConsumerUrl().clearParameters().addParameter(Constants.CATEGORY_KEY, Constants.DYNAMIC_CONFIGURATORS_CATEGORY).setProtocol(Constants.EMPTY_PROTOCOL));
-            } else if (ConfigType.ROUTERS.equals(configType)) {
-                urls.add(getConsumerUrl().clearParameters().addParameter(Constants.CATEGORY_KEY, Constants.DYNAMIC_ROUTERS_CATEGORY).setProtocol(Constants.EMPTY_PROTOCOL));
+        List<URL> urls;
+        if (event.getChangeType().equals(ConfigChangeType.DELETED)) {
+            URL url = getConsumerUrl().clearParameters().setProtocol(Constants.EMPTY_PROTOCOL);
+            if (event.getKey().endsWith(this.queryMap.get(APPLICATION_KEY) + CONFIGURATORS_SUFFIX)) {
+                url = url.addParameter(Constants.CATEGORY_KEY, Constants.APP_DYNAMIC_CONFIGURATORS_CATEGORY);
+            } else {
+                url = url.addParameter(Constants.CATEGORY_KEY, Constants.DYNAMIC_CONFIGURATORS_CATEGORY);
             }
+            urls = new ArrayList<>();
+            urls.add(url);
         } else {
-            if (ConfigType.CONFIGURATORS.equals(configType)) {
-                urls = ConfigParser.parseConfigurators(event.getNewValue());
-            } else if (ConfigType.ROUTERS.equals(configType)) {
-                urls = ConfigParser.parseRouters(event.getNewValue());
-            }
+            urls = ConfigParser.parseConfigurators(event.getNewValue());
         }
         notify(urls);
     }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
index ec4bef4..a46f006 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
@@ -21,13 +21,13 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.ConfigUtils;
 import org.apache.dubbo.common.utils.NamedThreadFactory;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.common.utils.UrlUtils;
 import org.apache.dubbo.config.dynamic.ConfigChangeEvent;
 import org.apache.dubbo.config.dynamic.ConfigChangeType;
-import org.apache.dubbo.config.dynamic.ConfigType;
 import org.apache.dubbo.config.dynamic.ConfigurationListener;
 import org.apache.dubbo.config.dynamic.DynamicConfiguration;
 import org.apache.dubbo.config.dynamic.DynamicConfigurationFactory;
@@ -58,9 +58,12 @@ import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
 import static org.apache.dubbo.common.Constants.ACCEPT_FOREIGN_IP;
+import static org.apache.dubbo.common.Constants.APPLICATION_KEY;
+import static org.apache.dubbo.common.Constants.CONFIGURATORS_SUFFIX;
 import static org.apache.dubbo.common.Constants.CONFIG_PROTOCOL;
 import static org.apache.dubbo.common.Constants.EXPORT_KEY;
 import static org.apache.dubbo.common.Constants.INTERFACES;
+import static org.apache.dubbo.common.Constants.INTERFACE_KEY;
 import static org.apache.dubbo.common.Constants.QOS_ENABLE;
 import static org.apache.dubbo.common.Constants.QOS_PORT;
 import static org.apache.dubbo.common.Constants.REFER_KEY;
@@ -198,7 +201,11 @@ public class RegistryProtocol implements Protocol {
     }
 
     private URL getConfigUrl(URL registryUrl) {
-        URL url = registryUrl.removeParameters(EXPORT_KEY, REFER_KEY).setProtocol(CONFIG_PROTOCOL);
+        Map<String, String> qs = StringUtils.parseQueryString(registryUrl.getParameterAndDecoded(REFER_KEY));
+        URL url = registryUrl
+                .removeParameters(EXPORT_KEY, REFER_KEY)
+                .setProtocol(CONFIG_PROTOCOL)
+                .setPath(qs.get(INTERFACE_KEY));
         String configType = registryUrl.getParameter(Constants.CONFIG_TYPE_KEY);
         if (StringUtils.isEmpty(configType)) {
             url = url.addParameter(Constants.CONFIG_TYPE_KEY, registryUrl.getProtocol());
@@ -351,7 +358,7 @@ public class RegistryProtocol implements Protocol {
         directory.setRegistry(registry);
         directory.setProtocol(protocol);
         directory.setDynamicConfiguration(dynamicConfiguration);
-        directory.setRouterChain(RouterChain.buildChain(dynamicConfiguration));
+        directory.setRouterChain(RouterChain.buildChain(dynamicConfiguration, url));
         // all attributes of REFER_KEY
         Map<String, String> parameters = new HashMap<String, String>(directory.getUrl().getParameters());
         URL subscribeUrl = new URL(Constants.CONSUMER_PROTOCOL, parameters.remove(Constants.REGISTER_IP_KEY), 0, type.getName(), parameters);
@@ -498,18 +505,18 @@ public class RegistryProtocol implements Protocol {
             if (matchedUrls.isEmpty()) {
                 return;
             }
+            List<URL> configuratorUrls = matchedUrls.stream().filter(u -> u.getParameter(Constants.CATEGORY_KEY).equals(Constants.CONFIGURATORS_CATEGORY)).collect(Collectors.toList());
+            List<URL> dynamicConfiguratorUrls = matchedUrls.stream().filter(u -> u.getParameter(Constants.CATEGORY_KEY).equals(Constants.DYNAMIC_CONFIGURATORS_CATEGORY)).collect(Collectors.toList());
+            List<URL> appDynamicConfiguratorUrls = matchedUrls.stream().filter(u -> u.getParameter(Constants.CATEGORY_KEY).equals(Constants.APP_DYNAMIC_CONFIGURATORS_CATEGORY)).collect(Collectors.toList());
 
-            List<Configurator> localConfigurators = RegistryDirectory.toConfigurators(matchedUrls.stream().filter(u -> u.getParameter(Constants.CATEGORY_KEY).equals(Constants.CONFIGURATORS_CATEGORY)).collect(Collectors.toList()));
-            List<Configurator> localDynamicConfigurators = RegistryDirectory.toConfigurators(matchedUrls.stream().filter(u -> u.getParameter(Constants.CATEGORY_KEY).equals(Constants.DYNAMIC_CONFIGURATORS_CATEGORY)).collect(Collectors.toList()));
-            List<Configurator> localAppDynamicConfigurators = RegistryDirectory.toConfigurators(matchedUrls.stream().filter(u -> u.getParameter(Constants.CATEGORY_KEY).equals(Constants.APP_DYNAMIC_CONFIGURATORS_CATEGORY)).collect(Collectors.toList()));
-            if (localConfigurators != null && localConfigurators.size() > 0) {
-                configurators = localConfigurators;
+            if (CollectionUtils.isNotEmpty(configuratorUrls)) {
+                configurators = RegistryDirectory.toConfigurators(configuratorUrls);
             }
-            if (localDynamicConfigurators != null && localDynamicConfigurators.size() > 0) {
-                dynamicConfigurators = localDynamicConfigurators;
+            if (CollectionUtils.isNotEmpty(dynamicConfiguratorUrls)) {
+                dynamicConfigurators = RegistryDirectory.toConfigurators(dynamicConfiguratorUrls);
             }
-            if (localAppDynamicConfigurators != null && localAppDynamicConfigurators.size() > 0) {
-                appDynamicConfigurators = localAppDynamicConfigurators;
+            if (CollectionUtils.isNotEmpty(appDynamicConfiguratorUrls)) {
+                appDynamicConfigurators = RegistryDirectory.toConfigurators(appDynamicConfiguratorUrls);
             }
 
             final Invoker<?> invoker;
@@ -548,11 +555,6 @@ public class RegistryProtocol implements Protocol {
                     overrideUrl = url.addParameter(Constants.CATEGORY_KEY, Constants.CONFIGURATORS_CATEGORY);
                 }
 
-                // For provider side, we will simply change DYNAMIC_CONFIGURATORS_CATEGORY to CONFIGURATORS_CATEGORY.
-                if (Constants.DYNAMIC_CONFIGURATORS_CATEGORY.equals(url.getParameter(Constants.CATEGORY_KEY))) {
-                    overrideUrl = url.addParameter(Constants.CATEGORY_KEY, Constants.CONFIGURATORS_CATEGORY);
-                }
-
                 // Check whether url is to be applied to the current service
                 if (UrlUtils.isMatch(currentSubscribe, overrideUrl)) {
                     result.add(url);
@@ -563,15 +565,20 @@ public class RegistryProtocol implements Protocol {
 
         @Override
         public void process(ConfigChangeEvent event) {
-            if (!event.getType().equals(ConfigType.CONFIGURATORS)) {
-                return;
-            }
             List<URL> urls;
             if (event.getChangeType().equals(ConfigChangeType.DELETED)) {
                 URL originUrl = RegistryProtocol.this.getProviderUrl(originInvoker);
+                originUrl = originUrl.clearParameters().setProtocol(Constants.EMPTY_PROTOCOL);
+                // determine it's a app level or service level change.
+                if (event.getKey().endsWith(originUrl.getParameter(APPLICATION_KEY) + CONFIGURATORS_SUFFIX)) {
+                    originUrl = originUrl.addParameter(Constants.CATEGORY_KEY, Constants.APP_DYNAMIC_CONFIGURATORS_CATEGORY);
+                } else {
+                    originUrl = originUrl.addParameter(Constants.CATEGORY_KEY, Constants.DYNAMIC_CONFIGURATORS_CATEGORY);
+                }
                 urls = new ArrayList<>();
-                urls.add(originUrl.clearParameters().addParameter(Constants.CATEGORY_KEY, Constants.DYNAMIC_CONFIGURATORS_CATEGORY).setProtocol(Constants.EMPTY_PROTOCOL));
+                urls.add(originUrl);
             } else {
+                // parseConfigurators will recognize app/service config automatically.
                 urls = ConfigParser.parseConfigurators(event.getNewValue());
             }
             notify(urls);
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/parser/ConfigParser.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/parser/ConfigParser.java
index 4b2e4c0..ef24b36 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/parser/ConfigParser.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/parser/ConfigParser.java
@@ -64,12 +64,6 @@ public class ConfigParser {
         return yaml.load(rawConfig);
     }
 
-    public static List<URL> parseRouters(String rawConfig) {
-        List<URL> urls = new ArrayList<>();
-        urls.add(URL.valueOf(""));
-        return urls;
-    }
-
     private static List<URL> serviceItemToUrls(ConfigItem item, String serviceKey) {
         List<URL> urls = new ArrayList<>();
         List<String> addresses = item.getAddresses();
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java
index 5042068..1072e31 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java
@@ -43,9 +43,9 @@ public class ZKTools {
                 new ExponentialBackoffRetry(1000, 3));
         client.start();
 
-//        testConsumerConfig();
+        testConsumerConfig();
 //        testPathCache();
-        testTreeCache();
+//        testTreeCache();
 //        testCuratorListener();
         System.in.read();
     }
@@ -75,24 +75,67 @@ public class ZKTools {
     }
 
     public static void testConsumerConfig() {
-        String str = "{\n" +
-                "\t\"service\": \"org.apache.dubbo.demo.DemoService\",\n" +
-                "\t\"items\": [{\n" +
-                "\t\t\"addresses\": [\"30.5.120.48\"],\n" +
-                "\t\t\"rules\": [{\n" +
-                "\t\t\t\"key\": \"loadbalance\",\n" +
-                "\t\t\t\"value\": \"roundrobin\"\n" +
-                "\t\t}],\n" +
-                "\t\t\"app\": \"demo-consumer\",\n" +
-                "\t\t\"side\": \"consumer\"\n" +
-                "\t}]\n" +
-                "}";
+        String serviceStr = "---\n" +
+                "scope: service\n" +
+                "key: org.apache.dubbo.demo.DemoService\n" +
+                "configs:\n" +
+                " - addresses: [30.5.121.156]\n" +
+                "   side: consumer\n" +
+                "   rules:\n" +
+                "    cluster:\n" +
+                "     loadbalance: random\n" +
+                "     cluster: failfast\n" +
+                "    config:\n" +
+                "     timeout: 9999\n" +
+                "     weight: 222\n" +
+                "...";
+        String appStr = "---\n" +
+                "scope: application\n" +
+                "key: demo-consumer\n" +
+                "configs:\n" +
+                " - addresses: [30.5.121.156]\n" +
+                "   services: [org.apache.dubbo.demo.DemoService]\n" +
+                "   side: consumer\n" +
+                "   rules:\n" +
+                "    cluster:\n" +
+                "     loadbalance: random\n" +
+                "     cluster: failfast\n" +
+                "    config:\n" +
+                "     timeout: 4444\n" +
+                "     weight: 222\n" +
+                "...";
         try {
-            String path = "/dubbo/config/demo-consumer/org.apache.dubbo.demo.DemoService.CONFIGURATORS";
-            if (client.checkExists().forPath(path) == null) {
-                client.create().creatingParentsIfNeeded().forPath(path);
+            String servicePath = "/dubbo/config/org.apache.dubbo.demo.DemoService/configurators";
+            if (client.checkExists().forPath(servicePath) == null) {
+                client.create().creatingParentsIfNeeded().forPath(servicePath);
             }
-            setData(path, str);
+            setData(servicePath, serviceStr);
+
+            String appPath = "/dubbo/config/demo-consumer/configurators";
+            if (client.checkExists().forPath(appPath) == null) {
+                client.create().creatingParentsIfNeeded().forPath(appPath);
+            }
+            setData(appPath, appStr);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void tesConditionRule() {
+        String serviceStr = "---\n" +
+                "scope: application\n" +
+                "force: true\n" +
+                "runtime: false\n" +
+                "conditions:\n" +
+                "  - method!=sayHello =>\n" +
+                "  - method=routeMethod1 => 30.5.121.156:20880\n" +
+                "...";
+        try {
+            String servicePath = "/dubbo/config/globalrule/";
+            if (client.checkExists().forPath(servicePath) == null) {
+                client.create().creatingParentsIfNeeded().forPath(servicePath);
+            }
+            setData(servicePath, serviceStr);
         } catch (Exception e) {
             e.printStackTrace();
         }
diff --git a/dubbo-config/dubbo-config-dynamic/src/test/resources/AppAnyServices.yml b/dubbo-registry/dubbo-registry-api/src/test/resources/AppAnyServices.yml
similarity index 100%
rename from dubbo-config/dubbo-config-dynamic/src/test/resources/AppAnyServices.yml
rename to dubbo-registry/dubbo-registry-api/src/test/resources/AppAnyServices.yml
diff --git a/dubbo-config/dubbo-config-dynamic/src/test/resources/AppMultiServices.yml b/dubbo-registry/dubbo-registry-api/src/test/resources/AppMultiServices.yml
similarity index 100%
rename from dubbo-config/dubbo-config-dynamic/src/test/resources/AppMultiServices.yml
rename to dubbo-registry/dubbo-registry-api/src/test/resources/AppMultiServices.yml
diff --git a/dubbo-config/dubbo-config-dynamic/src/test/resources/AppNoService.yml b/dubbo-registry/dubbo-registry-api/src/test/resources/AppNoService.yml
similarity index 81%
rename from dubbo-config/dubbo-config-dynamic/src/test/resources/AppNoService.yml
rename to dubbo-registry/dubbo-registry-api/src/test/resources/AppNoService.yml
index 7637016..03d457b 100644
--- a/dubbo-config/dubbo-config-dynamic/src/test/resources/AppNoService.yml
+++ b/dubbo-registry/dubbo-registry-api/src/test/resources/AppNoService.yml
@@ -1,4 +1,4 @@
-# Service scope, without  specific App
+# Service scope, without specific App
 ---
 scope: application
 key: app1
diff --git a/dubbo-registry/dubbo-registry-api/src/test/resources/ConditionRule.yml b/dubbo-registry/dubbo-registry-api/src/test/resources/ConditionRule.yml
new file mode 100644
index 0000000..2b555d9
--- /dev/null
+++ b/dubbo-registry/dubbo-registry-api/src/test/resources/ConditionRule.yml
@@ -0,0 +1,9 @@
+---
+scope: application
+force: true
+runtime: false
+key: group/service:version
+conditions:
+  - method!=sayHello =>
+  - method=routeMethod1 => 30.5.121.156:20880
+...
\ No newline at end of file
diff --git a/dubbo-config/dubbo-config-dynamic/src/test/resources/ServiceGroupVersion.yml b/dubbo-registry/dubbo-registry-api/src/test/resources/ServiceGroupVersion.yml
similarity index 100%
rename from dubbo-config/dubbo-config-dynamic/src/test/resources/ServiceGroupVersion.yml
rename to dubbo-registry/dubbo-registry-api/src/test/resources/ServiceGroupVersion.yml
diff --git a/dubbo-config/dubbo-config-dynamic/src/test/resources/ServiceMultiApps.yml b/dubbo-registry/dubbo-registry-api/src/test/resources/ServiceMultiApps.yml
similarity index 100%
rename from dubbo-config/dubbo-config-dynamic/src/test/resources/ServiceMultiApps.yml
rename to dubbo-registry/dubbo-registry-api/src/test/resources/ServiceMultiApps.yml
diff --git a/dubbo-config/dubbo-config-dynamic/src/test/resources/ServiceNoApp.yml b/dubbo-registry/dubbo-registry-api/src/test/resources/ServiceNoApp.yml
similarity index 100%
rename from dubbo-config/dubbo-config-dynamic/src/test/resources/ServiceNoApp.yml
rename to dubbo-registry/dubbo-registry-api/src/test/resources/ServiceNoApp.yml
diff --git a/dubbo-config/dubbo-config-dynamic/src/test/resources/ServiceNoRule.yml b/dubbo-registry/dubbo-registry-api/src/test/resources/ServiceNoRule.yml
similarity index 100%
rename from dubbo-config/dubbo-config-dynamic/src/test/resources/ServiceNoRule.yml
rename to dubbo-registry/dubbo-registry-api/src/test/resources/ServiceNoRule.yml