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 201d1f3 Add app level configuration file; Unified group and namespace in different configcenter implementation. 201d1f3 is described below commit 201d1f30111c19f7e31c2e3119ffed1863f68668 Author: ken.lj <ken.lj...@gmail.com> AuthorDate: Mon Nov 5 12:18:59 2018 +0800 Add app level configuration file; Unified group and namespace in different configcenter implementation. --- .../java/org/apache/dubbo/common/Constants.java | 4 +- .../org/apache/dubbo/config/AbstractConfig.java | 2 +- .../apache/dubbo/config/ConfigCenterConfig.java | 68 +++++++++++++--------- .../apache/dubbo/config/context/Environment.java | 15 +++++ .../src/main/resources/META-INF/compat/dubbo.xsd | 4 +- .../src/main/resources/META-INF/dubbo.xsd | 4 +- .../META-INF/spring/dubbo-demo-consumer.xml | 6 +- .../META-INF/spring/dubbo-demo-provider.xml | 2 +- .../governance/AbstractDynamicConfiguration.java | 6 +- .../support/apollo/ApolloDynamicConfiguration.java | 13 ++--- .../archaius/ArchaiusDynamicConfiguration.java | 23 ++++++++ .../sources/ZooKeeperConfigurationSource.java | 5 +- .../java/org/apache/dubbo/registry/ZKTools.java | 4 +- 13 files changed, 105 insertions(+), 51 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java index df67944..a4b64ca 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java @@ -63,10 +63,12 @@ public class Constants { public static final String CONFIG_ENV_KEY = "config.env"; public static final String CONFIG_CLUSTER_KEY = "config.cluster"; public static final String CONFIG_NAMESPACE_KEY = "config.namespace"; + public static final String CONFIG_GROUP_KEY = "config.group"; public static final String CONFIG_CHECK_KEY = "config.check"; - public static final String CONFIG_DATAID_KEY = "config.dataid"; + public static final String CONFIG_CONFIGFILE_KEY = "config.configfile"; public static final String CONFIG_PRIORITY_KEY = "config.priority"; public static final String CONFIG_TIMEOUT_KEY = "config.timeout"; + public static final String CONFIG_APPNAME_KEY = "config.appname"; public static final String DEFAULT_CATEGORY = PROVIDERS_CATEGORY; diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java index 68717cb..236e2ba 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java @@ -526,7 +526,7 @@ public abstract class AbstractConfig implements Serializable { try { Configuration configuration = ConfigConverter.toConfiguration(this); CompositeConfiguration compositeConfiguration = Environment.getInstance().getStartupCompositeConf(getPrefix(), getId()); - int index = 2; + int index = 3; if (!Environment.getInstance().isConfigCenterFirst()) { index = 1; } 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 e24363a..d454caf 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 @@ -40,14 +40,15 @@ public class ConfigCenterConfig extends AbstractConfig { private String env; private String cluster; private String namespace = "dubbo"; - private String appnamespace; + private String group = "dubbo"; private String username; private String password; private Long timeout = 3000L; private Boolean priority = true; private Boolean check = true; - private String dataid = "dubbo.properties"; + private String appname; + private String configfile = "dubbo.properties"; // customized parameters private Map<String, String> parameters; @@ -77,32 +78,38 @@ public class ConfigCenterConfig extends AbstractConfig { } public void init() throws Exception { - // give jvm properties the chance of overriding local configs. + // give jvm properties the chance to override local configs, e.g., -Ddubbo.configcenter.config.priority refresh(); URL url = toConfigUrl(); DynamicConfiguration dynamicConfiguration = ExtensionLoader.getExtensionLoader(DynamicConfigurationFactory.class).getAdaptiveExtension().getDynamicConfiguration(url); Environment.getInstance().setDynamicConfiguration(dynamicConfiguration); - String configContent = dynamicConfiguration.getConfig(dataid, namespace); + String configContent = dynamicConfiguration.getConfig(configfile, group); + String appConfigContent = dynamicConfiguration.getConfig(configfile, appname); try { - if (configContent == null) { - logger.warn("You specified the config centre, but there's not even one single config item in it."); - } else { - Properties properties = new Properties(); - properties.load(new StringReader(configContent)); - Map<String, String> map = new HashMap<>(); - properties.stringPropertyNames().forEach( - k -> map.put(k, properties.getProperty(k)) - ); - Environment.getInstance().setConfigCenterFirst(priority); - Environment.getInstance().updateExternalConfigurationMap(map); - } + Environment.getInstance().setConfigCenterFirst(priority); + Environment.getInstance().updateExternalConfigurationMap(parseProperties(configContent)); + Environment.getInstance().updateAppExternalConfigurationMap(parseProperties(appConfigContent)); } catch (IOException e) { throw e; } } + private Map<String, String> parseProperties(String content) throws IOException { + Map<String, String> map = new HashMap<>(); + if (content == null) { + logger.warn("You specified the config centre, but there's not even one single config item in it."); + } else { + Properties properties = new Properties(); + properties.load(new StringReader(content)); + properties.stringPropertyNames().forEach( + k -> map.put(k, properties.getProperty(k)) + ); + } + return map; + } + @Parameter(key = Constants.CONFIG_TYPE_KEY) public String getType() { return type; @@ -148,13 +155,13 @@ public class ConfigCenterConfig extends AbstractConfig { this.namespace = namespace; } - @Parameter(key = "config.appnamespace") - public String getAppnamespace() { - return appnamespace; + @Parameter(key = Constants.CONFIG_GROUP_KEY) + public String getGroup() { + return group; } - public void setAppnamespace(String appnamespace) { - this.appnamespace = appnamespace; + public void setGroup(String group) { + this.group = group; } @Parameter(key = Constants.CONFIG_CHECK_KEY) @@ -200,13 +207,22 @@ public class ConfigCenterConfig extends AbstractConfig { this.timeout = timeout; } - @Parameter(key = Constants.CONFIG_DATAID_KEY) - public String getDataid() { - return dataid; + @Parameter(key = Constants.CONFIG_CONFIGFILE_KEY) + public String getConfigfile() { + return configfile; + } + + public void setConfigfile(String configfile) { + this.configfile = configfile; + } + + @Parameter(key = Constants.CONFIG_APPNAME_KEY) + public String getAppname() { + return appname; } - public void setDataid(String dataid) { - this.dataid = dataid; + public void setAppname(String appname) { + this.appname = appname; } public Map<String, String> getParameters() { diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java index 1785c6a..0a2bf12 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/context/Environment.java @@ -42,6 +42,7 @@ public class Environment { private volatile Map<String, SystemConfiguration> systemConfsHolder = new ConcurrentHashMap<>(); private volatile Map<String, EnvironmentConfiguration> environmentConfsHolder = new ConcurrentHashMap<>(); private volatile Map<String, InmemoryConfiguration> externalConfsHolder = new ConcurrentHashMap<>(); + private volatile Map<String, InmemoryConfiguration> appExternalConfsHolder = new ConcurrentHashMap<>(); private volatile Map<String, CompositeConfiguration> startupCompositeConfsHolder = new ConcurrentHashMap<>(); private volatile Map<String, CompositeConfiguration> runtimeCompositeConfsHolder = new ConcurrentHashMap<>(); @@ -50,6 +51,7 @@ public class Environment { private volatile boolean isConfigCenterFirst = true; private Map<String, String> externalConfigurationMap = new HashMap<>(); + private Map<String, String> appExternalConfigurationMap = new HashMap<>(); public static Environment getInstance() { return INSTANCE; @@ -71,6 +73,14 @@ public class Environment { }); } + public InmemoryConfiguration getAppExternalConfiguration(String prefix, String id) { + return appExternalConfsHolder.computeIfAbsent(toKey(prefix, id), k -> { + InmemoryConfiguration configuration = new InmemoryConfiguration(prefix, id); + configuration.addProperties(appExternalConfigurationMap); + return configuration; + }); + } + public EnvironmentConfiguration getEnvironmentConf(String prefix, String id) { return environmentConfsHolder.computeIfAbsent(toKey(prefix, id), k -> new EnvironmentConfiguration(prefix, id)); } @@ -79,10 +89,15 @@ public class Environment { this.externalConfigurationMap.putAll(externalMap); } + public void updateAppExternalConfigurationMap(Map<String, String> externalMap) { + this.appExternalConfigurationMap.putAll(externalMap); + } + public CompositeConfiguration getStartupCompositeConf(String prefix, String id) { return startupCompositeConfsHolder.computeIfAbsent(toKey(prefix, id), k -> { CompositeConfiguration compositeConfiguration = new CompositeConfiguration(); compositeConfiguration.addConfiguration(this.getSystemConf(prefix, id)); + compositeConfiguration.addConfiguration(this.getAppExternalConfiguration(prefix, id)); compositeConfiguration.addConfiguration(this.getExternalConfiguration(prefix, id)); compositeConfiguration.addConfiguration(this.getPropertiesConf(prefix, id)); return compositeConfiguration; 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 1d2fc18..9810969 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 @@ -624,12 +624,12 @@ <![CDATA[ The group of the config center, an isolated space for config items in the same config center. ]]></xsd:documentation> </xsd:annotation> </xsd:attribute> - <xsd:attribute name="appnamespace" type="xsd:string" use="optional"> + <xsd:attribute name="appname" type="xsd:string" use="optional"> <xsd:annotation> <xsd:documentation><![CDATA[ The group of the config center. ]]></xsd:documentation> </xsd:annotation> </xsd:attribute> - <xsd:attribute name="dataid" type="xsd:string" use="optional"> + <xsd:attribute name="configfile" type="xsd:string" use="optional"> <xsd:annotation> <xsd:documentation><![CDATA[ The key used to get the configs at startup. ]]></xsd:documentation> </xsd:annotation> 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 028c68e..b2ff6cb 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 @@ -618,12 +618,12 @@ <![CDATA[ The group of the config center, an isolated space for config items in the same config center. ]]></xsd:documentation> </xsd:annotation> </xsd:attribute> - <xsd:attribute name="appnamespace" type="xsd:string" use="optional"> + <xsd:attribute name="appname" type="xsd:string" use="optional"> <xsd:annotation> <xsd:documentation><![CDATA[ The group of the config center. ]]></xsd:documentation> </xsd:annotation> </xsd:attribute> - <xsd:attribute name="dataid" type="xsd:string" use="optional"> + <xsd:attribute name="configfile" type="xsd:string" use="optional"> <xsd:annotation> <xsd:documentation><![CDATA[ The key used to get the configs at startup. ]]></xsd:documentation> </xsd:annotation> diff --git a/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml b/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml index df40d32..a8d25a8 100644 --- a/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml +++ b/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml @@ -24,11 +24,11 @@ <dubbo:application name="demo-consumer"/> <!-- use multicast registry center to discover service --> - <dubbo:registry group="dubboregistrygroup1" address="zookeeper://127.0.0.1:2181" default="true"/> - <dubbo:registry group="dubboregistrygroup1" address="zookeeper://127.0.0.1:2181"/> + <!-- <dubbo:registry group="dubboregistrygroup1" address="zookeeper://127.0.0.1:2181" default="true"/> + <dubbo:registry group="dubboregistrygroup1" address="zookeeper://127.0.0.1:2181"/>--> <dubbo:configcenter type="zookeeper" address="127.0.0.1:2181" namespace="dubboregistrygroup1" - dataid="dubbo.properties"/> + configfile="dubbo.properties"/> <!-- generate proxy for the remote service, then demoService can be used in the same way as the local regular interface --> diff --git a/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml b/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml index 3d2e2ed..1ac3128 100644 --- a/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml +++ b/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml @@ -28,7 +28,7 @@ <!--<dubbo:registry group="dubboregistrygroup1" address="zookeeper://127.0.0.1:2181" simple="false"> </dubbo:registry>--> <dubbo:configcenter type="zookeeper" address="127.0.0.1:2181" namespace="dubboregistrygroup1" - dataid="dubbo.properties"/> + configfile="dubbo.properties" appname="demo-provider"/> <!-- use dubbo protocol to export service on port 20880 --> <dubbo:protocol name="dubbo" port="-1"/> diff --git a/dubbo-governance/dubbo-governance-api/src/main/java/org/apache/dubbo/governance/AbstractDynamicConfiguration.java b/dubbo-governance/dubbo-governance-api/src/main/java/org/apache/dubbo/governance/AbstractDynamicConfiguration.java index 2de419b..146f0a1 100644 --- a/dubbo-governance/dubbo-governance-api/src/main/java/org/apache/dubbo/governance/AbstractDynamicConfiguration.java +++ b/dubbo-governance/dubbo-governance-api/src/main/java/org/apache/dubbo/governance/AbstractDynamicConfiguration.java @@ -27,7 +27,7 @@ import java.util.concurrent.ConcurrentMap; * */ public abstract class AbstractDynamicConfiguration<TargetConfigListener> extends AbstractConfiguration implements DynamicConfiguration { - public static final String DEFAULT_NAMESPACE = "dubbo"; + public static final String DEFAULT_GROUP = "dubbo"; protected URL url; /** * One key can register multiple target listeners, but one target listener only maps to one configuration listener @@ -46,7 +46,7 @@ public abstract class AbstractDynamicConfiguration<TargetConfigListener> extends @Override public String getConfig(String key) { - return getConfig(key, url.getParameter(Constants.CONFIG_NAMESPACE_KEY, DEFAULT_NAMESPACE), null); + return getConfig(key, url.getParameter(Constants.CONFIG_GROUP_KEY, DEFAULT_GROUP), null); } @Override @@ -56,7 +56,7 @@ public abstract class AbstractDynamicConfiguration<TargetConfigListener> extends @Override public String getConfig(String key, ConfigurationListener listener) { - return getConfig(key, url.getParameter(Constants.CONFIG_NAMESPACE_KEY, DEFAULT_NAMESPACE), listener); + return getConfig(key, url.getParameter(Constants.CONFIG_GROUP_KEY, DEFAULT_GROUP), listener); } @Override diff --git a/dubbo-governance/dubbo-governance-apollo/src/main/java/org/apache/dubbo/governance/support/apollo/ApolloDynamicConfiguration.java b/dubbo-governance/dubbo-governance-apollo/src/main/java/org/apache/dubbo/governance/support/apollo/ApolloDynamicConfiguration.java index 0c83088..b236709 100644 --- a/dubbo-governance/dubbo-governance-apollo/src/main/java/org/apache/dubbo/governance/support/apollo/ApolloDynamicConfiguration.java +++ b/dubbo-governance/dubbo-governance-apollo/src/main/java/org/apache/dubbo/governance/support/apollo/ApolloDynamicConfiguration.java @@ -44,7 +44,6 @@ public class ApolloDynamicConfiguration extends AbstractDynamicConfiguration<Con private static final String APOLLO_ENV_KEY = "env"; private static final String APOLLO_ADDR_KEY = "apollo.meta"; private static final String APOLLO_CLUSTER_KEY = "apollo.cluster"; - private static final String APPLO_DEFAULT_NAMESPACE = "dubbo"; private Config dubboConfig; @@ -72,7 +71,7 @@ public class ApolloDynamicConfiguration extends AbstractDynamicConfiguration<Con System.setProperty(APOLLO_CLUSTER_KEY, configCluster); } - dubboConfig = ConfigService.getConfig(url.getParameter(Constants.CONFIG_NAMESPACE_KEY, APPLO_DEFAULT_NAMESPACE)); + dubboConfig = ConfigService.getConfig(url.getParameter(Constants.CONFIG_GROUP_KEY, DEFAULT_GROUP)); // Decide to fail or to continue when failed to connect to remote server. boolean check = url.getParameter(Constants.CONFIG_CHECK_KEY, false); if (dubboConfig.getSourceType() != ConfigSourceType.REMOTE) { @@ -87,9 +86,9 @@ public class ApolloDynamicConfiguration extends AbstractDynamicConfiguration<Con } /** - * This method will used by DynamicConfiguration, - * 1. to get configuration file at startup phase - * 2. to get all kinds of Dubbo rules + * This method will being used to, + * 1. get configuration file at startup phase + * 2. get all kinds of Dubbo rules * * @param key * @param group @@ -98,7 +97,7 @@ public class ApolloDynamicConfiguration extends AbstractDynamicConfiguration<Con */ @Override protected String getInternalProperty(String key, String group, long timeout) { - if (group != null) { + if (DEFAULT_GROUP.equals(group)) { Config config = ConfigService.getConfig(group); if (config != null) { return config.getProperty(key, null); @@ -111,7 +110,7 @@ public class ApolloDynamicConfiguration extends AbstractDynamicConfiguration<Con /** * This method will 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. - * But I think Apollo's inheritance feature of namespace can solve the problem, . + * But I think Apollo's inheritance feature of namespace can solve the problem . * * @param key * @return diff --git a/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/ArchaiusDynamicConfiguration.java b/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/ArchaiusDynamicConfiguration.java index 922387d..e35f95d 100644 --- a/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/ArchaiusDynamicConfiguration.java +++ b/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/ArchaiusDynamicConfiguration.java @@ -63,13 +63,36 @@ public class ArchaiusDynamicConfiguration extends AbstractDynamicConfiguration<R } } + /** + * The hierarchy of configuration properties is: + * 1. /{namespace}/config/dubbo/dubbo.properties + * 2. /{namespace}/config/applicationname/dubbo.properties + * <p> + * To make the API compatible with other configuration systems, the key doesn't has group as prefix, so we should add the group prefix before try to get value. + * If being used for dubbo router rules, the key must already contains group prefix. + * + * @param key + * @param group + * @param timeout + * @return + */ @Override protected String getInternalProperty(String key, String group, long timeout) { + if (StringUtils.isNotEmpty(group)) { + key = group + "." + key; + } + return DynamicPropertyFactory.getInstance() .getStringProperty(key, null) .get(); } + /** + * First, get app level configuration + * If there's no value in app level, try to get global dubbo level. + * @param key + * @return + */ @Override protected Object getInternalProperty(String key) { return DynamicPropertyFactory.getInstance() diff --git a/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/sources/ZooKeeperConfigurationSource.java b/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/sources/ZooKeeperConfigurationSource.java index ec48c2d..2e810d4 100644 --- a/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/sources/ZooKeeperConfigurationSource.java +++ b/dubbo-governance/dubbo-governance-zookeeper/src/main/java/org/apache/dubbo/governance/support/archaius/sources/ZooKeeperConfigurationSource.java @@ -27,7 +27,6 @@ import org.apache.curator.framework.recipes.cache.TreeCache; import org.apache.curator.framework.recipes.cache.TreeCacheEvent; import org.apache.curator.framework.recipes.cache.TreeCacheListener; import org.apache.curator.retry.ExponentialBackoffRetry; -import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.utils.StringUtils; import org.slf4j.Logger; @@ -212,10 +211,10 @@ public class ZooKeeperConfigurationSource implements WatchedConfigurationSource, if (dataMap != null && dataMap.size() > 0) { dataMap.forEach((childPath, childData) -> { String fullChildPath = configRootPath + "/" + childPath; - // special treatment for /dubbo/config/dubbo.properties, it's the only config item need to store in cache in this level. + /*// special treatment for /dubbo/config/dubbo.properties, it's the only config item need to store in cache in this level. if (childPath.equals(url.getParameter(Constants.CONFIG_DATAID_KEY))) { all.put(pathToKey(fullChildPath), new String(childData.getData(), charset)); - } + }*/ treeCache.getCurrentChildren(fullChildPath).forEach((subChildPath, subChildData) -> { all.put(pathToKey(fullChildPath + "/" + subChildPath), new String(subChildData.getData(), charset)); }); 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 480c3a8..930a286 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 @@ -52,7 +52,7 @@ public class ZKTools { } public static void testStartupConfig() { - String str = "dubbo.registry.address=zookeeper://127.0.0.1:2181\n" + + String str = "dubbo.registry.address=zookeeper://127.0.0.1:2182\n" + "dubbo.registry.group=dubboregistrygroup1\n" + "dubbo.servicestore.address=zookeeper://127.0.0.1:2181\n" + "dubbo.protocol.port=20990\n" + @@ -61,7 +61,7 @@ public class ZKTools { System.out.println(str); try { - String path = "/dubboregistrygroup1/config/dubbo.properties"; + String path = "/dubboregistrygroup1/config/demo-provider/dubbo.properties"; if (client.checkExists().forPath(path) == null) { client.create().creatingParentsIfNeeded().forPath(path); }