dynamic config impl
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java
index bbb0188..ef5ad30 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java
@@ -1,13 +1,18 @@
 package org.apache.dubbo.admin.data.config;
 
-import org.apache.dubbo.configcenter.DynamicConfiguration;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.SPI;
 
 
-public interface GovernanceConfiguration extends DynamicConfiguration {
+@SPI("zookeeper")
+public interface GovernanceConfiguration {
+    void init();
+
+    void setUrl(URL url);
+
+    URL getUrl();
     String setConfig(String key, String value);
 
-    String setConfig(String key, String group, String value);
-
-    String setConfig(String key, String group, int timeout, String value);
+    String getConfig(String key);
 
 }
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ApolloConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ApolloConfiguration.java
new file mode 100644
index 0000000..0e4d1a3
--- /dev/null
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ApolloConfiguration.java
@@ -0,0 +1,40 @@
+package org.apache.dubbo.admin.data.config.impl;
+
+import com.ctrip.framework.apollo.openapi.client.ApolloOpenApiClient;
+import org.apache.dubbo.admin.data.config.GovernanceConfiguration;
+import org.apache.dubbo.common.URL;
+import org.springframework.beans.factory.annotation.Value;
+
+public class ApolloConfiguration implements GovernanceConfiguration {
+
+    @Value("${dubbo.apollo.token}")
+    private String token;
+    private URL url;
+    private ApolloOpenApiClient client;
+
+
+    @Override
+    public void setUrl(URL url) {
+       this.url = url;
+    }
+
+    @Override
+    public URL getUrl() {
+        return url;
+    }
+
+    @Override
+    public void init() {
+        client = ApolloOpenApiClient.newBuilder().withPortalUrl(url.getAddress()).withToken(token).build();
+    }
+
+    @Override
+    public String setConfig(String key, String value) {
+        return null;
+    }
+
+    @Override
+    public String getConfig(String key) {
+        return null;
+    }
+}
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java
new file mode 100644
index 0000000..5fca72b
--- /dev/null
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java
@@ -0,0 +1,56 @@
+package org.apache.dubbo.admin.data.config.impl;
+
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.retry.ExponentialBackoffRetry;
+import org.apache.dubbo.admin.data.config.GovernanceConfiguration;
+import org.apache.dubbo.common.URL;
+
+public class ZookeeperConfiguration implements GovernanceConfiguration {
+    private CuratorFramework zkClient;
+    private URL url;
+
+    @Override
+    public void setUrl(URL url) {
+       this.url = url;
+    }
+
+    @Override
+    public URL getUrl() {
+        return url;
+    }
+
+    @Override
+    public void init() {
+        zkClient = CuratorFrameworkFactory.newClient(url.getAddress(), new ExponentialBackoffRetry(1000, 3));
+        zkClient.start();
+    }
+
+    @Override
+    public String setConfig(String key, String value) {
+        try {
+            if (zkClient.checkExists().forPath(key) == null) {
+                zkClient.create().creatingParentsIfNeeded().forPath(key);
+            }
+            zkClient.setData().forPath(key, value.getBytes());
+            return value;
+        } catch (Exception e) {
+
+        }
+        return null;
+    }
+
+    @Override
+    public String getConfig(String key) {
+
+        try {
+            if (zkClient.checkExists().forPath(key) == null) {
+                return null;
+            }
+            return new String(zkClient.getData().forPath(key));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
diff --git a/dubbo-admin-backend/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.admin.data.config.GovernanceConfiguration b/dubbo-admin-backend/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.admin.data.config.GovernanceConfiguration
new file mode 100644
index 0000000..12783c4
--- /dev/null
+++ b/dubbo-admin-backend/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.admin.data.config.GovernanceConfiguration
@@ -0,0 +1,2 @@
+zookeeper=org.apache.dubbo.admin.data.config.impl.ZookeeperConfiguration
+apollo=org.apache.dubbo.admin.data.config.impl.ZookeeperConfiguration
diff --git a/dubbo-admin-backend/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.admin.data.metadata.MetaDataCollector b/dubbo-admin-backend/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.admin.data.metadata.MetaDataCollector
new file mode 100644
index 0000000..0009f5d
--- /dev/null
+++ b/dubbo-admin-backend/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.admin.data.metadata.MetaDataCollector
@@ -0,0 +1,2 @@
+zookeeper=org.apache.dubbo.admin.data.metadata.impl.ZookeeperMetaDataCollector
+redis=org.apache.dubbo.admin.data.metadata.impl.RedisMetaDataCollector
\ No newline at end of file