diff --git a/all/pom.xml b/all/pom.xml
index 3da5e4bf6..7610e334b 100644
--- a/all/pom.xml
+++ b/all/pom.xml
@@ -310,6 +310,16 @@
sofa-rpc-config-apollo
${project.version}
+
+ com.alipay.sofa
+ sofa-rpc-config-zk
+ ${project.version}
+
+
+ com.alipay.sofa
+ sofa-rpc-config-nacos
+ ${project.version}
+
com.alipay.sofa
bolt
@@ -565,6 +575,8 @@
com.alipay.sofa:sofa-rpc-tracer-opentracing-resteasy
com.alipay.sofa:sofa-rpc-tracer-opentracing-triple
com.alipay.sofa:sofa-rpc-config-apollo
+ com.alipay.sofa:sofa-rpc-config-zk
+ com.alipay.sofa:sofa-rpc-config-nacos
com.alipay.sofa:sofa-rpc-doc-swagger
diff --git a/config/config-apollo/src/test/java/com/alipay/sofa/rpc/dynamic/apollo/ApolloDynamicConfigManagerTest.java b/config/config-apollo/src/test/java/com/alipay/sofa/rpc/dynamic/apollo/ApolloDynamicConfigManagerTest.java
index 5fbb4daf0..2b08e90d3 100644
--- a/config/config-apollo/src/test/java/com/alipay/sofa/rpc/dynamic/apollo/ApolloDynamicConfigManagerTest.java
+++ b/config/config-apollo/src/test/java/com/alipay/sofa/rpc/dynamic/apollo/ApolloDynamicConfigManagerTest.java
@@ -16,6 +16,8 @@
*/
package com.alipay.sofa.rpc.dynamic.apollo;
+import com.alipay.sofa.rpc.dynamic.DynamicConfigManager;
+import com.alipay.sofa.rpc.dynamic.DynamicConfigManagerFactory;
import com.alipay.sofa.rpc.dynamic.DynamicHelper;
import com.alipay.sofa.rpc.log.Logger;
import com.alipay.sofa.rpc.log.LoggerFactory;
@@ -24,10 +26,11 @@
public class ApolloDynamicConfigManagerTest {
- private final static Logger logger = LoggerFactory
- .getLogger(ApolloDynamicConfigManagerTest.class);
+ private final static Logger logger = LoggerFactory
+ .getLogger(ApolloDynamicConfigManagerTest.class);
- private ApolloDynamicConfigManager apolloDynamicConfigManager = new ApolloDynamicConfigManager("test");
+ private DynamicConfigManager apolloDynamicConfigManager = DynamicConfigManagerFactory.getDynamicManager("test",
+ "apollo");
@Test
public void getProviderServiceProperty() {
@@ -37,17 +40,19 @@ public void getProviderServiceProperty() {
@Test
public void getConsumerServiceProperty() {
+ String result = apolloDynamicConfigManager.getConsumerServiceProperty("serviceName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
}
@Test
public void getProviderMethodProperty() {
+ String result = apolloDynamicConfigManager.getProviderMethodProperty("serviceName", "methodName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
}
@Test
public void getConsumerMethodProperty() {
- }
-
- @Test
- public void getServiceAuthRule() {
+ String result = apolloDynamicConfigManager.getConsumerMethodProperty("serviceName", "methodName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
}
}
\ No newline at end of file
diff --git a/config/config-nacos/pom.xml b/config/config-nacos/pom.xml
new file mode 100644
index 000000000..4e0d8740b
--- /dev/null
+++ b/config/config-nacos/pom.xml
@@ -0,0 +1,107 @@
+
+
+ 4.0.0
+
+
+ com.alipay.sofa
+ sofa-rpc-config
+ ${revision}
+
+
+ sofa-rpc-config-nacos
+
+
+
+ com.alipay.sofa
+ sofa-rpc-log-common-tools
+
+
+ com.alipay.sofa
+ sofa-rpc-log
+
+
+ com.alipay.sofa
+ sofa-rpc-api
+
+
+
+ com.alibaba.nacos
+ nacos-client
+
+
+ org.slf4j
+ slf4j-log4j12
+ test
+
+
+ junit
+ junit
+ test
+
+
+
+
+
+ src/main/java
+
+
+ src/main/resources
+ false
+
+ **/**
+
+
+
+ src/test/java
+
+
+ src/test/resources
+ false
+
+ **/**
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ ${maven.compiler.source}
+ ${project.build.sourceEncoding}
+
+
+
+ org.apache.maven.plugins
+ maven-install-plugin
+
+ ${module.install.skip}
+
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+
+ ${module.deploy.skip}
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ ${skipTests}
+
+
+ **/*Test.java
+
+
+ once
+
+
+
+
+
diff --git a/config/config-nacos/src/main/java/com/alipay/sofa/rpc/dynamic/nacos/NacosDynamicConfigManager.java b/config/config-nacos/src/main/java/com/alipay/sofa/rpc/dynamic/nacos/NacosDynamicConfigManager.java
new file mode 100644
index 000000000..f5b9800ff
--- /dev/null
+++ b/config/config-nacos/src/main/java/com/alipay/sofa/rpc/dynamic/nacos/NacosDynamicConfigManager.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alipay.sofa.rpc.dynamic.nacos;
+
+import com.alibaba.nacos.api.PropertyKeyConst;
+import com.alipay.sofa.common.config.SofaConfigs;
+import com.alipay.sofa.rpc.auth.AuthRuleGroup;
+import com.alipay.sofa.rpc.common.config.RpcConfigKeys;
+import com.alipay.sofa.rpc.common.utils.StringUtils;
+import com.alipay.sofa.rpc.dynamic.DynamicConfigKeyHelper;
+import com.alipay.sofa.rpc.dynamic.DynamicConfigManager;
+import com.alipay.sofa.rpc.dynamic.DynamicHelper;
+import com.alipay.sofa.rpc.ext.Extension;
+import com.alibaba.nacos.api.config.ConfigService;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.config.ConfigFactory;
+import com.alipay.sofa.rpc.log.Logger;
+import com.alipay.sofa.rpc.log.LoggerFactory;
+
+import java.util.Properties;
+
+/**
+ * @author Narziss
+ * @version NaocsDynamicConfigManager.java, v 0.1 2024年07月26日 09:37 Narziss
+ */
+
+@Extension(value = "nacos", override = true)
+public class NacosDynamicConfigManager extends DynamicConfigManager {
+
+ private final static Logger LOGGER = LoggerFactory.getLogger(NacosDynamicConfigManager.class);
+ private static final String DEFAULT_NAMESPACE = "sofa-rpc";
+ private static final String ADDRESS = SofaConfigs.getOrDefault(RpcConfigKeys.NACOS_ADDRESS);
+ private static final String DEFAULT_GROUP = "sofa-rpc";
+ private static final long DEFAULT_TIMEOUT = 5000;
+ private ConfigService configService;
+ private Properties nacosConfig = new Properties();
+ private final String appName;
+
+ protected NacosDynamicConfigManager(String appName) {
+ super(appName);
+ if (StringUtils.isEmpty(appName)) {
+ this.appName = DEFAULT_GROUP;
+ } else {
+ this.appName = appName;
+ }
+ try {
+ nacosConfig.put(PropertyKeyConst.SERVER_ADDR, ADDRESS);
+ nacosConfig.put(PropertyKeyConst.NAMESPACE, DEFAULT_NAMESPACE);
+ configService = ConfigFactory.createConfigService(nacosConfig);
+
+ } catch (NacosException e) {
+ LOGGER.error("Failed to create ConfigService", e);
+ }
+ }
+
+ @Override
+ public void initServiceConfiguration(String service) {
+ //TODO not now
+
+ }
+
+ @Override
+ public String getProviderServiceProperty(String service, String key) {
+ try {
+ String configValue = configService.getConfig(
+ DynamicConfigKeyHelper.buildProviderServiceProKey(service, key),
+ appName, DEFAULT_TIMEOUT);
+ return configValue != null ? configValue : DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ } catch (NacosException e) {
+ return DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ }
+ }
+
+ @Override
+ public String getConsumerServiceProperty(String service, String key) {
+ try {
+ String configValue = configService.getConfig(
+ DynamicConfigKeyHelper.buildConsumerServiceProKey(service, key),
+ appName, DEFAULT_TIMEOUT);
+ return configValue != null ? configValue : DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ } catch (NacosException e) {
+ return DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ }
+ }
+
+ @Override
+ public String getProviderMethodProperty(String service, String method, String key) {
+ try {
+ String configValue = configService.getConfig(
+ DynamicConfigKeyHelper.buildProviderMethodProKey(service, method, key),
+ appName, DEFAULT_TIMEOUT);
+ return configValue != null ? configValue : DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ } catch (NacosException e) {
+ return DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ }
+ }
+
+ @Override
+ public String getConsumerMethodProperty(String service, String method, String key) {
+ try {
+ String configValue = configService.getConfig(
+ DynamicConfigKeyHelper.buildConsumerMethodProKey(service, method, key),
+ appName, DEFAULT_TIMEOUT);
+ return configValue != null ? configValue : DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ } catch (NacosException e) {
+ return DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ }
+ }
+
+ @Override
+ public AuthRuleGroup getServiceAuthRule(String service) {
+ //TODO 暂不支持
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/config/config-nacos/src/main/resources/META-INF/services/sofa-rpc/com.alipay.sofa.rpc.dynamic.DynamicConfigManager b/config/config-nacos/src/main/resources/META-INF/services/sofa-rpc/com.alipay.sofa.rpc.dynamic.DynamicConfigManager
new file mode 100644
index 000000000..c055a88ae
--- /dev/null
+++ b/config/config-nacos/src/main/resources/META-INF/services/sofa-rpc/com.alipay.sofa.rpc.dynamic.DynamicConfigManager
@@ -0,0 +1,2 @@
+nacos=com.alipay.sofa.rpc.dynamic.nacos.NacosDynamicConfigManager
+
diff --git a/config/config-nacos/src/test/java/com/alipay/sofa/rpc/dynamic/nacos/NacosDynamicConfigManagerTest.java b/config/config-nacos/src/test/java/com/alipay/sofa/rpc/dynamic/nacos/NacosDynamicConfigManagerTest.java
new file mode 100644
index 000000000..f880cdf7b
--- /dev/null
+++ b/config/config-nacos/src/test/java/com/alipay/sofa/rpc/dynamic/nacos/NacosDynamicConfigManagerTest.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alipay.sofa.rpc.dynamic.nacos;
+
+import com.alipay.sofa.rpc.dynamic.DynamicConfigManager;
+import com.alipay.sofa.rpc.dynamic.DynamicConfigManagerFactory;
+import com.alipay.sofa.rpc.dynamic.DynamicHelper;
+import com.alipay.sofa.rpc.log.Logger;
+import com.alipay.sofa.rpc.log.LoggerFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class NacosDynamicConfigManagerTest {
+
+ private final static Logger logger = LoggerFactory
+ .getLogger(NacosDynamicConfigManagerTest.class);
+
+ private DynamicConfigManager nacosDynamicConfigManager = DynamicConfigManagerFactory.getDynamicManager("test",
+ "nacos");
+
+ @Test
+ public void getProviderServiceProperty() {
+ String result = nacosDynamicConfigManager.getProviderServiceProperty("serviceName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
+ }
+
+ @Test
+ public void getConsumerServiceProperty() {
+ String result = nacosDynamicConfigManager.getConsumerServiceProperty("serviceName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
+ }
+
+ @Test
+ public void getProviderMethodProperty() {
+ String result = nacosDynamicConfigManager.getProviderMethodProperty("serviceName", "methodName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
+ }
+
+ @Test
+ public void getConsumerMethodProperty() {
+ String result = nacosDynamicConfigManager.getConsumerMethodProperty("serviceName", "methodName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
+ }
+}
\ No newline at end of file
diff --git a/config/config-nacos/src/test/resources/log4j.xml b/config/config-nacos/src/test/resources/log4j.xml
new file mode 100644
index 000000000..e95634f16
--- /dev/null
+++ b/config/config-nacos/src/test/resources/log4j.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/config/config-zk/pom.xml b/config/config-zk/pom.xml
new file mode 100644
index 000000000..8701b83b0
--- /dev/null
+++ b/config/config-zk/pom.xml
@@ -0,0 +1,117 @@
+
+
+ 4.0.0
+
+
+ com.alipay.sofa
+ sofa-rpc-config
+ ${revision}
+
+
+ sofa-rpc-config-zk
+
+
+
+ com.alipay.sofa
+ sofa-rpc-log-common-tools
+
+
+ com.alipay.sofa
+ sofa-rpc-log
+
+
+ com.alipay.sofa
+ sofa-rpc-api
+
+
+
+ org.apache.curator
+ curator-framework
+
+
+ org.apache.curator
+ curator-x-discovery
+
+
+ org.apache.zookeeper
+ zookeeper
+
+
+
+ org.slf4j
+ slf4j-log4j12
+ test
+
+
+ junit
+ junit
+ test
+
+
+
+
+
+
+ src/main/java
+
+
+ src/main/resources
+ false
+
+ **/**
+
+
+
+ src/test/java
+
+
+ src/test/resources
+ false
+
+ **/**
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ ${maven.compiler.source}
+ ${project.build.sourceEncoding}
+
+
+
+ org.apache.maven.plugins
+ maven-install-plugin
+
+ ${module.install.skip}
+
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+
+ ${module.deploy.skip}
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ ${skipTests}
+
+
+ **/*Test.java
+
+
+ once
+
+
+
+
+
diff --git a/config/config-zk/src/main/java/com/alipay/sofa/rpc/dynamic/zk/ZookeeperDynamicConfigManager.java b/config/config-zk/src/main/java/com/alipay/sofa/rpc/dynamic/zk/ZookeeperDynamicConfigManager.java
new file mode 100644
index 000000000..363ddb534
--- /dev/null
+++ b/config/config-zk/src/main/java/com/alipay/sofa/rpc/dynamic/zk/ZookeeperDynamicConfigManager.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alipay.sofa.rpc.dynamic.zk;
+
+import com.alipay.sofa.common.config.SofaConfigs;
+import com.alipay.sofa.rpc.auth.AuthRuleGroup;
+import com.alipay.sofa.rpc.common.config.RpcConfigKeys;
+import com.alipay.sofa.rpc.common.utils.StringUtils;
+import com.alipay.sofa.rpc.dynamic.DynamicConfigKeyHelper;
+import com.alipay.sofa.rpc.dynamic.DynamicConfigManager;
+import com.alipay.sofa.rpc.dynamic.DynamicHelper;
+import com.alipay.sofa.rpc.ext.Extension;
+import com.alipay.sofa.rpc.log.Logger;
+import com.alipay.sofa.rpc.log.LoggerFactory;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.recipes.cache.PathChildrenCache;
+import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
+import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
+import org.apache.curator.retry.ExponentialBackoffRetry;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import static com.alipay.sofa.rpc.common.utils.StringUtils.CONTEXT_SEP;
+
+/**
+ * @author Narziss
+ * @version ZookeeperDynamicConfigManager.java, v 0.1 2024年07月20日 09:23 Narziss
+ */
+
+@Extension(value = "zookeeper", override = true)
+public class ZookeeperDynamicConfigManager extends DynamicConfigManager {
+
+ private final static Logger LOGGER = LoggerFactory
+ .getLogger(ZookeeperDynamicConfigManager.class);
+ private final CuratorFramework zkClient;
+ private static final String ADDRESS = SofaConfigs
+ .getOrDefault(RpcConfigKeys.ZK_ADDRESS);
+ private static final String DEFAULT_NAMESPACE = "sofa-rpc";
+ private static final String CONFIG_NODE = "config";
+ private static final String DEFAULT_APP = "sofa-rpc";
+ private final String appName;
+ private final String rootPath;
+ private ConcurrentMap configMap = new ConcurrentHashMap<>();
+
+ protected ZookeeperDynamicConfigManager(String appName) {
+ super(appName);
+ if (StringUtils.isEmpty(appName)) {
+ this.appName = DEFAULT_APP;
+ } else {
+ this.appName = appName;
+ }
+ rootPath = CONTEXT_SEP + CONFIG_NODE + CONTEXT_SEP + appName;
+ zkClient = CuratorFrameworkFactory.builder()
+ .connectString(ADDRESS)
+ .retryPolicy(new ExponentialBackoffRetry(1000, 3))
+ .namespace(DEFAULT_NAMESPACE)
+ .build();
+ zkClient.start();
+
+ PathChildrenCache cache = new PathChildrenCache(zkClient, rootPath, true);
+ cache.getListenable().addListener(new PathChildrenCacheListener() {
+ @Override
+ public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
+ switch (event.getType()) {
+ case CHILD_ADDED:
+ case CHILD_UPDATED:
+ String key = event.getData().getPath().substring(rootPath.length() + 1);
+ String value = new String(event.getData().getData());
+ configMap.put(key, value);
+ LOGGER.info("Receive zookeeper event: " + "type=[" + event.getType() + "] key=[" + key + "] value=[" + value + "]");
+ break;
+ case CHILD_REMOVED:
+ key = event.getData().getPath().substring(rootPath.length() + 1);
+ configMap.remove(key);
+ LOGGER.info("Receive zookeeper event: " + "type=[" + event.getType() + "] key=[" + key + "]");
+ break;
+ default:
+ break;
+ }
+ }
+ });
+ try {
+ cache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
+ } catch (Exception e) {
+ LOGGER.error("setupPathChildrenCache error", e);
+ }
+ }
+
+ @Override
+ public void initServiceConfiguration(String service) {
+ //TODO not now
+ }
+
+ @Override
+ public String getProviderServiceProperty(String service, String key) {
+ try {
+ String configValue = configMap.get(DynamicConfigKeyHelper.buildProviderServiceProKey(service, key));
+ return configValue != null ? configValue : DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ } catch (Exception e) {
+ return DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ }
+ }
+
+ @Override
+ public String getConsumerServiceProperty(String service, String key) {
+ try {
+ String configValue = configMap.get(DynamicConfigKeyHelper.buildConsumerServiceProKey(service, key));
+ return configValue != null ? configValue : DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ } catch (Exception e) {
+ return DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ }
+ }
+
+ @Override
+ public String getProviderMethodProperty(String service, String method, String key) {
+ try {
+ String configValue = configMap.get(DynamicConfigKeyHelper.buildProviderMethodProKey(service, method, key));
+ return configValue != null ? configValue : DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ } catch (Exception e) {
+ return DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ }
+ }
+
+ @Override
+ public String getConsumerMethodProperty(String service, String method, String key) {
+ try {
+ String configValue = configMap.get(DynamicConfigKeyHelper.buildConsumerMethodProKey(service, method, key));
+ return configValue != null ? configValue : DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ } catch (Exception e) {
+ return DynamicHelper.DEFAULT_DYNAMIC_VALUE;
+ }
+
+ }
+
+ @Override
+ public AuthRuleGroup getServiceAuthRule(String service) {
+ //TODO 暂不支持
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/config/config-zk/src/main/resources/META-INF/services/sofa-rpc/com.alipay.sofa.rpc.dynamic.DynamicConfigManager b/config/config-zk/src/main/resources/META-INF/services/sofa-rpc/com.alipay.sofa.rpc.dynamic.DynamicConfigManager
new file mode 100644
index 000000000..5f9a8243e
--- /dev/null
+++ b/config/config-zk/src/main/resources/META-INF/services/sofa-rpc/com.alipay.sofa.rpc.dynamic.DynamicConfigManager
@@ -0,0 +1 @@
+zookeeper=com.alipay.sofa.rpc.dynamic.zk.ZookeeperDynamicConfigManager
diff --git a/config/config-zk/src/test/java/com/alipay/sofa/rpc/dynamic/zk/ZookeeperDynamicConfigManagerTest.java b/config/config-zk/src/test/java/com/alipay/sofa/rpc/dynamic/zk/ZookeeperDynamicConfigManagerTest.java
new file mode 100644
index 000000000..9ccc3bf9f
--- /dev/null
+++ b/config/config-zk/src/test/java/com/alipay/sofa/rpc/dynamic/zk/ZookeeperDynamicConfigManagerTest.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.alipay.sofa.rpc.dynamic.zk;
+
+import com.alipay.sofa.rpc.dynamic.DynamicConfigManager;
+import com.alipay.sofa.rpc.dynamic.DynamicConfigManagerFactory;
+import com.alipay.sofa.rpc.dynamic.DynamicHelper;
+import com.alipay.sofa.rpc.log.Logger;
+import com.alipay.sofa.rpc.log.LoggerFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ZookeeperDynamicConfigManagerTest {
+
+ private final static Logger logger = LoggerFactory
+ .getLogger(ZookeeperDynamicConfigManager.class);
+
+ private DynamicConfigManager zookeeperDynamicConfigManager = DynamicConfigManagerFactory.getDynamicManager(
+ "test", "zookeeper");
+
+ @Test
+ public void getProviderServiceProperty() {
+ String result = zookeeperDynamicConfigManager.getProviderServiceProperty("serviceName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
+ }
+
+ @Test
+ public void getConsumerServiceProperty() {
+ String result = zookeeperDynamicConfigManager.getConsumerServiceProperty("serviceName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
+ }
+
+ @Test
+ public void getProviderMethodProperty() {
+ String result = zookeeperDynamicConfigManager.getProviderMethodProperty("serviceName", "methodName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
+ }
+
+ @Test
+ public void getConsumerMethodProperty() {
+ String result = zookeeperDynamicConfigManager.getConsumerMethodProperty("serviceName", "methodName", "timeout");
+ Assert.assertEquals(DynamicHelper.DEFAULT_DYNAMIC_VALUE, result);
+ }
+}
\ No newline at end of file
diff --git a/config/config-zk/src/test/resources/log4j.xml b/config/config-zk/src/test/resources/log4j.xml
new file mode 100644
index 000000000..e95634f16
--- /dev/null
+++ b/config/config-zk/src/test/resources/log4j.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/config/pom.xml b/config/pom.xml
index 7d0caacb8..2e380e67e 100644
--- a/config/pom.xml
+++ b/config/pom.xml
@@ -15,6 +15,8 @@
config-apollo
+ config-zk
+ config-nacos
diff --git a/core/common/src/main/java/com/alipay/sofa/rpc/common/config/RpcConfigKeys.java b/core/common/src/main/java/com/alipay/sofa/rpc/common/config/RpcConfigKeys.java
index 2b4934ce0..bc60ffca2 100644
--- a/core/common/src/main/java/com/alipay/sofa/rpc/common/config/RpcConfigKeys.java
+++ b/core/common/src/main/java/com/alipay/sofa/rpc/common/config/RpcConfigKeys.java
@@ -140,4 +140,21 @@ public class RpcConfigKeys {
false,
"specify biz thread pool implementation type",
new String[] { "sofa_rpc_server_thread_pool_type" });
+
+ // config center
+ public static ConfigKey ZK_ADDRESS = ConfigKey
+ .build(
+ "sofa.rpc.config.center.zookeeper.address",
+ "127.0.0.1:2181",
+ false,
+ "The address of Zookeeper configuration center.",
+ new String[] { "zookeeper_address" });
+
+ public static ConfigKey NACOS_ADDRESS = ConfigKey
+ .build(
+ "sofa.rpc.config.center.nacos.address",
+ "127.0.0.1:8848",
+ false,
+ "The address of Nacos configuration center.",
+ new String[] { "nacos_address" });
}