diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
index 6be548a..6a178d6 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
@@ -24,15 +24,17 @@
 import org.apache.dubbo.admin.registry.mapping.ServiceMapping;
 import org.apache.dubbo.admin.registry.mapping.impl.NoOpServiceMapping;
 import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
-import org.apache.dubbo.admin.registry.metadata.impl.NoOpMetadataCollector;
 import org.apache.dubbo.admin.service.impl.InstanceRegistryCache;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
 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.metadata.MappingListener;
+import org.apache.dubbo.metadata.report.MetadataReport;
+import org.apache.dubbo.metadata.report.MetadataReportInstance;
 import org.apache.dubbo.registry.Registry;
 import org.apache.dubbo.registry.RegistryFactory;
 import org.apache.dubbo.registry.RegistryService;
@@ -45,8 +47,8 @@
 import org.springframework.context.annotation.DependsOn;
 
 import java.util.Arrays;
+import java.util.Optional;
 
-import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
 import static org.apache.dubbo.common.constants.RegistryConstants.ENABLE_EMPTY_PROTECTION_KEY;
 import static org.apache.dubbo.registry.client.ServiceDiscoveryFactory.getExtension;
 
@@ -166,22 +168,19 @@
     @Bean("metaDataCollector")
     @DependsOn("governanceConfiguration")
     MetaDataCollector getMetadataCollector() {
-        MetaDataCollector metaDataCollector = new NoOpMetadataCollector();
-        if (metadataUrl == null) {
-            if (StringUtils.isNotEmpty(metadataAddress)) {
-                metadataUrl = formUrl(metadataAddress, metadataGroup, metadataGroupNameSpace, username, password);
-                metadataUrl = metadataUrl.addParameter(CLUSTER_KEY, cluster);
-            }
-            logger.info("Admin using metadata address: " + metadataUrl);
-        }
-        if (metadataUrl != null) {
-            metaDataCollector = ApplicationModel.defaultModel().getExtensionLoader(MetaDataCollector.class).getExtension(metadataUrl.getProtocol());
-            metaDataCollector.setUrl(metadataUrl);
-            metaDataCollector.init();
+        ApplicationModel applicationModel = ApplicationModel.defaultModel();
+        ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
+        MetadataReportInstance metadataReportInstance = beanFactory.registerBean(MetadataReportInstance.class);
+
+        Optional<MetadataReport> metadataReport = metadataReportInstance.getMetadataReports(true)
+                .values().stream().findAny();
+
+        if (metadataReport.isPresent()) {
+            return metadataReport.get()::getServiceDefinition;
         } else {
-            logger.warn("you are using dubbo.registry.address, which is not recommend, please refer to: https://github.com/apache/dubbo-admin/wiki/Dubbo-Admin-configuration");
+            //NoOpMetadataCollector
+            return key -> null;
         }
-        return metaDataCollector;
     }
 
 
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/MetaDataCollector.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/MetaDataCollector.java
index 3901789..3d398be 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/MetaDataCollector.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/MetaDataCollector.java
@@ -17,20 +17,9 @@
 
 package org.apache.dubbo.admin.registry.metadata;
 
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.extension.SPI;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
 
-@SPI("zookeeper")
 public interface MetaDataCollector {
-
-    void setUrl(URL url);
-
-    URL getUrl();
-
-    void init();
-
-    String getProviderMetaData(MetadataIdentifier key);
-
-    String getConsumerMetaData(MetadataIdentifier key);
+    
+    String getMetaData(MetadataIdentifier key);
 }
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ConsulMetaDataCollector.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ConsulMetaDataCollector.java
deleted file mode 100644
index 7a1cbd9..0000000
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ConsulMetaDataCollector.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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 org.apache.dubbo.admin.registry.metadata.impl;
-
-
-import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
-
-import com.ecwid.consul.v1.ConsulClient;
-import com.ecwid.consul.v1.Response;
-import com.ecwid.consul.v1.kv.model.GetValue;
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.logger.Logger;
-import org.apache.dubbo.common.logger.LoggerFactory;
-import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum;
-import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
-
-import java.util.Objects;
-
-
-public class ConsulMetaDataCollector implements MetaDataCollector {
-    private static final Logger LOG = LoggerFactory.getLogger(ConsulMetaDataCollector.class);
-    private static final int DEFAULT_PORT = 8500;
-    private URL url;
-    private ConsulClient client;
-
-    @Override
-    public URL getUrl() {
-        return this.url;
-    }
-
-    @Override
-    public void setUrl(URL url) {
-        this.url = url;
-    }
-
-    @Override
-    public void init() {
-        Objects.requireNonNull(this.url, "metadataUrl require not null");
-        String host = this.url.getHost();
-        int port = this.url.getPort() != 0 ? url.getPort() : DEFAULT_PORT;
-        this.client = new ConsulClient(host, port);
-    }
-
-    @Override
-    public String getProviderMetaData(MetadataIdentifier key) {
-        return doGetMetaData(key);
-    }
-
-    @Override
-    public String getConsumerMetaData(MetadataIdentifier key) {
-        return doGetMetaData(key);
-    }
-
-    private String doGetMetaData(MetadataIdentifier key) {
-        try {
-            Response<GetValue> response = this.client.getKVValue(key.getUniqueKey(KeyTypeEnum.UNIQUE_KEY));
-            return response.getValue().getDecodedValue();
-        } catch (Exception e) {
-            LOG.error(String.format("Failed to fetch metadata for %s from consul, cause: %s",
-                    key.getUniqueKey(KeyTypeEnum.UNIQUE_KEY), e.getMessage()), e);
-        }
-        return null;
-    }
-
-    //just for test
-    ConsulClient getClient() {
-        return this.client;
-    }
-}
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/NacosMetaDataCollector.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/NacosMetaDataCollector.java
deleted file mode 100644
index f03ca39..0000000
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/NacosMetaDataCollector.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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 org.apache.dubbo.admin.registry.metadata.impl;
-
-import com.alibaba.nacos.api.PropertyKeyConst;
-import java.util.Map;
-import org.apache.dubbo.admin.common.util.Constants;
-import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.logger.Logger;
-import org.apache.dubbo.common.logger.LoggerFactory;
-import org.apache.dubbo.common.utils.StringConstantFieldValuePredicate;
-import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum;
-import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
-
-import com.alibaba.nacos.api.NacosFactory;
-import com.alibaba.nacos.api.config.ConfigService;
-import com.alibaba.nacos.api.exception.NacosException;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Properties;
-
-import static com.alibaba.nacos.api.PropertyKeyConst.SERVER_ADDR;
-import static com.alibaba.nacos.api.PropertyKeyConst.NAMESPACE;
-
-public class NacosMetaDataCollector implements MetaDataCollector {
-    private static final Logger logger = LoggerFactory.getLogger(NacosMetaDataCollector.class);
-    private ConfigService configService;
-    private String group;
-    private URL url;
-    @Override
-    public void setUrl(URL url) {
-        this.url = url;
-    }
-
-    @Override
-    public URL getUrl() {
-        return url;
-    }
-
-    @Override
-    public void init() {
-        group = url.getParameter(Constants.GROUP_KEY, "DEFAULT_GROUP");
-        configService = buildConfigService(url);
-    }
-
-    private ConfigService buildConfigService(URL url) {
-        Properties nacosProperties = buildNacosProperties(url);
-        try {
-            configService = NacosFactory.createConfigService(nacosProperties);
-        } catch (NacosException e) {
-            if (logger.isErrorEnabled()) {
-                logger.error(e.getErrMsg(), e);
-            }
-            throw new IllegalStateException(e);
-        }
-        return configService;
-    }
-
-    private Properties buildNacosProperties(URL url) {
-        Properties properties = new Properties();
-        setServerAddr(url, properties);
-        setNamespace(url, properties);
-        Map<String, String> parameters = url.getParameters(
-                StringConstantFieldValuePredicate.of(PropertyKeyConst.class));
-        properties.putAll(parameters);
-        return properties;
-    }
-
-    private void setServerAddr(URL url, Properties properties) {
-
-        String serverAddr = url.getHost() + // Host
-                ":" +
-                url.getPort() // Port
-                ;
-        properties.put(SERVER_ADDR, serverAddr);
-    }
-
-    private void setNamespace(URL url, Properties properties) {
-        String namespace = url.getParameter(NAMESPACE);
-        if (StringUtils.isNotBlank(namespace)) {
-            properties.put(NAMESPACE, namespace);
-        }
-    }
-
-    @Override
-    public String getProviderMetaData(MetadataIdentifier key) {
-        return getMetaData(key);
-    }
-
-    @Override
-    public String getConsumerMetaData(MetadataIdentifier key) {
-        return getMetaData(key);
-    }
-
-    private String getMetaData(MetadataIdentifier identifier) {
-        try {
-            String fromDubboGroup = configService.getConfig(identifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY),
-                    "dubbo", 1000 * 10);
-            return org.apache.dubbo.common.utils.StringUtils.isNotEmpty(fromDubboGroup) ? fromDubboGroup :
-                    configService.getConfig(identifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY),
-                            group, 1000 * 10);
-        } catch (NacosException e) {
-            logger.warn("Failed to get " + identifier + " from nacos, cause: " + e.getMessage(), e);
-        }
-        return null;
-    }
-}
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/NoOpMetadataCollector.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/NoOpMetadataCollector.java
deleted file mode 100644
index c6d6ad8..0000000
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/NoOpMetadataCollector.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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 org.apache.dubbo.admin.registry.metadata.impl;
-
-import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
-
-public class NoOpMetadataCollector implements MetaDataCollector {
-
-    @Override
-    public void setUrl(URL url) {
-
-    }
-
-    @Override
-    public URL getUrl() {
-        return null;
-    }
-
-    @Override
-    public void init() {
-
-    }
-
-    @Override
-    public String getProviderMetaData(MetadataIdentifier key) {
-        return null;
-    }
-
-    @Override
-    public String getConsumerMetaData(MetadataIdentifier key) {
-        return null;
-    }
-}
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/RedisMetaDataCollector.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/RedisMetaDataCollector.java
deleted file mode 100644
index eef3419..0000000
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/RedisMetaDataCollector.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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 org.apache.dubbo.admin.registry.metadata.impl;
-
-
-import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
-import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum;
-import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
-import org.apache.dubbo.rpc.RpcException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import redis.clients.jedis.HostAndPort;
-import redis.clients.jedis.Jedis;
-import redis.clients.jedis.JedisCluster;
-import redis.clients.jedis.JedisPool;
-import redis.clients.jedis.JedisPoolConfig;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;
-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
-import static org.apache.dubbo.metadata.MetadataConstants.META_DATA_STORE_TAG;
-
-public class RedisMetaDataCollector implements MetaDataCollector {
-
-    private final static Logger logger = LoggerFactory.getLogger(RedisMetaDataCollector.class);
-    private final static String REDIS_DATABASE_KEY = "database";
-    private URL url;
-    private JedisPool pool;
-    Set<HostAndPort> jedisClusterNodes;
-    private int timeout;
-    private String password;
-
-    @Override
-    public void setUrl(URL url) {
-        this.url = url;
-    }
-
-    @Override
-    public URL getUrl() {
-        return url;
-    }
-
-    @Override
-    public void init() {
-        timeout = url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT);
-        password = url.getPassword();
-        if (url.getParameter(CLUSTER_KEY, false)) {
-            jedisClusterNodes = new HashSet<>();
-            String[] addresses = COMMA_SPLIT_PATTERN.split(url.getAddress());
-            for (String address : addresses) {
-                URL tmpUrl = url.setAddress(address);
-                jedisClusterNodes.add(new HostAndPort(tmpUrl.getHost(), tmpUrl.getPort()));
-            }
-        } else {
-            int database = url.getParameter(REDIS_DATABASE_KEY, 0);
-            pool = new JedisPool(new JedisPoolConfig(), url.getHost(), url.getPort(), timeout, url.getPassword(), database);
-        }
-    }
-
-    @Override
-    public String getProviderMetaData(MetadataIdentifier key) {
-        return doGetMetaData(key);
-    }
-
-    @Override
-    public String getConsumerMetaData(MetadataIdentifier key) {
-        return doGetMetaData(key);
-    }
-
-    private String doGetMetaData(MetadataIdentifier identifier) {
-        String result = null;
-        if (url.getParameter(CLUSTER_KEY, false)) {
-            try (JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig())) {
-                result = jedisCluster.get(identifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY) + META_DATA_STORE_TAG);
-            } catch (Throwable e) {
-                logger.error("Failed to get " + identifier + " from redis cluster, cause: " + e.getMessage(), e);
-                throw new RpcException("Failed to get " + identifier + " from redis cluster, cause: " + e.getMessage(), e);
-            }
-        } else {
-            try (Jedis jedis = pool.getResource()) {
-                result = jedis.get(identifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY));
-            } catch (Throwable e) {
-                logger.error("Failed to get " + identifier + " from redis, cause: " + e.getMessage(), e);
-                throw new RpcException("Failed to get " + identifier + " from redis, cause: " + e.getMessage(), e);
-            }
-        }
-        return result;
-    }
-}
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ZookeeperMetaDataCollector.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ZookeeperMetaDataCollector.java
deleted file mode 100644
index 9bba742..0000000
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ZookeeperMetaDataCollector.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * 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 org.apache.dubbo.admin.registry.metadata.impl;
-
-import org.apache.curator.framework.CuratorFramework;
-import org.apache.curator.framework.CuratorFrameworkFactory;
-import org.apache.curator.retry.ExponentialBackoffRetry;
-import org.apache.dubbo.admin.common.util.Constants;
-import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.logger.Logger;
-import org.apache.dubbo.common.logger.LoggerFactory;
-import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum;
-import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
-
-public class ZookeeperMetaDataCollector implements MetaDataCollector {
-
-    private static final Logger logger = LoggerFactory.getLogger(ZookeeperMetaDataCollector.class);
-    private CuratorFramework client;
-    private URL url;
-    private String root;
-    private final static String DEFAULT_ROOT = "dubbo";
-
-    @Override
-    public void setUrl(URL url) {
-        this.url = url;
-    }
-
-    @Override
-    public URL getUrl() {
-        return url;
-    }
-
-    @Override
-    public void init() {
-        String group = url.getParameter(Constants.GROUP_KEY, DEFAULT_ROOT);
-        if (!group.startsWith(Constants.PATH_SEPARATOR)) {
-            group = Constants.PATH_SEPARATOR + group;
-        }
-        root = group;
-        CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.
-                builder()
-                .connectString(url.getAddress())
-                .retryPolicy(new ExponentialBackoffRetry(1000, 3));
-        String userInformation = url.getUserInformation();
-        if (userInformation != null && userInformation.length() > 0) {
-            builder = builder.authorization("digest", userInformation.getBytes());
-        }
-        client = builder.build();
-        client.start();
-    }
-
-
-    @Override
-    public String getProviderMetaData(MetadataIdentifier key) {
-        return doGetMetadata(key);
-    }
-
-    @Override
-    public String getConsumerMetaData(MetadataIdentifier key) {
-        return doGetMetadata(key);
-    }
-
-    private String getNodePath(MetadataIdentifier metadataIdentifier) {
-        return toRootDir() + metadataIdentifier.getUniqueKey(KeyTypeEnum.PATH);
-    }
-
-    private String toRootDir() {
-        if (root.equals(Constants.PATH_SEPARATOR)) {
-            return root;
-        }
-        return root + Constants.PATH_SEPARATOR;
-    }
-
-    private String doGetMetadata(MetadataIdentifier identifier) {
-        //TODO error handing
-        try {
-            String path = getNodePath(identifier);
-            if (client.checkExists().forPath(path) == null) {
-                return null;
-            }
-            return new String(client.getData().forPath(path));
-        } catch (Exception e) {
-            logger.error(e.getMessage(), e);
-        }
-        return null;
-    }
-}
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/ConsumerServiceImpl.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/ConsumerServiceImpl.java
index 8395026..829330d 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/ConsumerServiceImpl.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/ConsumerServiceImpl.java
@@ -55,7 +55,7 @@
 
     @Override
     public String getConsumerMetadata(MetadataIdentifier consumerIdentifier) {
-        return metaDataCollector.getConsumerMetaData(consumerIdentifier);
+        return metaDataCollector.getMetaData(consumerIdentifier);
     }
 
     private Map<String, URL> findAllConsumerUrl() {
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/ProviderServiceImpl.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/ProviderServiceImpl.java
index 5e09ed7..81d9970 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/ProviderServiceImpl.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/ProviderServiceImpl.java
@@ -59,7 +59,7 @@
 
     @Override
     public String getProviderMetaData(MetadataIdentifier providerIdentifier) {
-        return metaDataCollector.getProviderMetaData(providerIdentifier);
+        return metaDataCollector.getMetaData(providerIdentifier);
     }
 
     @Override
diff --git a/dubbo-admin-server/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.admin.registry.metadata.MetaDataCollector b/dubbo-admin-server/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.admin.registry.metadata.MetaDataCollector
deleted file mode 100644
index fc4c855..0000000
--- a/dubbo-admin-server/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.admin.registry.metadata.MetaDataCollector
+++ /dev/null
@@ -1,4 +0,0 @@
-zookeeper=org.apache.dubbo.admin.registry.metadata.impl.ZookeeperMetaDataCollector
-redis=org.apache.dubbo.admin.registry.metadata.impl.RedisMetaDataCollector
-consul=org.apache.dubbo.admin.registry.metadata.impl.ConsulMetaDataCollector
-nacos=org.apache.dubbo.admin.registry.metadata.impl.NacosMetaDataCollector
\ No newline at end of file
diff --git a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/config/ConfigCenterTest.java b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/config/ConfigCenterTest.java
index 87271c1..53ec12a 100644
--- a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/config/ConfigCenterTest.java
+++ b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/config/ConfigCenterTest.java
@@ -148,10 +148,5 @@
         ReflectionTestUtils.setField(configCenter, "metadataAddress", zkAddress + "?group=" + "dubbo");
         ReflectionTestUtils.setField(configCenter, "username", "username");
         ReflectionTestUtils.setField(configCenter, "password", "password");
-
-        configCenter.getMetadataCollector();
-        Object metadataUrl = ReflectionTestUtils.getField(configCenter, "metadataUrl");
-        assertNotNull(metadataUrl);
-        assertEquals("127.0.0.1", ((URL) metadataUrl).getHost());
     }
 }
