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 2021/11/23 03:12:19 UTC

[dubbo] 04/05: refactor

This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch 3.0-metadata-refactor
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit 71cb0e2ee32ae3010db33e0c88f92958db7c5e1e
Author: ken.lj <ke...@gmail.com>
AuthorDate: Fri Nov 19 11:34:13 2021 +0800

    refactor
---
 .../config/deploy/DefaultApplicationDeployer.java  |  26 ++---
 .../ConfigurableMetadataServiceExporter.java       | 117 +++++++--------------
 .../metadata}/MetadataServiceDelegation.java       |  30 +++---
 ...MetadataServiceURLParamsMetadataCustomizer.java |  24 +++--
 ...g.apache.dubbo.metadata.MetadataServiceExporter |   2 -
 ...dubbo.registry.client.ServiceInstanceCustomizer |   3 +-
 .../dubbo/config/bootstrap/DubboBootstrapTest.java |   4 +-
 ...dataServiceURLParamsMetadataCustomizerTest.java |   7 +-
 ...terServiceDiscoveryRegistryIntegrationTest.java |  10 +-
 ...ceDiscoveryRegistryRegistryServiceListener.java |   2 +-
 .../ServiceDiscoveryRegistryInfoWrapper.java       |   3 +-
 ...RegistryCenterDubboProtocolIntegrationTest.java |   2 +-
 .../metadata/MetadataServiceExporterTest.java      |  41 ++++----
 dubbo-distribution/dubbo-all/pom.xml               |   6 --
 dubbo-distribution/dubbo-core-spi/pom.xml          |   6 --
 .../org/apache/dubbo/metadata/MetadataService.java |   2 +
 .../dubbo/metadata/MetadataServiceExporter.java    | 101 ------------------
 .../apache/dubbo/metadata/MetadataServiceType.java |  72 -------------
 .../metadata/report/MetadataReportInstance.java    |  24 ++++-
 .../metadata/report/support/NopMetadataReport.java |  78 ++++++++++++++
 .../dubbo/metadata/MetadataServiceTypeTest.java    |  48 ---------
 .../report/MetadataReportInstanceTest.java         |   3 +-
 .../registry/RegistryScopeModelInitializer.java    |   2 -
 .../registry/client/AbstractServiceDiscovery.java  |  13 ++-
 ...dubbo.registry.client.ServiceInstanceCustomizer |   1 -
 .../ProtocolPortsMetadataCustomizerTest.java       |   5 +-
 .../ServiceInstanceMetadataCustomizerTest.java     |   7 +-
 27 files changed, 240 insertions(+), 399 deletions(-)

diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
index a8a586f..c830975 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
@@ -42,10 +42,11 @@ import org.apache.dubbo.config.DubboShutdownHook;
 import org.apache.dubbo.config.MetadataReportConfig;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.context.ConfigManager;
+import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;
+import org.apache.dubbo.config.metadata.MetadataServiceDelegation;
 import org.apache.dubbo.config.utils.CompositeReferenceCache;
 import org.apache.dubbo.config.utils.ConfigValidationUtils;
 import org.apache.dubbo.metadata.MetadataService;
-import org.apache.dubbo.metadata.MetadataServiceExporter;
 import org.apache.dubbo.metadata.report.MetadataReportFactory;
 import org.apache.dubbo.metadata.report.MetadataReportInstance;
 import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;
@@ -97,20 +98,18 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
 
     private final ExecutorRepository executorRepository;
 
-    private AtomicBoolean hasPreparedApplicationInstance = new AtomicBoolean(false);
-    private AtomicBoolean hasPreparedInternalModule = new AtomicBoolean(false);
+    private final AtomicBoolean hasPreparedApplicationInstance = new AtomicBoolean(false);
+    private final AtomicBoolean hasPreparedInternalModule = new AtomicBoolean(false);
 
-    private volatile MetadataService metadataService;
-
-    private volatile MetadataServiceExporter metadataServiceExporter;
+    private volatile ConfigurableMetadataServiceExporter metadataServiceExporter;
 
     private ScheduledFuture<?> asyncMetadataFuture;
