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