diff --git a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/registry/metadata/impl/ConsulMetaDataCollectorTest.java b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/registry/metadata/impl/ConsulMetaDataCollectorTest.java
deleted file mode 100644
index 149539c..0000000
--- a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/registry/metadata/impl/ConsulMetaDataCollectorTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * 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 org.apache.dubbo.admin.registry.metadata.impl;
-
-
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-import com.pszymczyk.consul.ConsulProcess;
-import com.pszymczyk.consul.ConsulStarterBuilder;
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;
-import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
-import org.apache.dubbo.metadata.definition.model.MethodDefinition;
-import org.apache.dubbo.metadata.definition.util.ClassUtils;
-import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum;
-import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;
-import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;
-
-public class ConsulMetaDataCollectorTest {
-
-    private final Gson gson = new Gson();
-    private ConsulProcess consul;
-    private ConsulMetaDataCollector consulMetaDataCollector;
-
-    @Before
-    public void setUp() {
-        consul = ConsulStarterBuilder.consulStarter().build().start();
-        consulMetaDataCollector = new ConsulMetaDataCollector();
-        consulMetaDataCollector.setUrl(URL.valueOf("consul://127.0.0.1:" + consul.getHttpPort()));
-        consulMetaDataCollector.init();
-    }
-
-    @After
-    public void tearDown() {
-        consul.close();
-        consulMetaDataCollector = null;
-    }
-
-    @Test
-    public void testGetProviderMetaData() {
-        MetadataIdentifier identifier = buildIdentifier(true);
-
-        Map<String, String> params = new HashMap<>();
-        params.put("key1", "value1");
-        params.put("key2", "true");
-
-        FullServiceDefinition definition = ServiceDefinitionBuilder.buildFullDefinition(ServiceA.class, params);
-
-        String metadata = gson.toJson(definition);
-        consulMetaDataCollector.getClient().setKVValue(identifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY), metadata);
-
-        String providerMetaData = consulMetaDataCollector.getProviderMetaData(identifier);
-        Assert.assertEquals(metadata, providerMetaData);
-
-        FullServiceDefinition retDef = gson.fromJson(providerMetaData, FullServiceDefinition.class);
-        Assert.assertEquals(ServiceA.class.getCanonicalName(), retDef.getCanonicalName());
-        Assert.assertEquals(ClassUtils.getCodeSource(ServiceA.class), retDef.getCodeSource());
-        Assert.assertEquals(params, retDef.getParameters());
-
-        //method def assertions
-        Assert.assertNotNull(retDef.getMethods());
-        Assert.assertEquals(3, retDef.getMethods().size());
-        List<String> methodNames = retDef.getMethods().stream().map(MethodDefinition::getName).sorted().collect(Collectors.toList());
-        Assert.assertEquals("method1", methodNames.get(0));
-        Assert.assertEquals("method2", methodNames.get(1));
-        Assert.assertEquals("method3", methodNames.get(2));
-    }
-
-
-    @Test
-    public void testGetConsumerMetaData() {
-        MetadataIdentifier identifier = buildIdentifier(false);
-
-        Map<String, String> consumerParams = new HashMap<>();
-        consumerParams.put("k1", "v1");
-        consumerParams.put("k2", "1");
-        consumerParams.put("k3", "true");
-        String metadata = gson.toJson(consumerParams);
-        consulMetaDataCollector.getClient().setKVValue(identifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY), metadata);
-
-        String consumerMetaData = consulMetaDataCollector.getConsumerMetaData(identifier);
-        Map<String, String> retParams = gson.fromJson(consumerMetaData, new TypeToken<Map<String, String>>() {
-        }.getType());
-        Assert.assertEquals(consumerParams, retParams);
-    }
-
-
-    private MetadataIdentifier buildIdentifier(boolean isProducer) {
-        MetadataIdentifier identifier = new MetadataIdentifier();
-        identifier.setApplication(String.format("metadata-%s-test", isProducer ? "provider" : "consumer"));
-        identifier.setGroup("group");
-        identifier.setServiceInterface(ServiceA.class.getName());
-        identifier.setSide(isProducer ? PROVIDER_SIDE : CONSUMER_SIDE);
-        identifier.setVersion("1.0.0");
-        return identifier;
-    }
-
-
-    interface ServiceA {
-        void method1();
-
-        void method2() throws IOException;
-
-        String method3();
-    }
-
-}