-    private volatile CompletableFuture startFuture;
-    private DubboShutdownHook dubboShutdownHook;
-    private Object stateLock = new Object();
-    private Object startLock = new Object();
-    private Object destroyLock = new Object();
-    private Object internalModuleLock = new Object();
+    private volatile CompletableFuture<Boolean> startFuture;
+    private final DubboShutdownHook dubboShutdownHook;
+    private final Object stateLock = new Object();
+    private final Object startLock = new Object();
+    private final Object destroyLock = new Object();
+    private final Object internalModuleLock = new Object();
 
     public DefaultApplicationDeployer(ApplicationModel applicationModel) {
         super(applicationModel);
@@ -499,7 +498,8 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
      * Initialize {@link MetadataService}
      */
     private void initMetadataService() {
-        this.metadataServiceExporter = getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
+        MetadataServiceDelegation metadataService = applicationModel.getBeanFactory().getOrRegisterBean(MetadataServiceDelegation.class);
+        this.metadataServiceExporter = new ConfigurableMetadataServiceExporter(applicationModel, metadataService);
     }
 
     /**
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java
index a9510b6..e0e8642 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java
@@ -25,13 +25,10 @@ import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.ServiceConfig;
-import org.apache.dubbo.config.context.ConfigManager;
 import org.apache.dubbo.metadata.MetadataService;
-import org.apache.dubbo.metadata.MetadataServiceExporter;
 import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.ProtocolServer;
 import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.rpc.model.ScopeModelAware;
 
 import java.util.Iterator;
 import java.util.List;
@@ -43,70 +40,32 @@ import static org.apache.dubbo.common.constants.CommonConstants.METADATA_SERVICE
 import static org.apache.dubbo.common.constants.CommonConstants.METADATA_SERVICE_PROTOCOL_KEY;
 
 /**
- * {@link MetadataServiceExporter} implementation based on {@link ConfigManager Dubbo configurations}, the clients
- * should make sure the {@link ApplicationConfig}, {@link RegistryConfig} and {@link ProtocolConfig} are ready before
- * {@link #export()}.
- * <p>
- * Typically, do not worry about their ready status, because they are initialized before
- * any {@link ServiceConfig} exports, or The Dubbo export will be failed.
- * <p>
- * Being aware of it's not a thread-safe implementation.
- *
- * @see MetadataServiceExporter
- * @see ServiceConfig
- * @see ConfigManager
- * @since 2.7.5
+ * Export metadata service
  */
-public class ConfigurableMetadataServiceExporter implements MetadataServiceExporter, ScopeModelAware {
+public class ConfigurableMetadataServiceExporter {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
-    private MetadataService metadataService;
-
-    private volatile ServiceConfig<MetadataService> serviceConfig;
-    private ApplicationModel applicationModel;
+    private MetadataServiceDelegation metadataService;
 
-    public ConfigurableMetadataServiceExporter() {
-    }
+    private final ServiceConfig<MetadataService> serviceConfig;
+    private final ApplicationModel applicationModel;
 
-    @Override
-    public void setApplicationModel(ApplicationModel applicationModel) {
+    public ConfigurableMetadataServiceExporter(ApplicationModel applicationModel, MetadataServiceDelegation metadataService) {
         this.applicationModel = applicationModel;
-    }
-
-    public void setMetadataService(MetadataService metadataService) {
         this.metadataService = metadataService;
+        this.serviceConfig = buildServiceConfig();
     }
 
-    @Override
     public ConfigurableMetadataServiceExporter export() {
 
         if (!isExported()) {
-
-            ApplicationConfig applicationConfig = getApplicationConfig();
-            ServiceConfig<MetadataService> serviceConfig = new ServiceConfig<>();
-            serviceConfig.setScopeModel(applicationModel.getInternalModule());
-            serviceConfig.setApplication(applicationConfig);
-            serviceConfig.setRegistry(new RegistryConfig("N/A"));
-            serviceConfig.setProtocol(generateMetadataProtocol());
-            serviceConfig.setInterface(MetadataService.class);
-            serviceConfig.setDelay(0);
-            serviceConfig.setRef(metadataService);
-            serviceConfig.setGroup(applicationConfig.getName());
-            serviceConfig.setVersion(metadataService.version());
-//            serviceConfig.setMethods(generateMethodConfig());
-            serviceConfig.setConnections(1);
-            serviceConfig.setExecutes(100);
-
             // export
             serviceConfig.export();
-
+            metadataService.setMetadataURL(serviceConfig.getExportedUrls().get(0));
             if (logger.isInfoEnabled()) {
                 logger.info("The MetadataService exports urls : " + serviceConfig.getExportedUrls());
             }
-
-            this.serviceConfig = serviceConfig;
-
         } else {
             if (logger.isWarnEnabled()) {
                 logger.warn("The MetadataService has been exported : " + serviceConfig.getExportedUrls());
@@ -116,41 +75,14 @@ public class ConfigurableMetadataServiceExporter implements MetadataServiceExpor
         return this;
     }
 
-//    /**
-//     * Generate Method Config for Service Discovery Metadata <p/>
-//     * <p>
-//     * Make {@link MetadataService} support argument callback,
-//     * used to notify {@link org.apache.dubbo.registry.client.ServiceInstance}'s
-//     * metadata change event
-//     *
-//     * @since 3.0
-//     */
-//    private List<MethodConfig> generateMethodConfig() {
-//        MethodConfig methodConfig = new MethodConfig();
-//        methodConfig.setName("getAndListenInstanceMetadata");
-//
-//        ArgumentConfig argumentConfig = new ArgumentConfig();
-//        argumentConfig.setIndex(1);
-//        argumentConfig.setCallback(true);
-//
-//        methodConfig.setArguments(Collections.singletonList(argumentConfig));
-//
-//        return Collections.singletonList(methodConfig);
-//    }
-
-    @Override
     public ConfigurableMetadataServiceExporter unexport() {
         if (isExported()) {
             serviceConfig.unexport();
+            metadataService.setMetadataURL(null);
         }
         return this;
     }
 
-    @Override
-    public List<URL> getExportedURLs() {
-        return serviceConfig != null ? serviceConfig.getExportedUrls() : emptyList();
-    }
-
     public boolean isExported() {
         return serviceConfig != null && serviceConfig.isExported() && !serviceConfig.isUnexported();
     }
@@ -225,4 +157,35 @@ public class ConfigurableMetadataServiceExporter implements MetadataServiceExpor
 
         return StringUtils.isNotEmpty(protocol) ? protocol : DUBBO_PROTOCOL;
     }
+
+
+    private ServiceConfig<MetadataService> buildServiceConfig() {
+        ApplicationConfig applicationConfig = getApplicationConfig();
+        ServiceConfig<MetadataService> serviceConfig = new ServiceConfig<>();
+        serviceConfig.setScopeModel(applicationModel.getInternalModule());
+        serviceConfig.setApplication(applicationConfig);
+        serviceConfig.setRegistry(new RegistryConfig("N/A"));
+        serviceConfig.setProtocol(generateMetadataProtocol());
+        serviceConfig.setInterface(MetadataService.class);
+        serviceConfig.setDelay(0);
+        serviceConfig.setRef(metadataService);
+        serviceConfig.setGroup(applicationConfig.getName());
+        serviceConfig.setVersion(MetadataService.VERSION);
+//            serviceConfig.setMethods(generateMethodConfig());
+        serviceConfig.setConnections(1);
+        serviceConfig.setExecutes(100);
+
+        return serviceConfig;
+    }
+
+    // for unit test
+    public void setMetadataService(MetadataServiceDelegation metadataService) {
+        this.metadataService = metadataService;
+    }
+
+    // for unit test
+    public List<URL> getExportedURLs() {
+        return serviceConfig != null ? serviceConfig.getExportedUrls() : emptyList();
+    }
+
 }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/MetadataServiceDelegation.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceDelegation.java
similarity index 92%
rename from dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/MetadataServiceDelegation.java
rename to dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceDelegation.java
index 191a60f..6b36532 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/MetadataServiceDelegation.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceDelegation.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.registry.client.metadata.store;
+package org.apache.dubbo.config.metadata;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
@@ -26,7 +26,6 @@ import org.apache.dubbo.metadata.MetadataService;
 import org.apache.dubbo.registry.client.ServiceDiscovery;
 import org.apache.dubbo.registry.support.RegistryManager;
 import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.rpc.model.ScopeModelAware;
 
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -49,13 +48,17 @@ import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;
 /**
  * Implementation providing remote RPC service to facilitate the query of metadata information.
  */
-public class MetadataServiceDelegation implements MetadataService, ScopeModelAware, Disposable {
+public class MetadataServiceDelegation implements MetadataService, Disposable {
     Logger logger = LoggerFactory.getLogger(getClass());
-    private ApplicationModel applicationModel;
-    private RegistryManager registryManager;
-    private ConcurrentNavigableMap<String, String> serviceDefinitions = new ConcurrentSkipListMap<>();
+    private final ApplicationModel applicationModel;
+    private final RegistryManager registryManager;
+    private final ConcurrentNavigableMap<String, String> serviceDefinitions = new ConcurrentSkipListMap<>();
+    private URL url;
 
-    public MetadataServiceDelegation() {}
+    public MetadataServiceDelegation(ApplicationModel applicationModel) {
+        this.applicationModel = applicationModel;
+        registryManager = RegistryManager.getInstance(applicationModel);
+    }
 
     /**
      * Gets the current Dubbo Service name
@@ -68,9 +71,12 @@ public class MetadataServiceDelegation implements MetadataService, ScopeModelAwa
     }
 
     @Override
-    public void setApplicationModel(ApplicationModel applicationModel) {
-        this.applicationModel = applicationModel;
-        registryManager = RegistryManager.getInstance(applicationModel);
+    public URL getMetadataURL() {
+        return url;
+    }
+
+    public void setMetadataURL(URL url) {
+        this.url = url;
     }
 
     @Override
@@ -79,7 +85,7 @@ public class MetadataServiceDelegation implements MetadataService, ScopeModelAwa
     }
 
     private SortedSet<String> getAllUnmodifiableServiceURLs() {
-        SortedSet<URL> bizURLs = new TreeSet<>(MetadataServiceDelegation.URLComparator.INSTANCE);
+        SortedSet<URL> bizURLs = new TreeSet<>(URLComparator.INSTANCE);
         List<ServiceDiscovery> serviceDiscoveries = registryManager.getServiceDiscoveries();
         for (ServiceDiscovery sd : serviceDiscoveries) {
             MetadataInfo metadataInfo = sd.getMetadata();
@@ -99,7 +105,7 @@ public class MetadataServiceDelegation implements MetadataService, ScopeModelAwa
     }
 
     private SortedSet<String> getAllUnmodifiableSubscribedURLs() {
-        SortedSet<URL> bizURLs = new TreeSet<>(MetadataServiceDelegation.URLComparator.INSTANCE);
+        SortedSet<URL> bizURLs = new TreeSet<>(URLComparator.INSTANCE);
         List<ServiceDiscovery> serviceDiscoveries = registryManager.getServiceDiscoveries();
         for (ServiceDiscovery sd : serviceDiscoveries) {
             MetadataInfo metadataInfo = sd.getMetadata();
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceURLParamsMetadataCustomizer.java
similarity index 67%
rename from dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java
rename to dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceURLParamsMetadataCustomizer.java
index 1576d21..f8f016d 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceURLParamsMetadataCustomizer.java
@@ -14,13 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.registry.client.metadata;
+package org.apache.dubbo.config.metadata;
 
+import org.apache.dubbo.common.BaseServiceMetadata;
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.metadata.MetadataServiceExporter;
+import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.metadata.MetadataService;
 import org.apache.dubbo.registry.client.ServiceInstance;
 import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;
+import org.apache.dubbo.registry.client.metadata.SpringCloudMetadataServiceURLBuilder;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.ModuleServiceRepository;
+import org.apache.dubbo.rpc.model.ProviderModel;
 
 import java.util.List;
 import java.util.Map;
@@ -52,11 +57,16 @@ public class MetadataServiceURLParamsMetadataCustomizer implements ServiceInstan
     }
 
     private String resolveMetadataPropertyValue(ApplicationModel applicationModel) {
-        MetadataServiceExporter metadataServiceExporter = applicationModel.getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
-        if (metadataServiceExporter.isExported()) {
-            List<URL> metadataURLs = metadataServiceExporter.getExportedURLs();
-            return getMetadataServiceParameter(metadataURLs.get(0));
+        ModuleServiceRepository serviceRepository = applicationModel.getInternalModule().getServiceRepository();
+        String key = BaseServiceMetadata.buildServiceKey(MetadataService.class.getName(), applicationModel.getApplicationName(), MetadataService.VERSION);
+        ProviderModel providerModel = serviceRepository.lookupExportedService(key);
+        String metadataValue = "";
+        if (providerModel != null) {
+            List<URL> metadataURLs = providerModel.getServiceConfig().getExportedUrls();
+            if (CollectionUtils.isNotEmpty(metadataURLs)) {
+                metadataValue = getMetadataServiceParameter(metadataURLs.get(0));
+            }
         }
-        return "";
+        return metadataValue;
     }
 }
diff --git a/dubbo-config/dubbo-config-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter b/dubbo-config/dubbo-config-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter
deleted file mode 100644
index 2bda3f2..0000000
--- a/dubbo-config/dubbo-config-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter
+++ /dev/null
@@ -1,2 +0,0 @@
-# since 2.7.8
-local = org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter
diff --git a/dubbo-config/dubbo-config-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer b/dubbo-config/dubbo-config-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
index 656f868..ba0847a 100644
--- a/dubbo-config/dubbo-config-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
+++ b/dubbo-config/dubbo-config-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
@@ -1 +1,2 @@
-port=org.apache.dubbo.config.metadata.ServiceInstanceHostPortCustomizer
\ No newline at end of file
+port=org.apache.dubbo.config.metadata.ServiceInstanceHostPortCustomizer
+metadata-url=org.apache.dubbo.config.metadata.MetadataServiceURLParamsMetadataCustomizer
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapTest.java
index 6f480c2..0732f40 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapTest.java
@@ -31,10 +31,10 @@ import org.apache.dubbo.config.ServiceConfig;
 import org.apache.dubbo.config.SysProps;
 import org.apache.dubbo.config.api.DemoService;
 import org.apache.dubbo.config.deploy.DefaultApplicationDeployer;
+import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;
 import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
 import org.apache.dubbo.config.utils.ConfigValidationUtils;
 import org.apache.dubbo.metadata.MetadataService;
-import org.apache.dubbo.metadata.MetadataServiceExporter;
 import org.apache.dubbo.monitor.MonitorService;
 import org.apache.dubbo.registry.RegistryService;
 import org.apache.dubbo.rpc.Exporter;
@@ -335,7 +335,7 @@ public class DubboBootstrapTest {
 
     private void assertMetadataService(DubboBootstrap bootstrap, int availablePort, boolean shouldReport) {
         DefaultApplicationDeployer applicationDeployer = getApplicationDeployer(bootstrap.getApplicationModel());
-        MetadataServiceExporter metadataServiceExporter = ReflectUtils.getFieldValue(applicationDeployer, "metadataServiceExporter");
+        ConfigurableMetadataServiceExporter metadataServiceExporter = ReflectUtils.getFieldValue(applicationDeployer, "metadataServiceExporter");
         Assertions.assertTrue(metadataServiceExporter.isExported());
         DubboProtocol protocol = DubboProtocol.getDubboProtocol(bootstrap.getApplicationModel());
         Map<String, Exporter<?>> exporters = protocol.getExporterMap();
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizerTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/MetadataServiceURLParamsMetadataCustomizerTest.java
similarity index 93%
rename from dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizerTest.java
rename to dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/MetadataServiceURLParamsMetadataCustomizerTest.java
index f7aace9..29a1092 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizerTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/MetadataServiceURLParamsMetadataCustomizerTest.java
@@ -14,12 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.registry.client.metadata;
+package org.apache.dubbo.config.metadata;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.metadata.MetadataService;
 import org.apache.dubbo.registry.client.DefaultServiceInstance;
-import org.apache.dubbo.registry.client.metadata.store.MetadataServiceDelegation;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import com.google.gson.Gson;
@@ -46,7 +45,7 @@ public class MetadataServiceURLParamsMetadataCustomizerTest {
     private static final Gson gson = new Gson();
 
     public DefaultServiceInstance instance;
-    private MetadataServiceDelegation metadataService;
+    private MetadataService metadataService;
     private URL metadataServiceURL = URL.valueOf("metadata://127.0.0.1:21881/" + MetadataService.class.getName() +
         "?application=demo&group=g1&version=1.0.0&timestamp=1632662388960");
 
@@ -58,7 +57,7 @@ public class MetadataServiceURLParamsMetadataCustomizerTest {
     @BeforeEach
     public void init() {
         instance = createInstance();
-        metadataService = mock(MetadataServiceDelegation.class);
+        metadataService = mock(MetadataService.class);
     }
 
     @AfterEach
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest.java
index 8d2159f..6f6a5ab 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest.java
@@ -24,9 +24,9 @@ import org.apache.dubbo.config.ReferenceConfig;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.ServiceConfig;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.config.metadata.MetadataServiceDelegation;
 import org.apache.dubbo.integration.IntegrationTest;
 import org.apache.dubbo.registry.RegistryServiceListener;
-import org.apache.dubbo.registry.client.metadata.store.MetadataServiceDelegation;
 import org.apache.dubbo.registrycenter.RegistryCenter;
 import org.apache.dubbo.registrycenter.ZookeeperMultipleRegistryCenter;
 
@@ -179,15 +179,15 @@ public class MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest imple
             Assertions.assertTrue(serviceDiscoveryRegistryInfoWrapper.isRegistered());
             // check if it's subscribed
             Assertions.assertFalse(serviceDiscoveryRegistryInfoWrapper.isSubscribed());
-            MetadataServiceDelegation inMemoryWritableMetadataService = serviceDiscoveryRegistryInfoWrapper.getInMemoryWritableMetadataService();
+            MetadataServiceDelegation metadataService = serviceDiscoveryRegistryInfoWrapper.getInMemoryWritableMetadataService();
             // check if the count of exported urls is right or not
-            Assertions.assertEquals(inMemoryWritableMetadataService.getExportedURLs().size(), 1);
+            Assertions.assertEquals(metadataService.getExportedURLs().size(), 1);
             // check the exported url is right or not.
-            Assertions.assertTrue(inMemoryWritableMetadataService.getExportedURLs()
+            Assertions.assertTrue(metadataService.getExportedURLs()
                 .first()
                 .contains(MultipleRegistryCenterServiceDiscoveryRegistryService.class.getName()));
             // check the count of metadatainfo is right or not.
-            Assertions.assertEquals(inMemoryWritableMetadataService.getMetadataInfos().size(), 1);
+            Assertions.assertEquals(metadataService.getMetadataInfos().size(), 1);
         }
     }
 
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
index 3459c19..bd2783b 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
@@ -18,11 +18,11 @@ package org.apache.dubbo.integration.multiple.servicediscoveryregistry;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.config.metadata.MetadataServiceDelegation;
 import org.apache.dubbo.metadata.MetadataService;
 import org.apache.dubbo.registry.Registry;
 import org.apache.dubbo.registry.RegistryServiceListener;
 import org.apache.dubbo.registry.client.ServiceDiscoveryRegistry;
-import org.apache.dubbo.registry.client.metadata.store.MetadataServiceDelegation;
 
 import static org.apache.dubbo.integration.Constants.MULTIPLE_CONFIG_CENTER_SERVICE_DISCOVERY_REGISTRY;
 
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java
index 4df35d3..743b233 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java
@@ -16,12 +16,11 @@
  */
 package org.apache.dubbo.integration.multiple.servicediscoveryregistry;
 
+import org.apache.dubbo.config.metadata.MetadataServiceDelegation;
 import org.apache.dubbo.registry.client.ServiceDiscoveryRegistry;
-import org.apache.dubbo.registry.client.metadata.store.MetadataServiceDelegation;
 
 /**
  * The instance to wrap {@link org.apache.dubbo.registry.client.ServiceDiscoveryRegistry}
- * and {@link MetadataServiceDelegation}
  */
 public class ServiceDiscoveryRegistryInfoWrapper {
 
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java
index 2026553..3b5a80e 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java
@@ -27,6 +27,7 @@ import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.ServiceConfig;
 import org.apache.dubbo.config.ServiceListener;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.config.metadata.MetadataServiceDelegation;
 import org.apache.dubbo.integration.IntegrationTest;
 import org.apache.dubbo.metadata.MetadataInfo;
 import org.apache.dubbo.metadata.MetadataService;
@@ -34,7 +35,6 @@ import org.apache.dubbo.registry.ListenerRegistryWrapper;
 import org.apache.dubbo.registry.Registry;
 import org.apache.dubbo.registry.client.ServiceDiscoveryRegistry;
 import org.apache.dubbo.registry.client.ServiceDiscoveryRegistryDirectory;
-import org.apache.dubbo.registry.client.metadata.store.MetadataServiceDelegation;
 import org.apache.dubbo.registry.client.migration.MigrationInvoker;
 import org.apache.dubbo.registry.support.RegistryManager;
 import org.apache.dubbo.registry.zookeeper.ZookeeperServiceDiscovery;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/metadata/MetadataServiceExporterTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/metadata/MetadataServiceExporterTest.java
index abf99c1..01d0d10 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/metadata/MetadataServiceExporterTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/metadata/MetadataServiceExporterTest.java
@@ -18,13 +18,16 @@ package org.apache.dubbo.metadata;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.NetUtils;
+import org.apache.dubbo.common.utils.ReflectUtils;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.ServiceConfig;
 import org.apache.dubbo.config.api.DemoService;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.config.deploy.DefaultApplicationDeployer;
 import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;
+import org.apache.dubbo.config.metadata.MetadataServiceDelegation;
 import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
 import org.apache.dubbo.registrycenter.RegistryCenter;
 import org.apache.dubbo.registrycenter.ZookeeperSingleRegistryCenter;
@@ -38,21 +41,14 @@ import org.mockito.Mockito;
 
 import java.util.List;
 
-import static org.apache.dubbo.common.constants.CommonConstants.COMPOSITE_METADATA_STORAGE_TYPE;
 import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;
 import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL;
-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-/**
- * {@link MetadataServiceExporter} Test-Cases
- *
- * @since 2.7.8
- */
 public class MetadataServiceExporterTest {
 
     @BeforeEach
@@ -68,33 +64,26 @@ public class MetadataServiceExporterTest {
 
     @Test
     public void test() {
-        MetadataService metadataService = Mockito.mock(MetadataService.class);
-        ConfigurableMetadataServiceExporter exporter = new ConfigurableMetadataServiceExporter();
+        MetadataServiceDelegation metadataService = Mockito.mock(MetadataServiceDelegation.class);
+        ConfigurableMetadataServiceExporter exporter = new ConfigurableMetadataServiceExporter(ApplicationModel.defaultModel(), metadataService);
         exporter.setMetadataService(metadataService);
-        exporter.setApplicationModel(ApplicationModel.defaultModel());
 
         exporter.export();
         assertTrue(exporter.isExported());
         exporter.unexport();
 
-        assertTrue(exporter.supports(DEFAULT_METADATA_STORAGE_TYPE));
-        assertTrue(exporter.supports(REMOTE_METADATA_STORAGE_TYPE));
-        assertTrue(exporter.supports(COMPOSITE_METADATA_STORAGE_TYPE));
     }
 
     @Test
     public void test2() throws Exception {
 
         ApplicationModel applicationModel = ApplicationModel.defaultModel();
-        ConfigurableMetadataServiceExporter exporter = (ConfigurableMetadataServiceExporter) applicationModel.getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
-        MetadataService metadataService = Mockito.mock(MetadataService.class);
-        exporter.setMetadataService(metadataService);
 
         applicationModel.getDeployer().start().get();
+        DefaultApplicationDeployer applicationDeployer = getApplicationDeployer(applicationModel);
+        ConfigurableMetadataServiceExporter exporter = ReflectUtils.getFieldValue(applicationDeployer, "metadataServiceExporter");
+
         assertTrue(exporter.isExported());
-        assertTrue(exporter.supports(DEFAULT_METADATA_STORAGE_TYPE));
-        assertTrue(exporter.supports(REMOTE_METADATA_STORAGE_TYPE));
-        assertTrue(exporter.supports(COMPOSITE_METADATA_STORAGE_TYPE));
 
         applicationModel.getDeployer().stop();
         assertFalse(exporter.isExported());
@@ -121,7 +110,8 @@ public class MetadataServiceExporterTest {
 
         // will start exporter
         providerBootstrap.start();
-        ConfigurableMetadataServiceExporter exporter = (ConfigurableMetadataServiceExporter) providerBootstrap.getApplicationModel().getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
+        DefaultApplicationDeployer applicationDeployer = getApplicationDeployer(providerBootstrap.getApplicationModel());
+        ConfigurableMetadataServiceExporter exporter = ReflectUtils.getFieldValue(applicationDeployer, "metadataServiceExporter");
 
         try {
             assertTrue(exporter.isExported());
@@ -159,7 +149,8 @@ public class MetadataServiceExporterTest {
 
         // will start exporter.export()
         providerBootstrap.start();
-        ConfigurableMetadataServiceExporter exporter = (ConfigurableMetadataServiceExporter) providerBootstrap.getApplicationModel().getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
+        DefaultApplicationDeployer applicationDeployer = getApplicationDeployer(providerBootstrap.getApplicationModel());
+        ConfigurableMetadataServiceExporter exporter = ReflectUtils.getFieldValue(applicationDeployer, "metadataServiceExporter");
 
         try {
             assertTrue(exporter.isExported());
@@ -173,6 +164,10 @@ public class MetadataServiceExporterTest {
         assertFalse(exporter.isExported());
     }
 
+    private DefaultApplicationDeployer getApplicationDeployer(ApplicationModel applicationModel) {
+        return (DefaultApplicationDeployer) DefaultApplicationDeployer.get(applicationModel);
+    }
+
     @Test
     public void testMetadataStartsBeforeNormalService() throws Exception {
         DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
@@ -194,8 +189,8 @@ public class MetadataServiceExporterTest {
 
         // will start exporter.export()
         providerBootstrap.start();
-        ConfigurableMetadataServiceExporter exporter = (ConfigurableMetadataServiceExporter) providerBootstrap.getApplicationModel().getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
-
+        DefaultApplicationDeployer applicationDeployer = getApplicationDeployer(providerBootstrap.getApplicationModel());
+        ConfigurableMetadataServiceExporter exporter = ReflectUtils.getFieldValue(applicationDeployer, "metadataServiceExporter");
         try {
             assertTrue(exporter.isExported());
             List<URL> urls = exporter.getExportedURLs();
diff --git a/dubbo-distribution/dubbo-all/pom.xml b/dubbo-distribution/dubbo-all/pom.xml
index be7c899..5a60457 100644
--- a/dubbo-distribution/dubbo-all/pom.xml
+++ b/dubbo-distribution/dubbo-all/pom.xml
@@ -663,12 +663,6 @@
                                 <transformer
                                     implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
-                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter
-                                    </resource>
-                                </transformer>
-                                <transformer
-                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>
                                         META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping
                                     </resource>
                                 </transformer>
diff --git a/dubbo-distribution/dubbo-core-spi/pom.xml b/dubbo-distribution/dubbo-core-spi/pom.xml
index f06ff26..84e78a5 100644
--- a/dubbo-distribution/dubbo-core-spi/pom.xml
+++ b/dubbo-distribution/dubbo-core-spi/pom.xml
@@ -367,12 +367,6 @@
                                 <transformer
                                     implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
-                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter
-                                    </resource>
-                                </transformer>
-                                <transformer
-                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>
                                         META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping
                                     </resource>
                                 </transformer>
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java
index 7276b07..b5c5d2f 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java
@@ -64,6 +64,8 @@ public interface MetadataService {
         return VERSION;
     }
 
+    URL getMetadataURL();
+
     /**
      * the list of String that presents all Dubbo subscribed {@link URL urls}
      *
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataServiceExporter.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataServiceExporter.java
deleted file mode 100644
index e6192f3..0000000
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataServiceExporter.java
+++ /dev/null
@@ -1,101 +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.metadata;
-
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.extension.SPI;
-import org.apache.dubbo.common.lang.Prioritized;
-import org.apache.dubbo.rpc.model.ScopeModel;
-
-import java.util.List;
-
-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;
-import static org.apache.dubbo.common.extension.ExtensionScope.APPLICATION;
-
-/**
- * The exporter of {@link MetadataService}
- *
- * @see MetadataService
- * @see #export()
- * @see #unexport()
- * @since 2.7.5
- */
-@SPI(value = DEFAULT_METADATA_STORAGE_TYPE, scope = APPLICATION)
-public interface MetadataServiceExporter extends Prioritized {
-
-    /**
-     * Exports the {@link MetadataService} as a Dubbo service
-     *
-     * @return {@link MetadataServiceExporter itself}
-     */
-    MetadataServiceExporter export();
-
-    /**
-     * Unexports the {@link MetadataService}
-     *
-     * @return {@link MetadataServiceExporter itself}
-     */
-    MetadataServiceExporter unexport();
-
-    /**
-     * Get the {@link URL URLs} that were exported
-     *
-     * @return non-null
-     */
-    List<URL> getExportedURLs();
-
-    /**
-     * {@link MetadataService} is export or not
-     *
-     * @return if {@link #export()} was executed, return <code>true</code>, or <code>false</code>
-     */
-    boolean isExported();
-
-    /**
-     * Does current implementation support the specified metadata type?
-     *
-     * @param metadataType the specified metadata type
-     * @return If supports, return <code>true</code>, or <code>false</code>
-     * @since 2.7.8
-     */
-    default boolean supports(String metadataType) {
-        return true;
-    }
-
-    /**
-     * Get the extension of {@link MetadataServiceExporter} by the type.
-     * If not found, return the default implementation
-     *
-     * @param metadataType the metadata type
-     * @return non-null
-     * @since 2.7.8
-     */
-    static MetadataServiceExporter getExtension(ScopeModel scopeModel, String metadataType) {
-        return scopeModel.getExtensionLoader(MetadataServiceExporter.class).getOrDefaultExtension(metadataType);
-    }
-
-    /**
-     * Get the default extension of {@link MetadataServiceExporter}
-     *
-     * @return non-null
-     * @since 2.7.8
-     */
-    static MetadataServiceExporter getDefaultExtension(ScopeModel scopeModel) {
-        return getExtension(scopeModel, DEFAULT_METADATA_STORAGE_TYPE);
-    }
-}
-
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataServiceType.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataServiceType.java
deleted file mode 100644
index 3af6b38..0000000
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataServiceType.java
+++ /dev/null
@@ -1,72 +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.metadata;
-
-import static org.apache.dubbo.common.constants.CommonConstants.COMPOSITE_METADATA_STORAGE_TYPE;
-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;
-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;
-
-/**
- * The type enumerations of {@link MetadataService}
- *
- * @see MetadataService
- * @since 2.7.8
- */
-public enum MetadataServiceType {
-
-    /**
-     * The default type of {@link MetadataService}
-     */
-    DEFAULT(DEFAULT_METADATA_STORAGE_TYPE),
-
-    /**
-     * The remote type of {@link MetadataService}
-     */
-    REMOTE(REMOTE_METADATA_STORAGE_TYPE),
-
-    /**
-     * The composite type of {@link MetadataService}
-     */
-    COMPOSITE(COMPOSITE_METADATA_STORAGE_TYPE);
-
-    /**
-     * The {@link String} value of type
-     */
-    private final String value;
-
-    MetadataServiceType(String value) {
-        this.value = value;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public static MetadataServiceType getOrDefault(String value) {
-        MetadataServiceType targetType = null;
-        for (MetadataServiceType type : values()) {
-            if (type.getValue().equals(value)) {
-                targetType = type;
-                break;
-            }
-        }
-        if (targetType == null) {
-            targetType = DEFAULT;
-        }
-        return targetType;
-    }
-}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
index 848b2e9..96e5d84 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.URLBuilder;
 import org.apache.dubbo.common.resource.Disposable;
 import org.apache.dubbo.config.MetadataReportConfig;
+import org.apache.dubbo.metadata.report.support.NopMetadataReport;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import java.util.HashMap;
@@ -29,6 +30,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_DIRECTORY;
 import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;
 import static org.apache.dubbo.common.utils.StringUtils.isEmpty;
 import static org.apache.dubbo.metadata.report.support.Constants.METADATA_REPORT_KEY;
 
@@ -48,15 +50,27 @@ import static org.apache.dubbo.metadata.report.support.Constants.METADATA_REPORT
 public class MetadataReportInstance implements Disposable {
 
     private AtomicBoolean init = new AtomicBoolean(false);
+    private String metadataType;
 
     // mapping of registry id to metadata report instance, registry instances will use this mapping to find related metadata reports
     private final Map<String, MetadataReport> metadataReports = new HashMap<>();
+    private ApplicationModel applicationModel;
+    private final NopMetadataReport nopMetadataReport;
+
+    public MetadataReportInstance(ApplicationModel applicationModel) {
+        this.applicationModel = applicationModel;
+        this.nopMetadataReport = new NopMetadataReport();
+    }
 
     public void init(MetadataReportConfig config) {
         if (!init.compareAndSet(false, true)) {
             return;
         }
-        ApplicationModel applicationModel = config.getApplicationModel();
+
+        this.metadataType = applicationModel.getApplicationConfigManager().getApplicationOrElseThrow().getMetadataType();
+        if (metadataType == null) {
+            this.metadataType = DEFAULT_METADATA_STORAGE_TYPE;
+        }
 
         MetadataReportFactory metadataReportFactory = applicationModel.getExtensionLoader(MetadataReportFactory.class).getAdaptiveExtension();
         URL url = config.toUrl();
@@ -90,6 +104,14 @@ public class MetadataReportInstance implements Disposable {
         return metadataReport;
     }
 
+    public MetadataReport getNopMetadataReport() {
+        return nopMetadataReport;
+    }
+
+    public String getMetadataType() {
+        return metadataType;
+    }
+
     public boolean inited() {
         return init.get();
     }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/NopMetadataReport.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/NopMetadataReport.java
new file mode 100644
index 0000000..f63be93
--- /dev/null
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/NopMetadataReport.java
@@ -0,0 +1,78 @@
+/*
+ * 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.metadata.report.support;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
+import org.apache.dubbo.metadata.report.MetadataReport;
+import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class NopMetadataReport implements MetadataReport {
+    public NopMetadataReport() {
+    }
+
+    @Override
+    public void storeProviderMetadata(MetadataIdentifier providerMetadataIdentifier, ServiceDefinition serviceDefinition) {
+
+    }
+
+    @Override
+    public String getServiceDefinition(MetadataIdentifier metadataIdentifier) {
+        return null;
+    }
+
+    @Override
+    public void storeConsumerMetadata(MetadataIdentifier consumerMetadataIdentifier, Map<String, String> serviceParameterMap) {
+
+    }
+
+    @Override
+    public List<String> getExportedURLs(ServiceMetadataIdentifier metadataIdentifier) {
+        return null;
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+
+    @Override
+    public void saveServiceMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
+
+    }
+
+    @Override
+    public void removeServiceMetadata(ServiceMetadataIdentifier metadataIdentifier) {
+
+    }
+
+    @Override
+    public void saveSubscribedData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, Set<String> urls) {
+
+    }
+
+    @Override
+    public List<String> getSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier) {
+        return null;
+    }
+}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataServiceTypeTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataServiceTypeTest.java
deleted file mode 100644
index 11eec1d..0000000
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataServiceTypeTest.java
+++ /dev/null
@@ -1,48 +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.metadata;
-
-import org.junit.jupiter.api.Test;
-
-import static org.apache.dubbo.metadata.MetadataServiceType.COMPOSITE;
-import static org.apache.dubbo.metadata.MetadataServiceType.DEFAULT;
-import static org.apache.dubbo.metadata.MetadataServiceType.REMOTE;
-import static org.apache.dubbo.metadata.MetadataServiceType.getOrDefault;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * {@link MetadataServiceType} Test-Cases
- *
- * @since 2.7.8
- */
-public class MetadataServiceTypeTest {
-
-    @Test
-    public void testGetValue() {
-        assertEquals("local", DEFAULT.getValue());
-        assertEquals("remote", REMOTE.getValue());
-        assertEquals("composite", COMPOSITE.getValue());
-    }
-
-    @Test
-    public void testGetOrDefault() {
-        assertEquals(DEFAULT, getOrDefault("local"));
-        assertEquals(REMOTE, getOrDefault("remote"));
-        assertEquals(COMPOSITE, getOrDefault("composite"));
-        assertEquals(DEFAULT, getOrDefault("others"));
-    }
-}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/MetadataReportInstanceTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/MetadataReportInstanceTest.java
index 94f27e4..fa665de 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/MetadataReportInstanceTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/MetadataReportInstanceTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.MetadataReportConfig;
 import org.apache.dubbo.config.context.ConfigManager;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -41,9 +42,9 @@ class MetadataReportInstanceTest {
 
     @BeforeEach
     public void setUp() {
-        metadataReportInstance = new MetadataReportInstance();
         configManager = mock(ConfigManager.class);
         ApplicationModel applicationModel = spy(ApplicationModel.defaultModel());
+        metadataReportInstance = new MetadataReportInstance(applicationModel);
 
 
         URL url = URL.valueOf("metadata://127.0.0.1:20880/TestService?version=1.0.0&metadata=JTest");
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/RegistryScopeModelInitializer.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/RegistryScopeModelInitializer.java
index fe1973d..6be4e29 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/RegistryScopeModelInitializer.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/RegistryScopeModelInitializer.java
@@ -17,7 +17,6 @@
 package org.apache.dubbo.registry;
 
 import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
-import org.apache.dubbo.registry.client.metadata.store.MetadataServiceDelegation;
 import org.apache.dubbo.registry.support.RegistryManager;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
@@ -34,7 +33,6 @@ public class RegistryScopeModelInitializer implements ScopeModelInitializer {
     public void initializeApplicationModel(ApplicationModel applicationModel) {
         ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
         beanFactory.registerBean(RegistryManager.class);
-        beanFactory.registerBean(MetadataServiceDelegation.class);
     }
 
     @Override
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java
index dc2eb8b..2d0b977 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java
@@ -31,6 +31,7 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import java.util.List;
 
+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;
 import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;
 import static org.apache.dubbo.metadata.RevisionResolver.EMPTY_REVISION;
 import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.EXPORTED_SERVICES_REVISION_PROPERTY_NAME;
@@ -47,6 +48,7 @@ public abstract class AbstractServiceDiscovery implements ServiceDiscovery {
     protected volatile ServiceInstance serviceInstance;
     protected volatile MetadataInfo metadataInfo;
     protected MetadataReport metadataReport;
+    protected String metadataType;
     protected MetaCacheManager metaCacheManager;
     protected URL registryURL;
 
@@ -55,9 +57,13 @@ public abstract class AbstractServiceDiscovery implements ServiceDiscovery {
     public AbstractServiceDiscovery(ApplicationModel applicationModel, URL registryURL) {
         this(applicationModel.getApplicationName(), registryURL);
         this.applicationModel = applicationModel;
-
-        metadataReport = applicationModel.getBeanFactory().getBean(MetadataReportInstance.class)
-            .getMetadataReport(registryURL.getParameter(REGISTRY_CLUSTER_KEY));
+        MetadataReportInstance metadataReportInstance = applicationModel.getBeanFactory().getBean(MetadataReportInstance.class);
+        metadataType = metadataReportInstance.getMetadataType();
+        if (REMOTE_METADATA_STORAGE_TYPE.equals(metadataReportInstance.getMetadataType())) {
+            this.metadataReport = metadataReportInstance.getMetadataReport(registryURL.getParameter(REGISTRY_CLUSTER_KEY));
+        } else {
+            this.metadataReport = metadataReportInstance.getNopMetadataReport();
+        }
     }
 
     public AbstractServiceDiscovery(String serviceName, URL registryURL) {
@@ -203,7 +209,6 @@ public abstract class AbstractServiceDiscovery implements ServiceDiscovery {
     private ServiceInstance createServiceInstance() {
         DefaultServiceInstance instance = new DefaultServiceInstance(serviceName, applicationModel);
         instance.setServiceMetadata(metadataInfo);
-        String metadataType = applicationModel.getApplicationConfigManager().getApplicationOrElseThrow().getMetadataType();
         setMetadataStorageType(instance, metadataType);
         ServiceInstanceMetadataUtils.customizeInstance(instance, applicationModel);
         return instance;
diff --git a/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer b/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
index aa9a685..e11c6e4 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
+++ b/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
@@ -1,3 +1,2 @@
-metadata-url=org.apache.dubbo.registry.client.metadata.MetadataServiceURLParamsMetadataCustomizer
 protocol-ports=org.apache.dubbo.registry.client.metadata.ProtocolPortsMetadataCustomizer
 instance-metadata=org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataCustomizer
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizerTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizerTest.java
index 96ad9c1..86fe271 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizerTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizerTest.java
@@ -21,7 +21,6 @@ import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.metadata.MetadataService;
 import org.apache.dubbo.registry.client.DefaultServiceInstance;
-import org.apache.dubbo.registry.client.metadata.store.MetadataServiceDelegation;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import com.google.gson.Gson;
@@ -51,7 +50,7 @@ public class ProtocolPortsMetadataCustomizerTest {
     private static final Gson gson = new Gson();
 
     public DefaultServiceInstance instance;
-    private static MetadataServiceDelegation mockedMetadataService;
+    private static MetadataService mockedMetadataService;
     private static ApplicationModel mockedApplicationModel;
     private static ScopeBeanFactory mockedBeanFactory;
 
@@ -64,7 +63,7 @@ public class ProtocolPortsMetadataCustomizerTest {
         ApplicationConfig applicationConfig = new ApplicationConfig("test");
         ApplicationModel.defaultModel().getApplicationConfigManager().setApplication(applicationConfig);
 
-        mockedMetadataService = Mockito.mock(MetadataServiceDelegation.class);
+        mockedMetadataService = Mockito.mock(MetadataService.class);
 
         mockedApplicationModel = Mockito.mock(ApplicationModel.class);
         Mockito.when(mockedApplicationModel.getBeanFactory()).thenReturn(mockedBeanFactory);
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizerTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizerTest.java
index 0255ea3..1fda298 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizerTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizerTest.java
@@ -23,7 +23,6 @@ import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.metadata.MetadataInfo;
 import org.apache.dubbo.metadata.MetadataService;
 import org.apache.dubbo.registry.client.DefaultServiceInstance;
-import org.apache.dubbo.registry.client.metadata.store.MetadataServiceDelegation;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import org.junit.jupiter.api.AfterAll;
@@ -43,7 +42,7 @@ import static org.mockito.Mockito.mock;
 
 public class ServiceInstanceMetadataCustomizerTest {
     public DefaultServiceInstance instance;
-    private static MetadataServiceDelegation mockedMetadataService;
+    private static MetadataService mockedMetadataService;
     private static ApplicationModel mockedApplicationModel;
     private static ScopeBeanFactory mockedBeanFactory;
 
@@ -56,7 +55,7 @@ public class ServiceInstanceMetadataCustomizerTest {
         ApplicationConfig applicationConfig = new ApplicationConfig("test");
         ApplicationModel.defaultModel().getApplicationConfigManager().setApplication(applicationConfig);
 
-        mockedMetadataService = Mockito.mock(MetadataServiceDelegation.class);
+        mockedMetadataService = Mockito.mock(MetadataService.class);
 
         mockedApplicationModel = Mockito.mock(ApplicationModel.class);
         Mockito.when(mockedApplicationModel.getBeanFactory()).thenReturn(mockedBeanFactory);
@@ -72,7 +71,7 @@ public class ServiceInstanceMetadataCustomizerTest {
     @BeforeEach
     public void init() {
         instance = createInstance();
-        mockedMetadataService = mock(MetadataServiceDelegation.class);
+        mockedMetadataService = mock(MetadataService.class);
 
         URL url = URL.valueOf("dubbo://30.10.104.63:20880/org.apache.dubbo.demo.GreetingService?" + "params-filter=-default&" +
             "REGISTRY_CLUSTER=registry1&anyhost=true&application=demo-provider2&delay=5000&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=greeting&interface=org.apache.dubbo.demo.GreetingService&metadata-type=remote&methods=hello&pid=55805&release=&revision=1.0.0&service-name-mapping=true&side=provider&timeout=5000&timestamp=1630229110058&version=1.0.0");