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/12/29 02:56:39 UTC

[dubbo] branch 3.0 updated: 3.0 service discovery metadata refactor (#9506)

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

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


The following commit(s) were added to refs/heads/3.0 by this push:
     new b2a4f61  3.0 service discovery metadata refactor (#9506)
b2a4f61 is described below

commit b2a4f612ece11d6bac508600b22095ccd0e87c88
Author: ken.lj <ke...@gmail.com>
AuthorDate: Wed Dec 29 10:56:05 2021 +0800

    3.0 service discovery metadata refactor (#9506)
---
 .../apache/dubbo/rpc/cluster/filter/LogFilter.java |    4 +-
 .../dubbo/rpc/cluster/merger/ResultMergerTest.java |    1 +
 .../router/mesh/rule/VirtualServiceRuleTest.java   |    3 +-
 .../support/BroadCastClusterInvokerTest.java       |    1 +
 .../rpc/cluster/support/ClusterUtilsTest.java      |    1 +
 .../support/ConnectivityValidationTest.java        |    2 -
 .../cluster/support/ForkingClusterInvokerTest.java |    1 -
 .../DefaultProviderURLMergeProcessorTest.java      |   13 +-
 .../apache/dubbo/common/cache/FileCacheStore.java  |  238 +++++
 .../common/config/CompositeConfiguration.java      |    2 +-
 .../dubbo/common/config/ConfigurationUtils.java    |    2 +-
 .../file/FileSystemDynamicConfiguration.java       |    7 +-
 .../wrapper/CompositeDynamicConfiguration.java     |    2 +-
 .../dubbo/common/constants/CommonConstants.java    |    4 -
 .../dubbo/common/constants/RegistryConstants.java  |    6 +-
 .../dubbo/common/deploy/AbstractDeployer.java      |    2 +-
 .../common/deploy/ApplicationDeployListener.java   |    2 +
 .../dubbo/common/deploy/ApplicationDeployer.java   |    7 +-
 .../org/apache/dubbo/common/utils/JsonUtils.java   |   12 +-
 .../common/utils/{LRUCache.java => LRU2Cache.java} |    8 +-
 .../org/apache/dubbo/common/utils/LRUCache.java    |   54 +-
 .../org/apache/dubbo/common/utils/TypeUtils.java   |    2 +-
 .../definition/MethodDefinitionBuilder.java        |    0
 .../definition/ServiceDefinitionBuilder.java       |   16 +-
 .../metadata/definition/TypeDefinitionBuilder.java |    9 +-
 .../definition/builder/ArrayTypeBuilder.java       |    0
 .../definition/builder/CollectionTypeBuilder.java  |    0
 .../definition/builder/DefaultTypeBuilder.java     |    0
 .../definition/builder/EnumTypeBuilder.java        |    0
 .../definition/builder/MapTypeBuilder.java         |    0
 .../metadata/definition/builder/TypeBuilder.java   |    3 +-
 .../definition/model/FullServiceDefinition.java    |    0
 .../definition/model/MethodDefinition.java         |    0
 .../definition/model/ServiceDefinition.java        |    4 +-
 .../metadata/definition/model/TypeDefinition.java  |    0
 .../dubbo/metadata/definition/util/ClassUtils.java |    0
 .../definition/util/JaketConfigurationUtils.java   |    0
 .../org/apache/dubbo/rpc/model/FrameworkModel.java |    4 +
 .../org/apache/dubbo/rpc/model/ModuleModel.java    |    1 +
 .../dubbo/rpc/model/ModuleServiceRepository.java   |    9 +
 .../org/apache/dubbo/rpc/model/ScopeModel.java     |    5 +
 .../apache/dubbo/rpc/model/ServiceDescriptor.java  |   20 +
 ...e.dubbo.metadata.definition.builder.TypeBuilder |    0
 .../common/CommonScopeModelInitializerTest.java    |    1 +
 .../org/apache/dubbo/common/URLBuilderTest.java    |    1 +
 .../common/beans/InstantiationStrategyTest.java    |    1 +
 .../dubbo/common/beans/ScopeBeanFactoryTest.java   |    1 +
 .../dubbo/common/cache/FileCacheStoreTest.java     |   62 ++
 .../concurrent/CompletableFutureTaskTest.java      |   17 +-
 .../dubbo/common/config/EnvironmentTest.java       |    2 +-
 .../common/config/PropertiesConfigurationTest.java |    1 +
 .../FileSystemDynamicConfigurationFactoryTest.java |    2 +-
 .../file/FileSystemDynamicConfigurationTest.java   |    3 +-
 .../common/extension/ExtensionDirectorTest.java    |    1 +
 .../common/extension/ExtensionLoaderTest.java      |    1 +
 .../activate/impl/OldActivateExt1Impl2.java        |    3 +-
 .../activate/impl/OldActivateExt1Impl3.java        |    3 +-
 .../inject/AdaptiveExtensionInjectorTest.java      |    1 +
 .../extension/support/ActivateComparatorTest.java  |    1 +
 .../common/lang/ShutdownHookCallbacksTest.java     |    1 +
 .../dubbo/common/logger/LoggerFactoryTest.java     |    1 +
 .../org/apache/dubbo/common/status/StatusTest.java |    2 +-
 .../reporter/FrameworkStatusReportServiceTest.java |    3 +-
 .../status/support/LoadStatusCheckerTest.java      |    3 +-
 .../status/support/MemoryStatusCheckerTest.java    |    3 +-
 .../common/status/support/StatusUtilsTest.java     |    3 +-
 .../threadpool/manager/ExecutorRepositoryTest.java |    1 +
 .../utils/ClassLoaderResourceLoaderTest.java       |    1 +
 .../apache/dubbo/common/utils/ConfigUtilsTest.java |    1 +
 .../org/apache/dubbo/common/utils/HolderTest.java  |    2 +-
 .../{LRUCacheTest.java => LRU2CacheTest.java}      |    8 +-
 .../apache/dubbo/common/utils/LogHelperTest.java   |    1 +
 .../org/apache/dubbo/common/utils/LogUtilTest.java |    2 +-
 .../dubbo/common/utils/NamedThreadFactoryTest.java |    2 +-
 .../dubbo/config/AbstractInterfaceConfigTest.java  |    3 +-
 .../context/ConfigConfigurationAdapterTest.java    |    1 +
 .../dubbo/config/context/ConfigManagerTest.java    |    1 +
 .../dubbo/descriptor/MethodDescriptorTest.java     |    3 +-
 .../dubbo/metadata/definition/MetadataTest.java    |    7 +
 .../dubbo/metadata/definition/MetadataUtils.java   |    0
 .../definition/ServiceDefinitionBuilderTest.java   |    0
 .../metadata/definition/Test3TypeBuilder.java      |    0
 .../dubbo/metadata/definition/TestTypeBuilder.java |    0
 .../definition/TypeDefinitionBuilderTest.java      |    0
 .../definition/common/ClassExtendsMap.java         |    0
 .../metadata/definition/common/ColorEnum.java      |    0
 .../metadata/definition/common/OuterClass.java     |    0
 .../common/ResultWithRawCollections.java           |    0
 .../metadata/definition/common/TestService.java    |    0
 .../metadata/definition/service/ComplexObject.java |    4 +-
 .../metadata/definition/service/DemoService.java   |    0
 .../service/annotation/MockMethodAnnotation.java   |    0
 .../service/annotation/MockMethodAnnotation2.java  |    0
 .../service/annotation/MockTypeAnnotation.java     |    0
 .../dubbo/rpc/model/ApplicationModelTest.java      |    1 +
 .../apache/dubbo/rpc/model/FrameworkModelTest.java |    1 +
 .../rpc/model/FrameworkServiceRepositoryTest.java  |    1 +
 .../apache/dubbo/rpc/model/ModuleModelTest.java    |    1 +
 .../rpc/model/ModuleServiceRepositoryTest.java     |    1 +
 .../ScopeModelAwareExtensionProcessorTest.java     |    1 +
 .../org/apache/dubbo/rpc/model/ScopeModelTest.java |    1 +
 .../apache/dubbo/rpc/model/ScopeModelUtilTest.java |    1 +
 .../dubbo/rpc/model/ServiceRepositoryTest.java     |    1 +
 ...e.dubbo.metadata.definition.builder.TypeBuilder |    0
 .../src/test/resources/test-cache.dubbo.cache      |    2 +
 .../alibaba/dubbo/container/page/PageServlet.java  |    1 -
 .../container/page/pages/HomePageHandler.java      |    2 +-
 .../dubbo/container/page/pages/LogPageHandler.java |    2 -
 .../container/page/pages/StatusPageHandler.java    |    2 +-
 .../java/org/apache/dubbo/config/ConfigTest.java   |    1 -
 .../apache/dubbo/generic/GenericServiceTest.java   |    5 +-
 .../org/apache/dubbo/config/ReferenceConfig.java   |   13 +-
 .../org/apache/dubbo/config/ServiceConfig.java     |   91 +-
 .../config/deploy/DefaultApplicationDeployer.java  |  219 ++---
 .../dubbo/config/deploy/DefaultModuleDeployer.java |   10 +-
 .../ConfigurableMetadataServiceExporter.java       |  123 +--
 .../config/metadata/ExporterDeployListener.java    |   96 ++
 .../config/metadata/MetadataServiceDelegation.java |  228 +++++
 ...MetadataServiceURLParamsMetadataCustomizer.java |   31 +-
 ...e.dubbo.common.deploy.ApplicationDeployListener |    1 +
 ...g.apache.dubbo.metadata.MetadataServiceExporter |    2 -
 ...dubbo.registry.client.ServiceInstanceCustomizer |    2 +-
 .../dubbo/config/AbstractMethodConfigTest.java     |    1 +
 .../apache/dubbo/config/ApplicationConfigTest.java |    1 +
 .../config/ConfigScopeModelInitializerTest.java    |    1 +
 .../apache/dubbo/config/ConsumerConfigTest.java    |    1 +
 .../apache/dubbo/config/ProtocolConfigTest.java    |    1 +
 .../apache/dubbo/config/RegistryConfigTest.java    |    2 +-
 .../org/apache/dubbo/config/ServiceConfigTest.java |    3 +-
 .../dubbo/config/bootstrap/DubboBootstrapTest.java |   43 +-
 .../dubbo/config/bootstrap/MultiInstanceTest.java  |    1 +
 .../builders/AbstractInterfaceBuilderTest.java     |    2 +-
 ...egistryCenterExportMetadataIntegrationTest.java |    5 +-
 ...egistryCenterExportProviderIntegrationTest.java |    1 +
 ...MultipleRegistryCenterInjvmIntegrationTest.java |    1 +
 ...terServiceDiscoveryRegistryIntegrationTest.java |   13 +-
 ...ceDiscoveryRegistryRegistryServiceListener.java |    3 -
 .../ServiceDiscoveryRegistryInfoWrapper.java       |   13 +-
 ...RegistryCenterDubboProtocolIntegrationTest.java |   23 +-
 ...egistryCenterExportMetadataIntegrationTest.java |    5 +-
 ...egistryCenterExportProviderIntegrationTest.java |    1 +
 .../SingleRegistryCenterInjvmIntegrationTest.java  |    1 +
 .../metadata/MetadataServiceExporterTest.java      |  252 -----
 ...dataServiceURLParamsMetadataCustomizerTest.java |   77 +-
 .../ServiceInstanceHostPortCustomizerTest.java     |   87 --
 .../dubbo/config/mock/MockServiceDiscovery.java    |   17 +-
 .../config/utils/ConfigValidationUtilsTest.java    |    2 +-
 .../dubbo/config/utils/ReferenceCacheTest.java     |    1 +
 .../metadata/MetadataServiceExporterTest.java      |  256 +++++
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 -
 .../apache/dubbo/config/spring/ReferenceBean.java  |    1 +
 .../ReferenceAnnotationBeanPostProcessor.java      |    5 +-
 .../annotation/ServiceAnnotationPostProcessor.java |    3 +-
 ...onfigDefaultPropertyValueBeanPostProcessor.java |    2 +-
 .../context/DubboBootstrapApplicationListener.java |    5 +-
 ...bboBootstrapStartStopListenerSpringAdapter.java |    1 +
 .../context/DubboConfigApplicationListener.java    |    5 +-
 .../spring/context/DubboConfigBeanInitializer.java |    5 +-
 .../context/DubboDeployApplicationListener.java    |    1 +
 .../DubboInfraBeanRegisterPostProcessor.java       |    1 +
 .../spring/context/DubboSpringInitContext.java     |    1 +
 .../spring/context/DubboSpringInitCustomizer.java  |    1 +
 .../spring/context/DubboSpringInitializer.java     |    1 +
 .../annotation/DubboComponentScanRegistrar.java    |    1 +
 .../DubboConfigConfigurationRegistrar.java         |    1 +
 .../context/event/DubboApplicationStateEvent.java  |    1 +
 .../context/event/DubboBootstrapStatedEvent.java   |    1 +
 .../context/event/DubboBootstrapStopedEvent.java   |    1 +
 .../spring/context/event/DubboConfigInitEvent.java |    1 +
 .../spring/extension/SpringExtensionInjector.java  |    1 +
 .../spring/reference/ReferenceBeanManager.java     |    5 +-
 .../spring/reference/ReferenceBeanSupport.java     |    3 +-
 .../config/spring/reference/ReferenceCreator.java  |    7 +-
 .../schema/AnnotationBeanDefinitionParser.java     |    2 +-
 .../spring/schema/DubboNamespaceHandler.java       |    1 +
 .../spring/status/DataSourceStatusChecker.java     |    1 +
 .../config/spring/status/SpringStatusChecker.java  |    1 +
 .../config/spring/util/DubboAnnotationUtils.java   |    1 +
 .../dubbo/config/spring/util/DubboBeanUtils.java   |    5 +-
 .../org/apache/dubbo/config/spring/ConfigTest.java |    3 +-
 .../dubbo/config/spring/DubboStateListener.java    |    1 +
 .../dubbo/config/spring/JavaConfigBeanTest.java    |    1 +
 .../dubbo/config/spring/ServiceBeanTest.java       |    2 +-
 .../annotation/MethodConfigCallbackTest.java       |    1 +
 .../factory/annotation/ParameterConvertTest.java   |    1 +
 .../factory/annotation/ReferenceCreatorTest.java   |    3 +-
 .../ServiceAnnotationPostProcessorTest.java        |    1 +
 .../annotation/ServiceBeanNameBuilderTest.java     |    1 +
 .../MultipleServicesWithMethodConfigsTest.java     |    1 +
 .../XmlReferenceBeanConditionalTest.java           |    1 +
 ...nfigAnnotationReferenceBeanConditionalTest.java |    1 +
 .../JavaConfigRawReferenceBeanConditionalTest.java |    1 +
 .../JavaConfigReferenceBeanConditionalTest4.java   |    1 +
 .../configprops/SpringBootConfigPropsTest.java     |    1 +
 .../SpringBootMultipleConfigPropsTest.java         |    1 +
 .../importxml/SpringBootImportDubboXmlTest.java    |    1 +
 .../importxml2/SpringBootImportAndScanTest.java    |    3 +-
 .../spring/boot/importxml2/dubbo-provider.xml      |    4 +-
 .../context/KeepRunningOnSpringClosedTest.java     |    1 +
 .../DubboComponentScanRegistrarTest.java           |    1 +
 .../annotation/DubboConfigConfigurationTest.java   |    2 +-
 .../spring/context/annotation/EnableDubboTest.java |    1 +
 .../customize/DubboSpringInitCustomizerTest.java   |    1 +
 .../properties/DefaultDubboConfigBinderTest.java   |    1 +
 .../extension/SpringExtensionInjectorTest.java     |    1 +
 .../config/spring/impl/MethodCallbackImpl.java     |    1 +
 .../spring/issues/issue6000/Issue6000Test.java     |    3 +-
 .../spring/issues/issue6000/adubbo/HelloDubbo.java |    1 +
 .../issues/issue6000/dubbo/MyReferenceConfig.java  |    1 +
 .../spring/issues/issue6252/Issue6252Test.java     |    1 +
 .../spring/issues/issue7003/Issue7003Test.java     |    1 +
 .../issue9172/MultipleConsumerAndProviderTest.java |    1 +
 .../issues/issue9207/ConfigCenterBeanTest.java     |    1 +
 .../consumer/DemoBeanFactoryPostProcessor.java     |    1 +
 .../propertyconfigurer/consumer/dubbo-consumer.xml |    4 +-
 .../consumer2/dubbo-consumer.xml                   |    4 +-
 .../consumer3/dubbo-consumer.xml                   |    4 +-
 .../reference/DubboConfigBeanInitializerTest.java  |    1 +
 .../reference/localcall/local-call-consumer.xml    |    4 +-
 .../reference/localcallmix/local-call-consumer.xml |    4 +-
 .../spring/registry/MockServiceDiscovery.java      |   17 +-
 .../registry/nacos/nacos/NacosServiceNameTest.java |    2 +-
 .../spring/schema/DubboNamespaceHandlerTest.java   |    1 +
 .../config/spring/schema/GenericServiceTest.java   |    1 +
 .../schema/GenericServiceWithoutInterfaceTest.java |    1 +
 .../spring/status/DataSourceStatusCheckerTest.java |    1 +
 .../spring/status/SpringStatusCheckerTest.java     |    1 +
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 -
 .../support/nacos/NacosDynamicConfiguration.java   |   21 +-
 .../zookeeper/ZookeeperDynamicConfiguration.java   |    1 +
 .../dubbo/container/spring/SpringContainer.java    |    1 +
 .../apache/dubbo/demo/consumer/Application.java    |    2 +-
 .../apache/dubbo/demo/provider/Application.java    |    2 +-
 .../dubbo-demo-native-consumer/pom.xml             |    4 -
 .../dubbo/demo/graalvm/consumer/Application.java   |    3 +-
 .../dubbo-demo-native-provider/pom.xml             |    4 -
 .../demo/graalvm/provider/DemoServiceImpl.java     |    3 +-
 .../src/main/resources/spring/dubbo-consumer.xml   |    2 +-
 .../src/main/resources/spring/dubbo-provider.xml   |    2 +-
 dubbo-dependencies-bom/pom.xml                     |    2 +-
 .../dubbo-dependencies-zookeeper/pom.xml           |    2 +-
 dubbo-distribution/dubbo-all/pom.xml               |   42 -
 dubbo-distribution/dubbo-bom/pom.xml               |   15 -
 dubbo-distribution/dubbo-core-spi/pom.xml          |   18 -
 .../apache/dubbo/cache/support/lru/LruCache.java   |    4 +-
 .../cache/support/lru/LruCacheFactoryTest.java     |    3 +-
 .../threadlocal/ThreadLocalCacheFactoryTest.java   |    3 +-
 dubbo-metadata/dubbo-metadata-api/pom.xml          |    2 +-
 .../dubbo/metadata/AbstractServiceNameMapping.java |  112 ++-
 .../org/apache/dubbo/metadata/MappingListener.java |    2 +
 .../apache/dubbo/metadata/MetadataConstants.java   |    2 +-
 .../org/apache/dubbo/metadata/MetadataInfo.java    |  260 +++--
 .../org/apache/dubbo/metadata/MetadataService.java |  103 +-
 .../dubbo/metadata/MetadataServiceExporter.java    |  101 --
 .../apache/dubbo/metadata/MetadataServiceType.java |   72 --
 .../apache/dubbo/metadata/ServiceNameMapping.java  |   52 +-
 .../dubbo/metadata/WritableMetadataService.java    |  100 --
 .../dubbo/metadata/report/MetadataReport.java      |    7 +
 .../metadata/report/MetadataReportInstance.java    |   70 +-
 .../report/support/AbstractMetadataReport.java     |    8 +-
 .../metadata/report/support/NopMetadataReport.java |   78 ++
 .../AbstractAbstractWritableMetadataService.java   |   98 --
 .../metadata/AbstractServiceNameMappingTest.java   |  136 +--
 .../apache/dubbo/metadata/MetadataInfoTest.java    |   48 +-
 .../dubbo/metadata/MetadataServiceTypeTest.java    |   48 -
 .../report/MetadataReportInstanceTest.java         |   17 +-
 .../report/identifier/MetadataIdentifierTest.java  |    1 -
 .../support/AbstractMetadataReportFactoryTest.java |    6 +
 .../report/support/AbstractMetadataReportTest.java |   14 +-
 .../metadata/test/JTestMetadataReport4Test.java    |    6 +
 .../definition/protobuf/ProtobufTypeBuilder.java   |   11 +-
 .../protobuf/ProtobufTypeBuilderTest.java          |    4 +
 .../builder/EnumTypeDefinitionBuilder.java         |    1 -
 .../builder/GeneralTypeDefinitionBuilder.java      |    1 -
 .../builder/PrimitiveTypeDefinitionBuilder.java    |    1 -
 .../builder/ServiceDefinitionBuilder.java          |    1 -
 .../builder/SimpleTypeDefinitionBuilder.java       |    1 -
 .../PrimitiveTypeDefinitionBuilderTest.java        |    1 -
 .../store/nacos/NacosConfigServiceWrapper.java     |    4 +
 .../metadata/store/nacos/NacosMetadataReport.java  |   74 +-
 .../store/zookeeper/ZookeeperMetadataReport.java   |   36 +-
 .../zookeeper/ZookeeperMetadataReportTest.java     |   29 +-
 .../java/org/apache/dubbo/monitor/Constants.java   |    3 -
 .../org/apache/dubbo/maven/plugin/ClassFinder.java |    1 -
 .../java/org/apache/dubbo/maven/plugin/Test.java   |    4 -
 .../META-INF/native-image/reflect-config.json      |    3 -
 .../META-INF/native-image/resource-config.json     |    3 -
 .../selector/ServiceInstanceSelector$Adaptive.java |   30 -
 .../java/org/apache/dubbo/utils/CodeGenerator.java |    3 +-
 .../dubbo/auth/AccessKeyAuthenticatorTest.java     |    1 +
 .../dubbo/auth/filter/ConsumerSignFilterTest.java  |    1 +
 .../dubbo/qos/command/impl/ChangeTelnet.java       |    5 +-
 .../apache/dubbo/qos/command/impl/CountTelnet.java |    5 +-
 .../dubbo/qos/command/impl/InvokeTelnet.java       |    7 +-
 .../dubbo/qos/command/impl/PublishMetadata.java    |   32 +-
 .../dubbo/qos/command/impl/SelectTelnet.java       |    5 +-
 .../java/org/apache/dubbo/qos/server/Server.java   |   11 +-
 .../qos/server/handler/HttpProcessHandler.java     |   17 +-
 .../qos/server/handler/QosProcessHandler.java      |    5 +-
 .../qos/server/handler/TelnetProcessHandler.java   |    7 +-
 .../qos/command/CommandContextFactoryTest.java     |    2 +-
 .../dubbo/qos/command/CommandContextTest.java      |    4 +-
 .../qos/command/DefaultCommandExecutorTest.java    |    1 +
 .../command/decoder/HttpCommandDecoderTest.java    |    5 +-
 .../command/decoder/TelnetCommandDecoderTest.java  |    3 +-
 .../dubbo/qos/command/impl/ChangeTelnetTest.java   |    5 +-
 .../dubbo/qos/command/impl/CountTelnetTest.java    |    1 +
 .../apache/dubbo/qos/command/impl/HelpTest.java    |    1 +
 .../dubbo/qos/command/impl/InvokeTelnetTest.java   |    5 +-
 .../apache/dubbo/qos/command/impl/LiveTest.java    |    1 +
 .../org/apache/dubbo/qos/command/impl/LsTest.java  |    1 +
 .../apache/dubbo/qos/command/impl/OfflineTest.java |    1 +
 .../apache/dubbo/qos/command/impl/OnlineTest.java  |    3 +-
 .../dubbo/qos/command/impl/PortTelnetTest.java     |    1 +
 .../qos/command/impl/PublishMetadataTest.java      |   13 +-
 .../dubbo/qos/command/impl/PwdTelnetTest.java      |    5 +-
 .../apache/dubbo/qos/command/impl/QuitTest.java    |    3 +-
 .../apache/dubbo/qos/command/impl/ReadyTest.java   |    1 +
 .../dubbo/qos/command/impl/SelectTelnetTest.java   |    5 +-
 .../dubbo/qos/command/impl/ShutdownTelnetTest.java |    3 +-
 .../apache/dubbo/qos/command/impl/StartupTest.java |    1 +
 .../dubbo/qos/legacy/ChangeTelnetHandlerTest.java  |    1 +
 .../dubbo/qos/legacy/TraceTelnetHandlerTest.java   |    1 +
 .../legacy/service/generic/GenericServiceTest.java |    1 +
 .../dubbo/qos/protocol/QosProtocolWrapperTest.java |    1 +
 .../qos/server/handler/HttpProcessHandlerTest.java |    3 +-
 .../server/handler/LocalHostPermitHandlerTest.java |    2 +-
 .../qos/server/handler/QosProcessHandlerTest.java  |    3 +-
 .../server/handler/TelnetProcessHandlerTest.java   |    3 +-
 .../java/org/apache/dubbo/qos/textui/TKvTest.java  |    2 +-
 .../org/apache/dubbo/qos/textui/TLadderTest.java   |    3 +-
 .../org/apache/dubbo/qos/textui/TTableTest.java    |    2 +-
 .../org/apache/dubbo/qos/textui/TTreeTest.java     |    2 +-
 .../registry/RegistryScopeModelInitializer.java    |    2 -
 .../registry/client/AbstractServiceDiscovery.java  |  268 ++++-
 .../client/AbstractServiceDiscoveryFactory.java    |   10 +-
 .../client/DefaultServiceDiscoveryFactory.java     |   22 +-
 .../registry/client/DefaultServiceInstance.java    |    6 +-
 .../client/FileSystemServiceDiscovery.java         |  397 ++++----
 .../registry/client/NopServiceDiscovery.java}      |   25 +-
 .../client/SelfHostMetaServiceDiscovery.java       |  308 ------
 .../dubbo/registry/client/ServiceDiscovery.java    |  218 +----
 .../registry/client/ServiceDiscoveryFactory.java   |    5 +-
 .../registry/client/ServiceDiscoveryRegistry.java  |   97 +-
 .../client/ServiceDiscoveryRegistryFactory.java    |    2 +-
 .../registry/client/ServiceDiscoveryService.java   |    9 +-
 .../dubbo/registry/client/ServiceInstance.java     |    5 +
 .../registry/client/ServiceInstanceCustomizer.java |    3 +-
 .../listener/ServiceInstancesChangedListener.java  |  145 +--
 .../metadata/MetadataServiceNameMapping.java       |   81 +-
 .../registry/client/metadata/MetadataUtils.java    |  104 +-
 .../metadata/ProtocolPortsMetadataCustomizer.java  |   33 +-
 .../ServiceInstanceHostPortCustomizer.java         |   27 +-
 .../ServiceInstanceMetadataCustomizer.java         |   60 +-
 .../metadata/ServiceInstanceMetadataUtils.java     |  114 +--
 .../SpringCloudMetadataServiceURLBuilder.java      |    3 +-
 .../StandardMetadataServiceURLBuilder.java         |   20 +-
 .../store/InMemoryWritableMetadataService.java     |  467 ---------
 .../client/metadata/store/MetaCacheManager.java    |  162 +++
 .../metadata/store/RemoteMetadataServiceImpl.java  |  170 ----
 .../client/migration/model/MigrationRule.java      |   10 +-
 .../selector/RandomServiceInstanceSelector.java    |   47 -
 .../client/selector/ServiceInstanceSelector.java   |   43 -
 .../dubbo/registry/support/AbstractRegistry.java   |    9 +-
 .../registry/support/AbstractRegistryFactory.java  |    4 +-
 ...g.apache.dubbo.metadata.WritableMetadataService |    1 -
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 -
 ...e.dubbo.registry.client.ServiceDiscoveryFactory |    2 +-
 ...dubbo.registry.client.ServiceInstanceCustomizer |    2 +-
 ...egistry.client.selector.ServiceInstanceSelector |    1 -
 .../registry/ListenerRegistryWrapperTest.java      |    3 +-
 .../dubbo/registry/SimpleRegistryFactory.java      |    1 +
 .../AbstractServiceDiscoveryFactoryTest.java       |    4 +
 .../client/FileSystemServiceDiscoveryTest.java     |   87 +-
 .../registry/client/InMemoryServiceDiscovery.java  |  110 ---
 .../registry/client/InstanceAddressURLTest.java    |    4 +-
 .../client/ServiceDiscoveryRegistryTest.java       |   34 +-
 .../registry/client/ServiceDiscoveryTest.java      |  484 +++++----
 .../ServiceInstancesChangedListenerTest.java       | 1032 ++++++++++----------
 .../metadata/MetadataServiceNameMappingTest.java   |   17 +-
 .../client/metadata/MetadataUtilsTest.java         |    1 +
 .../ProtocolPortsMetadataCustomizerTest.java       |   60 +-
 .../ServiceInstanceHostPortCustomizerTest.java     |   82 ++
 .../ServiceInstanceMetadataCustomizerTest.java     |  126 ---
 .../metadata/ServiceInstanceMetadataUtilsTest.java |  402 ++++----
 .../StandardMetadataServiceURLBuilderTest.java     |    3 +-
 .../store/InMemoryMetadataServiceTest.java         |  399 ++++----
 .../metadata/store/MetaCacheManagerTest.java       |  119 +++
 .../store/RemoteMetadataServiceImplTest.java       |  134 ---
 .../client/migration/MigrationInvokerTest.java     |    1 +
 .../client/migration/model/MigrationRuleTest.java  |    8 +-
 .../client/support/MockServiceDiscovery.java       |   15 +-
 .../support/MockServiceDiscoveryFactory.java       |    2 +-
 .../registry/integration/DynamicDirectoryTest.java |    3 +-
 .../support/AbstractRegistryFactoryTest.java       |    1 +
 .../registry/support/FailbackRegistryTest.java     |    1 +
 .../support/ServiceOrientedRegistryTest.java       |  199 ----
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    2 -
 .../src/test/resources/test-metadata.dubbo.cache   |    1 +
 dubbo-registry/dubbo-registry-dns/pom.xml          |   90 --
 .../org/apache/dubbo/registry/dns/DNSRegistry.java |   58 --
 .../dubbo/registry/dns/DNSRegistryFactory.java     |   34 -
 .../dubbo/registry/dns/DNSServiceDiscovery.java    |  153 ---
 .../registry/dns/DNSServiceDiscoveryFactory.java   |   28 -
 .../dubbo/registry/dns/util/DNSClientConst.java    |   47 -
 .../dubbo/registry/dns/util/DNSResolver.java       |  120 ---
 .../dubbo/registry/dns/util/ResolveResult.java     |   66 --
 .../org.apache.dubbo.registry.RegistryFactory      |    1 -
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 -
 ...e.dubbo.registry.client.ServiceDiscoveryFactory |    1 -
 .../registry/dns/DNSServiceDiscoveryTest.java      |  198 ----
 .../dubbo/registry/dns/util/DNSResolverTest.java   |   30 -
 .../src/test/resources/dubbo.properties            |    2 -
 dubbo-registry/dubbo-registry-kubernetes/pom.xml   |   73 --
 .../kubernetes/KubernetesMeshEnvListener.java      |  197 ----
 .../KubernetesMeshEnvListenerFactory.java          |   42 -
 .../registry/kubernetes/KubernetesRegistry.java    |   58 --
 .../kubernetes/KubernetesRegistryFactory.java      |   34 -
 .../kubernetes/KubernetesServiceDiscovery.java     |  399 --------
 .../KubernetesServiceDiscoveryFactory.java         |   28 -
 .../dubbo/registry/kubernetes/MeshConstant.java    |   43 -
 .../kubernetes/util/KubernetesClientConst.java     |   76 --
 .../kubernetes/util/KubernetesConfigUtils.java     |  113 ---
 .../org.apache.dubbo.registry.RegistryFactory      |    1 -
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 -
 ...e.dubbo.registry.client.ServiceDiscoveryFactory |    1 -
 ...luster.router.mesh.route.MeshEnvListenerFactory |    1 -
 .../kubernetes/KubernetesServiceDiscoveryTest.java |  198 ----
 .../org.mockito.plugins.MockMaker                  |    1 -
 .../registry/multicast/MulticastRegistry.java      |    5 +
 .../multicast/MulticastRegistryFactory.java        |    2 +-
 .../multicast/MulticastServiceDiscovery.java       |   16 +-
 .../MulticastServiceDiscoveryFactory.java          |    8 +-
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 -
 .../multicast/MulticastRegistryFactoryTest.java    |    1 +
 .../multiple/MultipleServiceDiscovery.java         |   77 +-
 .../multiple/MultipleServiceDiscoveryFactory.java  |    2 +-
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 -
 .../registry/nacos/NacosServiceDiscovery.java      |   19 +-
 .../nacos/NacosServiceDiscoveryFactory.java        |    5 +-
 .../nacos/util/NacosInstanceManageUtil.java        |    3 +-
 .../nacos/util/NacosNamingServiceUtils.java        |   13 +-
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 -
 .../nacos/NacosServiceDiscoveryFactoryTest.java    |    5 +
 .../registry/nacos/NacosServiceDiscoveryTest.java  |   21 +-
 .../nacos/util/NacosNamingServiceUtilsTest.java    |    3 +
 dubbo-registry/dubbo-registry-xds/pom.xml          |  115 ---
 .../dubbo/registry/xds/XdsCertificateSigner.java   |   52 -
 .../org/apache/dubbo/registry/xds/XdsRegistry.java |   58 --
 .../dubbo/registry/xds/XdsRegistryFactory.java     |   34 -
 .../dubbo/registry/xds/XdsServiceDiscovery.java    |   89 --
 .../registry/xds/XdsServiceDiscoveryFactory.java   |   38 -
 .../xds/istio/IstioCitadelCertificateSigner.java   |  249 -----
 .../dubbo/registry/xds/istio/IstioConstant.java    |   53 -
 .../apache/dubbo/registry/xds/istio/IstioEnv.java  |  121 ---
 .../dubbo/registry/xds/util/NodeBuilder.java       |   29 -
 .../dubbo/registry/xds/util/PilotExchanger.java    |  163 ----
 .../apache/dubbo/registry/xds/util/XdsChannel.java |   80 --
 .../xds/util/protocol/AbstractProtocol.java        |  242 -----
 .../registry/xds/util/protocol/DeltaResource.java  |   32 -
 .../registry/xds/util/protocol/XdsProtocol.java    |   48 -
 .../xds/util/protocol/delta/DeltaEndpoint.java     |   51 -
 .../xds/util/protocol/delta/DeltaListener.java     |   49 -
 .../xds/util/protocol/delta/DeltaRoute.java        |   47 -
 .../xds/util/protocol/impl/EdsProtocol.java        |   93 --
 .../xds/util/protocol/impl/LdsProtocol.java        |  106 --
 .../xds/util/protocol/impl/RdsProtocol.java        |   94 --
 .../xds/util/protocol/message/Endpoint.java        |   88 --
 .../xds/util/protocol/message/EndpointResult.java  |   62 --
 .../xds/util/protocol/message/ListenerResult.java  |   70 --
 .../xds/util/protocol/message/RouteResult.java     |   73 --
 .../dubbo-registry-xds/src/main/proto/ca.proto     |   57 --
 .../org.apache.dubbo.registry.RegistryFactory      |    1 -
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 -
 ...e.dubbo.registry.client.ServiceDiscoveryFactory |    1 -
 ....apache.dubbo.registry.xds.XdsCertificateSigner |    1 -
 .../zookeeper/ZookeeperRegistryFactory.java        |    2 -
 .../zookeeper/ZookeeperServiceDiscovery.java       |   92 +-
 .../ZookeeperServiceDiscoveryChangeWatcher.java    |    3 +-
 .../ZookeeperServiceDiscoveryFactory.java          |    2 +-
 .../zookeeper/util/CuratorFrameworkUtils.java      |    3 +-
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 -
 .../registry/zookeeper/ZookeeperRegistryTest.java  |    3 +-
 .../ZookeeperServiceDiscoveryFactoryTest.java      |   38 -
 .../zookeeper/ZookeeperServiceDiscoveryTest.java   |  135 +--
 .../zookeeper/util/CuratorFrameworkUtilsTest.java  |   11 +-
 dubbo-registry/pom.xml                             |    3 -
 .../org/apache/dubbo/remoting/api/Connection.java  |   17 +-
 .../dubbo/remoting/api/NettyEventLoopFactory.java  |    5 +-
 .../dubbo/remoting/api/PortUnificationServer.java  |   19 +-
 .../remoting/api/PortUnificationServerHandler.java |    3 +-
 .../dubbo/remoting/api/SslClientTlsHandler.java    |    7 +-
 .../org/apache/dubbo/remoting/api/SslContexts.java |   11 +-
 .../dubbo/remoting/api/SslServerTlsHandler.java    |    7 +-
 .../apache/dubbo/remoting/api/WireProtocol.java    |    5 +-
 .../ConnectionOrderedChannelHandler.java           |    2 +-
 .../dubbo/remoting/PerformanceServerTest.java      |    6 +-
 .../apache/dubbo/remoting/api/EmptyProtocol.java   |    3 +-
 .../MultiplexProtocolConnectionManagerTest.java    |    1 +
 .../remoting/api/PortUnificationServerTest.java    |    2 +-
 .../api/SingleProtocolConnectionManagerTest.java   |    1 +
 .../exchange/PortUnificationExchangerTest.java     |    1 +
 .../support/ExchangeHandlerDispatcherTest.java     |    1 +
 .../support/header/CloseTimerTaskTest.java         |    1 +
 .../support/header/HeaderExchangeServerTest.java   |    1 +
 .../support/header/ReconnectTimerTaskTest.java     |    1 +
 .../handler/ConnectChannelHandlerTest.java         |    1 +
 .../handler/WrappedChannelHandlerTest.java         |    1 +
 .../telnet/support/TelnetHandlerAdapterTest.java   |    1 +
 .../remoting/transport/AbstractCodecTest.java      |    3 +-
 .../transport/ChannelHandlerDispatcherTest.java    |    1 +
 .../dubbo/remoting/transport/CodecSupportTest.java |    1 +
 .../remoting/transport/DecodeHandlerTest.java      |    1 +
 .../transport/MultiMessageHandlerTest.java         |    1 +
 .../dispatcher/ChannelEventRunnableTest.java       |    1 +
 .../transport/dispatcher/ChannelHandlersTest.java  |    5 +-
 .../remoting/http/jetty/JettyLoggerAdapter.java    |    1 +
 .../http/jetty/JettyLoggerAdapterTest.java         |    2 +-
 .../remoting/transport/netty/ThreadNameTest.java   |    1 +
 .../remoting/transport/netty4/NettyClient.java     |   21 +-
 .../remoting/transport/netty4/NettyServer.java     |   19 +-
 .../transport/netty4/NettyChannelTest.java         |    5 +-
 .../transport/netty4/NettyClientHandlerTest.java   |    9 +-
 .../transport/netty4/NettyCodecAdapterTest.java    |    5 +-
 .../curator5/Curator5ZookeeperClient.java          |   19 +-
 .../curator5/Curator5ZookeeperTransporter.java     |    2 +-
 .../curator5/Curator5ZookeeperClientTest.java      |    3 +
 .../curator5/Curator5ZookeeperTransporterTest.java |    3 +-
 .../support/AbstractZookeeperTransporterTest.java  |    5 +-
 .../zookeeper/curator/CuratorZookeeperClient.java  |   19 +-
 .../curator/CuratorZookeeperTransporter.java       |    2 +-
 .../curator/CuratorZookeeperTransporterTest.java   |    1 +
 .../org/apache/dubbo/rpc/filter/GenericFilter.java |    7 +-
 .../dubbo/rpc/filter/tps/DefaultTPSLimiter.java    |    4 +-
 .../org/apache/dubbo/rpc/support/MockInvoker.java  |    3 +-
 .../dubbo/rpc/PenetrateAttachmentSelectorTest.java |    1 +
 .../java/org/apache/dubbo/rpc/RpcStatusTest.java   |    1 +
 .../dubbo/rpc/filter/AccessLogFilterTest.java      |    1 +
 .../apache/dubbo/rpc/filter/tps/StatItemTest.java  |    2 +-
 .../rpc/protocol/ProtocolListenerWrapperTest.java  |    1 +
 .../rpc/proxy/InvokerInvocationHandlerTest.java    |    1 +
 .../proxy/wrapper/StubProxyFactoryWrapperTest.java |    1 +
 .../apache/dubbo/rpc/support/MockInvokerTest.java  |    1 +
 .../org/apache/dubbo/rpc/support/RpcUtilsTest.java |    1 +
 .../dubbo/rpc/protocol/dubbo/DubboProtocol.java    |    6 +-
 .../protocol/dubbo/LazyConnectExchangeClient.java  |    9 +-
 .../dubbo/ReferenceCountExchangeClient.java        |   12 +-
 .../dubbo/DecodeableRpcInvocationTest.java         |    1 +
 .../protocol/dubbo/DecodeableRpcResultTest.java    |    1 +
 .../rpc/protocol/dubbo/DubboCountCodecTest.java    |    1 +
 .../dubbo/rpc/protocol/dubbo/MultiThreadTest.java  |    1 +
 .../dubbo/rpc/protocol/dubbo/RpcFilterTest.java    |    1 +
 .../dubbo/decode/DubboTelnetDecodeTest.java        |    7 +-
 .../rpc/protocol/dubbo/filter/TraceFilterTest.java |    1 +
 .../dubbo/status/ThreadPoolStatusCheckerTest.java  |    1 +
 .../dubbo/rpc/protocol/dubbo/support/EnumBak.java  |    1 +
 .../dubbo/rpc/protocol/grpc/GrpcOptionsUtils.java  |   19 +-
 .../dubbo/rpc/protocol/grpc/GrpcProtocol.java      |   13 +-
 .../dubbo/rpc/protocol/grpc/GrpcProtocolTest.java  |    5 +-
 .../protocol/grpc/support/DubboGreeterGrpc.java    |    2 +-
 .../rpc/protocol/rest/BaseRestProtocolServer.java  |    1 +
 .../dubbo/rpc/protocol/rest/RestProtocol.java      |    1 +
 .../rpc/protocol/rest/RpcExceptionMapperTest.java  |    1 +
 .../dubbo/rpc/protocol/tri/AbstractStreamTest.java |    5 +-
 .../dubbo/rpc/protocol/tri/ClientStreamTest.java   |   29 +-
 .../dubbo/rpc/protocol/tri/CompressorTest.java     |    1 +
 .../rpc/protocol/tri/GrpcDataDecoderTest.java      |    3 +-
 .../dubbo/rpc/protocol/tri/ServerStreamTest.java   |   29 +-
 .../rpc/protocol/tri/SingleProtobufUtilsTest.java  |    3 +-
 .../tri/TripleHttp2ClientResponseHandlerTest.java  |    7 +-
 .../rpc/protocol/tri/TriplePathResolverTest.java   |    1 +
 .../dubbo/rpc/protocol/tri/TripleProtocolTest.java |    6 +-
 .../dubbo/rpc/protocol/tri/WriteQueueTest.java     |    9 +-
 .../tri/service/TriBuiltinServiceTest.java         |    3 +-
 .../protocol/tri/service/TriHealthImplTest.java    |    5 +-
 .../serialize/hessian2/Hessian2ObjectInput.java    |    3 +-
 .../serialize/hessian2/Hessian2ObjectOutput.java   |    3 +-
 .../hessian2/dubbo/Hessian2FactoryInitializer.java |    3 +-
 .../DubboRelaxedBinding2AutoConfigurationTest.java |    2 +-
 .../endpoint/metadata/AbstractDubboMetadata.java   |    2 +-
 .../endpoint/metadata/DubboShutdownMetadata.java   |    1 +
 .../boot/actuate/health/DubboHealthIndicator.java  |    1 +
 .../boot/autoconfigure/DubboAutoConfiguration.java |    1 +
 .../config/ServiceBeanIdConflictProcessor.java     |    2 +-
 .../event/AwaitingNonWebApplicationListener.java   |    1 +
 .../CompatibleDubboAutoConfigurationTest.java      |    2 +-
 ...ubboAutoConfigurationTestWithoutProperties.java |    2 +-
 .../AwaitingNonWebApplicationListenerTest.java     |    1 +
 .../apache/dubbo/test/check/DubboTestChecker.java  |    3 +-
 .../dubbo/test/check/RegistryCenterFinished.java   |    1 +
 .../dubbo/test/check/RegistryCenterStarted.java    |    1 +
 .../context/ZookeeperWindowsContext.java           |    3 +-
 .../initializer/DownloadZookeeperInitializer.java  |    7 +-
 .../initializer/UnpackZookeeperInitializer.java    |    9 +-
 .../processor/FindPidWindowsProcessor.java         |    9 +-
 .../processor/KillProcessWindowsProcessor.java     |    9 +-
 .../processor/ResetZookeeperProcessor.java         |    7 +-
 .../processor/StartZookeeperWindowsProcessor.java  |    7 +-
 .../test/spring/SpringAnnotationBeanTest.java      |    1 +
 .../test/spring/SpringJavaConfigBeanTest.java      |    1 +
 .../dubbo/test/spring/SpringXmlConfigTest.java     |   11 +
 .../spring/context/MockSpringInitCustomizer.java   |    1 +
 .../{dubbo-demo.xml => dubbo-demo-provider.xml}    |   17 +-
 .../src/main/resources/spring/dubbo-demo.xml       |   10 -
 pom.xml                                            |    3 +-
 605 files changed, 5277 insertions(+), 10555 deletions(-)

diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/LogFilter.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/LogFilter.java
index d34c1b7..0007d65 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/LogFilter.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/LogFilter.java
@@ -18,9 +18,9 @@ package org.apache.dubbo.rpc.cluster.filter;
 
 import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.rpc.Filter;
-import org.apache.dubbo.rpc.Result;
-import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.Result;
 import org.apache.dubbo.rpc.RpcException;
 
 import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;
diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/merger/ResultMergerTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/merger/ResultMergerTest.java
index e49ac1f..ef921bb 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/merger/ResultMergerTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/merger/ResultMergerTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.rpc.cluster.merger;
 
 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;
diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/VirtualServiceRuleTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/VirtualServiceRuleTest.java
index de3383d..52647a3 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/VirtualServiceRuleTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mesh/rule/VirtualServiceRuleTest.java
@@ -20,14 +20,15 @@ package org.apache.dubbo.rpc.cluster.router.mesh.rule;
 import org.apache.dubbo.rpc.cluster.router.mesh.rule.virtualservice.DubboRoute;
 import org.apache.dubbo.rpc.cluster.router.mesh.rule.virtualservice.DubboRouteDetail;
 import org.apache.dubbo.rpc.cluster.router.mesh.rule.virtualservice.VirtualServiceRule;
+
 import org.junit.jupiter.api.Test;
 import org.yaml.snakeyaml.Yaml;
 
 import java.util.List;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertEquals;
 
 
 public class VirtualServiceRuleTest {
diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/BroadCastClusterInvokerTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/BroadCastClusterInvokerTest.java
index ea09d02..b25e94f 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/BroadCastClusterInvokerTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/BroadCastClusterInvokerTest.java
@@ -24,6 +24,7 @@ import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.RpcInvocation;
 import org.apache.dubbo.rpc.cluster.Directory;
 import org.apache.dubbo.rpc.cluster.filter.DemoService;
+
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ClusterUtilsTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ClusterUtilsTest.java
index c32707d..69fd0b5 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ClusterUtilsTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ClusterUtilsTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.rpc.cluster.support;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.URLBuilder;
 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;
diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ConnectivityValidationTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ConnectivityValidationTest.java
index 94f6579..41c96b5 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ConnectivityValidationTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ConnectivityValidationTest.java
@@ -41,8 +41,6 @@ import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ThreadLocalRandom;
 
 import static org.mockito.Mockito.when;
diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ForkingClusterInvokerTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ForkingClusterInvokerTest.java
index 17d6905..e00092d 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ForkingClusterInvokerTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/ForkingClusterInvokerTest.java
@@ -34,7 +34,6 @@ import java.util.List;
 import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.BDDMockito.given;
 import static org.mockito.Mockito.mock;
 
diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/merger/DefaultProviderURLMergeProcessorTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/merger/DefaultProviderURLMergeProcessorTest.java
index 8a5f43b..801b4cb 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/merger/DefaultProviderURLMergeProcessorTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/merger/DefaultProviderURLMergeProcessorTest.java
@@ -20,31 +20,32 @@ package org.apache.dubbo.rpc.cluster.support.merger;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.URLBuilder;
 import org.apache.dubbo.rpc.cluster.ProviderURLMergeProcessor;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import static org.apache.dubbo.common.constants.CommonConstants.ALIVE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.CORE_THREADS_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY_PREFIX;
 import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL;
 import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_VERSION_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.QUEUES_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.REFERENCE_FILTER_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.TAG_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.THREADPOOL_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.THREADS_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.THREAD_NAME_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
 
 public class DefaultProviderURLMergeProcessorTest {
 
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/cache/FileCacheStore.java b/dubbo-common/src/main/java/org/apache/dubbo/common/cache/FileCacheStore.java
new file mode 100644
index 0000000..bdf8467
--- /dev/null
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/cache/FileCacheStore.java
@@ -0,0 +1,238 @@
+/*
+ * 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.common.cache;
+
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.CollectionUtils;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.RandomAccessFile;
+import java.nio.channels.FileChannel;
+import java.nio.channels.FileLock;
+import java.nio.channels.OverlappingFileLockException;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Local file interaction class that can back different caches.
+ *
+ * All items in local file are of human friendly format.
+ */
+public class FileCacheStore {
+    private static final Logger logger = LoggerFactory.getLogger(FileCacheStore.class);
+
+    private static final int DEL = 0x7F;
+    private static final char ESCAPE = '%';
+    private static final Set<Character> ILLEGALS = new HashSet<Character>();
+    private static final String SUFFIX = ".dubbo.cache";
+
+    private String fileName;
+    private File basePath;
+    private File cacheFile;
+    private FileLock directoryLock;
+    private File lockFile;
+
+    public FileCacheStore(String basePath, String fileName) throws IOException, PathNotExclusiveException {
+        if (basePath == null) {
+            basePath = System.getProperty("user.home") + "/.dubbo/";
+        }
+        this.basePath = new File(basePath);
+        this.fileName = fileName;
+
+        this.cacheFile = getFile(fileName, SUFFIX);
+        if (cacheFile != null && !cacheFile.exists()) {
+            cacheFile.createNewFile();
+        }
+    }
+
+    public Map<String, String> loadCache(int entrySize) throws IOException {
+        Map<String, String> properties = new HashMap<>();
+        try (BufferedReader reader = new BufferedReader(new FileReader(cacheFile))) {
+            int count = 1;
+            String line = reader.readLine();
+            while (line != null && count <= entrySize) {
+                // content has '=' need to be encoded before write
+                if (!line.equals("") && !line.startsWith("#") && line.contains("=")) {
+                    String[] pairs = line.split("=");
+                    properties.put(pairs[0], pairs[1]);
+                    count++;
+                }
+                line = reader.readLine();
+            }
+
+            if (count > entrySize) {
+                logger.warn("Cache file was truncated for exceeding the maximum entry size " + entrySize);
+            }
+        } catch (IOException e) {
+            logger.warn("Load cache failed ", e);
+            throw e;
+        }
+        return properties;
+    }
+
+    public File getFile(String cacheName, String suffix) throws PathNotExclusiveException {
+        cacheName = safeName(cacheName);
+        if (!cacheName.endsWith(suffix)) {
+            cacheName = cacheName + suffix;
+        }
+        return getFile(cacheName);
+    }
+
+    /**
+     * Get a file object for the given name
+     *
+     * @param name the file name
+     * @return a file object
+     */
+    public File getFile(String name) throws PathNotExclusiveException {
+        synchronized (this) {
+            File candidate = basePath;
+            // ensure cache store path exists
+            if (!candidate.isDirectory() && !candidate.mkdirs()) {
+                throw new RuntimeException("Cache store path can't be created: " + candidate);
+            }
+
+            try {
+                tryFileLock(name);
+            } catch (PathNotExclusiveException e) {
+                logger.warn("Path '" + basePath
+                    + "' is already used by an existing Dubbo process.\n"
+                    + "Please specify another one explicitly.");
+                throw e;
+            }
+        }
+
+        File file = new File(basePath, name);
+        for (File parent = file.getParentFile(); parent != null; parent = parent.getParentFile()) {
+            if (basePath.equals(parent)) {
+                return file;
+            }
+        }
+
+        throw new IllegalArgumentException("Attempted to access file outside the dubbo cache path");
+    }
+
+    /**
+     * sanitize a name for valid file or directory name
+     *
+     * @param name
+     * @return sanitized version of name
+     */
+    private static String safeName(String name) {
+        int len = name.length();
+        StringBuilder sb = new StringBuilder(len);
+        for (int i = 0; i < len; i++) {
+            char c = name.charAt(i);
+            if (c <= ' ' || c >= DEL || (c >= 'A' && c <= 'Z') || ILLEGALS.contains(c) || c == ESCAPE) {
+                sb.append(ESCAPE);
+                sb.append(String.format("%04x", (int) c));
+            } else {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+    private void tryFileLock(String fileName) throws PathNotExclusiveException {
+        lockFile = new File(basePath.getAbsoluteFile(), fileName + ".lock");
+        lockFile.deleteOnExit();
+
+        FileLock dirLock;
+        try {
+            lockFile.createNewFile();
+            if (!lockFile.exists()) {
+                throw new AssertionError("Failed to create lock file " + lockFile);
+            }
+            FileChannel lockFileChannel = new RandomAccessFile(lockFile, "rw").getChannel();
+            dirLock = lockFileChannel.tryLock();
+        } catch (OverlappingFileLockException ofle) {
+            dirLock = null;
+        } catch (IOException ioe) {
+            throw new RuntimeException(ioe);
+        }
+
+        if (dirLock == null) {
+            throw new PathNotExclusiveException(basePath.getAbsolutePath() + "/" + fileName + " is not exclusive.");
+        }
+
+        this.directoryLock = dirLock;
+    }
+
+    private void unlock() {
+        if (directoryLock != null && directoryLock.isValid()) {
+            try {
+                directoryLock.release();
+                directoryLock.channel().close();
+                deleteFile(lockFile);
+            } catch (IOException e) {
+                throw new RuntimeException("Failed to release cache path's lock file:" + lockFile, e);
+            }
+        }
+    }
+
+    public void refreshCache(Map<String, String> properties, String comment) {
+        if (CollectionUtils.isEmptyMap(properties)) {
+            return;
+        }
+
+        try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(cacheFile, false), StandardCharsets.UTF_8))) {
+            bw.write("#" + comment);
+            bw.write("#" + new Date().toString());
+            bw.newLine();
+            for (Map.Entry<String, String> e : properties.entrySet()) {
+                String key = e.getKey();
+                String val = e.getValue();
+                bw.write(key + "=" + val);
+                bw.newLine();
+            }
+            bw.flush();
+        } catch (IOException e) {
+            logger.warn("Update cache error.");
+        }
+    }
+
+    private static void deleteFile(File f) {
+        if (!f.delete()) {
+            logger.debug("Failed to delete file " + f.getAbsolutePath());
+        }
+    }
+
+    private static class PathNotExclusiveException extends Exception {
+        public PathNotExclusiveException() {
+            super();
+        }
+
+        public PathNotExclusiveException(String msg) {
+            super(msg);
+        }
+    }
+
+    public void destroy() {
+        unlock();
+    }
+}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
index a1e5e0e..34e7754 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
@@ -47,7 +47,7 @@ public class CompositeConfiguration implements Configuration {
         }
     }
 
-    //FIXME, consider change configList to SortedMap to replace this boolean status.
+    //FIXME, consider changing configList to SortedMap to replace this boolean status.
     public boolean isDynamicIncluded() {
         return dynamicIncluded;
     }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
index d0c2f23..acbbf36 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
@@ -164,7 +164,7 @@ public class ConfigurationUtils {
     public static Map<String, String> parseProperties(String content) throws IOException {
         Map<String, String> map = new HashMap<>();
         if (StringUtils.isEmpty(content)) {
-            logger.warn("You specified the config center, but there's not even one single config item in it.");
+            logger.warn("Config center was specified, but no config item found.");
         } else {
             Properties properties = new Properties();
             properties.load(new StringReader(content));
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java
index fa7467c..815e714 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java
@@ -16,9 +16,6 @@
  */
 package org.apache.dubbo.common.config.configcenter.file;
 
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
 import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;
@@ -33,6 +30,10 @@ import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.model.ScopeModel;
 import org.apache.dubbo.rpc.model.ScopeModelUtil;
 
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.FileSystem;
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
index a2e8dea..a345ad4 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
@@ -97,7 +97,7 @@ public class CompositeDynamicConfiguration implements DynamicConfiguration {
             try {
                 configuration.close();
             } catch (Exception e) {
-                logger.warn("close dynamic configuration failed: " + e.getMessage(), e);
+                logger.warn("close dynamic configuration " + configuration.getClass().getName() + "failed: " + e.getMessage(), e);
             }
         }
         configurations.clear();
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
index bb3833b..661a9aa 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
@@ -217,10 +217,6 @@ public interface CommonConstants {
 
     String METADATA_KEY = "metadata-type";
 
-    String CONFIG_MAPPING_TYPE = "config";
-
-    String METADATA_MAPPING_TYPE = "metadata";
-
     String DEFAULT_METADATA_STORAGE_TYPE = "local";
 
     String REMOTE_METADATA_STORAGE_TYPE = "remote";
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java
index d8061cb..8f5a612 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java
@@ -96,11 +96,7 @@ public interface RegistryConstants {
     String SERVICE_REGISTRY_PROTOCOL = "service-discovery-registry";
 
     /**
-     * The parameter key of the subscribed service names for Service-Oriented Registry
-     * <p>
-     * If there is a multiple-values, the  "comma" is the separator.
-     *
-     * @since 2.7.5
+     * Specify registry level services consumer needs to subscribe to, multiple values should be separated using ",".
      */
     String SUBSCRIBED_SERVICE_NAMES_KEY = "subscribed-services";
 
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/AbstractDeployer.java b/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/AbstractDeployer.java
index ba53201..704f0ea 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/AbstractDeployer.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/AbstractDeployer.java
@@ -41,7 +41,7 @@ public abstract class AbstractDeployer<E extends ScopeModel> implements Deployer
 
     protected AtomicBoolean initialized = new AtomicBoolean(false);
 
-    private List<DeployListener<E>> listeners = new ArrayList<>();
+    protected List<DeployListener<E>> listeners = new ArrayList<>();
 
     private E scopeModel;
 
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/ApplicationDeployListener.java b/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/ApplicationDeployListener.java
index 17fc82c..674ca90 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/ApplicationDeployListener.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/ApplicationDeployListener.java
@@ -25,5 +25,7 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
  */
 @SPI(scope = ExtensionScope.APPLICATION)
 public interface ApplicationDeployListener extends DeployListener<ApplicationModel> {
+    default void onModuleStarted(ApplicationModel applicationModel) {
 
+    }
 }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/ApplicationDeployer.java b/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/ApplicationDeployer.java
index e882434..611f47c 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/ApplicationDeployer.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/ApplicationDeployer.java
@@ -51,6 +51,11 @@ public interface ApplicationDeployer extends Deployer<ApplicationModel> {
     void prepareApplicationInstance();
 
     /**
+     * Register application instance and start internal services
+     */
+    void prepareInternalModule();
+
+    /**
      * Pre-processing before destroy model
      */
     void preDestroy();
@@ -77,7 +82,7 @@ public interface ApplicationDeployer extends Deployer<ApplicationModel> {
     /**
      * check all module state and update application state
      */
-    void checkState();
+    void checkState(ModuleModel moduleModel, DeployState moduleState);
 
     /**
      * module state changed callbacks
diff --git a/dubbo-registry/dubbo-registry-xds/src/main/java/org/apache/dubbo/registry/xds/XdsEnv.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/JsonUtils.java
similarity index 79%
rename from dubbo-registry/dubbo-registry-xds/src/main/java/org/apache/dubbo/registry/xds/XdsEnv.java
rename to dubbo-common/src/main/java/org/apache/dubbo/common/utils/JsonUtils.java
index e0fa40c..7548580 100644
--- a/dubbo-registry/dubbo-registry-xds/src/main/java/org/apache/dubbo/registry/xds/XdsEnv.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/JsonUtils.java
@@ -14,8 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.registry.xds;
+package org.apache.dubbo.common.utils;
 
-public interface XdsEnv {
-    String getCluster();
+import com.google.gson.Gson;
+
+public class JsonUtils {
+    private static final Gson gson = new Gson();
+
+    public static Gson getGson() {
+        return gson;
+    }
 }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRU2Cache.java
similarity index 95%
copy from dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java
copy to dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRU2Cache.java
index 6b39890..b64a2d2 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRU2Cache.java
@@ -25,8 +25,10 @@ import java.util.concurrent.locks.ReentrantLock;
  * </p>
  * When the data accessed for the first time, add it to history list. If the size of history list reaches max capacity, eliminate the earliest data (first in first out).
  * When the data already exists in the history list, and be accessed for the second time, then it will be put into cache.
+ *
+ * TODO, consider replacing with ConcurrentHashMap to improve performance under concurrency
  */
-public class LRUCache<K, V> extends LinkedHashMap<K, V> {
+public class LRU2Cache<K, V> extends LinkedHashMap<K, V> {
 
     private static final long serialVersionUID = -5167631809472116969L;
 
@@ -39,11 +41,11 @@ public class LRUCache<K, V> extends LinkedHashMap<K, V> {
     // as history list
     private PreCache<K, Boolean> preCache;
 
-    public LRUCache() {
+    public LRU2Cache() {
         this(DEFAULT_MAX_CAPACITY);
     }
 
-    public LRUCache(int maxCapacity) {
+    public LRU2Cache(int maxCapacity) {
         super(16, DEFAULT_LOAD_FACTOR, true);
         this.maxCapacity = maxCapacity;
         this.preCache = new PreCache<>(maxCapacity);
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java
index 6b39890..90e905a 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/LRUCache.java
@@ -20,12 +20,6 @@ import java.util.LinkedHashMap;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
-/**
- * LRU-2
- * </p>
- * When the data accessed for the first time, add it to history list. If the size of history list reaches max capacity, eliminate the earliest data (first in first out).
- * When the data already exists in the history list, and be accessed for the second time, then it will be put into cache.
- */
 public class LRUCache<K, V> extends LinkedHashMap<K, V> {
 
     private static final long serialVersionUID = -5167631809472116969L;
@@ -36,9 +30,6 @@ public class LRUCache<K, V> extends LinkedHashMap<K, V> {
     private final Lock lock = new ReentrantLock();
     private volatile int maxCapacity;
 
-    // as history list
-    private PreCache<K, Boolean> preCache;
-
     public LRUCache() {
         this(DEFAULT_MAX_CAPACITY);
     }
@@ -46,7 +37,6 @@ public class LRUCache<K, V> extends LinkedHashMap<K, V> {
     public LRUCache(int maxCapacity) {
         super(16, DEFAULT_LOAD_FACTOR, true);
         this.maxCapacity = maxCapacity;
-        this.preCache = new PreCache<>(maxCapacity);
     }
 
     @Override
@@ -78,15 +68,7 @@ public class LRUCache<K, V> extends LinkedHashMap<K, V> {
     public V put(K key, V value) {
         lock.lock();
         try {
-            if (preCache.containsKey(key)) {
-                // add it to cache
-                preCache.remove(key);
-                return super.put(key, value);
-            } else {
-                // add it to history list
-                preCache.put(key, true);
-                return value;
-            }
+            return super.put(key, value);
         } finally {
             lock.unlock();
         }
@@ -96,7 +78,6 @@ public class LRUCache<K, V> extends LinkedHashMap<K, V> {
     public V remove(Object key) {
         lock.lock();
         try {
-            preCache.remove(key);
             return super.remove(key);
         } finally {
             lock.unlock();
@@ -117,43 +98,26 @@ public class LRUCache<K, V> extends LinkedHashMap<K, V> {
     public void clear() {
         lock.lock();
         try {
-            preCache.clear();
             super.clear();
         } finally {
             lock.unlock();
         }
     }
 
+    public void lock() {
+        lock.lock();
+    }
+
+    public void releaseLock() {
+        lock.unlock();
+    }
+
     public int getMaxCapacity() {
         return maxCapacity;
     }
 
     public void setMaxCapacity(int maxCapacity) {
-        preCache.setMaxCapacity(maxCapacity);
         this.maxCapacity = maxCapacity;
     }
 
-    static class PreCache<K, V> extends LinkedHashMap<K, V> {
-
-        private volatile int maxCapacity;
-
-        public PreCache() {
-            this(DEFAULT_MAX_CAPACITY);
-        }
-
-        public PreCache(int maxCapacity) {
-            super(16, DEFAULT_LOAD_FACTOR, true);
-            this.maxCapacity = maxCapacity;
-        }
-
-        @Override
-        protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
-            return size() > maxCapacity;
-        }
-
-        public void setMaxCapacity(int maxCapacity) {
-            this.maxCapacity = maxCapacity;
-        }
-    }
-
 }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/TypeUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/TypeUtils.java
index 3b2733f..0555602 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/TypeUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/TypeUtils.java
@@ -18,10 +18,10 @@ package org.apache.dubbo.common.utils;
 
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedList;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/MethodDefinitionBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/MethodDefinitionBuilder.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/MethodDefinitionBuilder.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/MethodDefinitionBuilder.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilder.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilder.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilder.java
index db09b76..cfdec72 100755
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilder.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilder.java
@@ -16,14 +16,6 @@
  */
 package org.apache.dubbo.metadata.definition;
 
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
 import org.apache.dubbo.metadata.definition.model.MethodDefinition;
 import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
@@ -32,6 +24,14 @@ import org.apache.dubbo.metadata.definition.util.ClassUtils;
 
 import com.google.gson.Gson;
 
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
 /**
  * 2015/1/27.
  */
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java
similarity index 90%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java
index b2758e3..d3029b0 100755
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java
@@ -16,13 +16,13 @@
  */
 package org.apache.dubbo.metadata.definition;
 
-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.common.utils.ClassUtils;
 import org.apache.dubbo.metadata.definition.builder.DefaultTypeBuilder;
 import org.apache.dubbo.metadata.definition.builder.TypeBuilder;
 import org.apache.dubbo.metadata.definition.model.TypeDefinition;
+import org.apache.dubbo.rpc.model.FrameworkModel;
 
 import java.lang.reflect.Type;
 import java.util.ArrayList;
@@ -37,11 +37,10 @@ import java.util.Set;
  */
 public class TypeDefinitionBuilder {
     private static final Logger logger = LoggerFactory.getLogger(TypeDefinitionBuilder.class);
-    static final List<TypeBuilder> BUILDERS;
+    public static List<TypeBuilder> BUILDERS;
 
-    static {
-        ExtensionLoader<TypeBuilder> extensionLoader = ExtensionLoader.getExtensionLoader(TypeBuilder.class);
-        Set<TypeBuilder> tbs = extensionLoader.getSupportedExtensionInstances();
+    public static void initBuilders(FrameworkModel model) {
+        Set<TypeBuilder> tbs = model.getExtensionLoader(TypeBuilder.class).getSupportedExtensionInstances();
         BUILDERS = new ArrayList<>(tbs);
     }
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/ArrayTypeBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/ArrayTypeBuilder.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/ArrayTypeBuilder.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/ArrayTypeBuilder.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/CollectionTypeBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/CollectionTypeBuilder.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/CollectionTypeBuilder.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/CollectionTypeBuilder.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/DefaultTypeBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/DefaultTypeBuilder.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/DefaultTypeBuilder.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/DefaultTypeBuilder.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/EnumTypeBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/EnumTypeBuilder.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/EnumTypeBuilder.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/EnumTypeBuilder.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/MapTypeBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/MapTypeBuilder.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/MapTypeBuilder.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/MapTypeBuilder.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java
similarity index 93%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java
index 050de3c..8a8f830 100755
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.metadata.definition.builder;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 import org.apache.dubbo.common.lang.Prioritized;
 import org.apache.dubbo.metadata.definition.model.TypeDefinition;
@@ -26,7 +27,7 @@ import java.util.Map;
 /**
  * 2015/1/27.
  */
-@SPI
+@SPI(scope = ExtensionScope.FRAMEWORK)
 public interface TypeBuilder extends Prioritized {
 
     /**
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java
index 40ced04..a16eb6a 100755
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java
@@ -16,14 +16,14 @@
  */
 package org.apache.dubbo.metadata.definition.model;
 
+import org.apache.dubbo.metadata.definition.util.ClassUtils;
+
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 
-import org.apache.dubbo.metadata.definition.util.ClassUtils;
-
 /**
  * 2015/1/27.
  */
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/TypeDefinition.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/model/TypeDefinition.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/TypeDefinition.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/model/TypeDefinition.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/util/ClassUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/util/ClassUtils.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/util/ClassUtils.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/util/ClassUtils.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/util/JaketConfigurationUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/util/JaketConfigurationUtils.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/util/JaketConfigurationUtils.java
rename to dubbo-common/src/main/java/org/apache/dubbo/metadata/definition/util/JaketConfigurationUtils.java
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
index f66873a..168df38 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.resource.GlobalResourcesRepository;
 import org.apache.dubbo.common.utils.Assert;
 import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.metadata.definition.TypeDefinitionBuilder;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -81,6 +82,9 @@ public class FrameworkModel extends ScopeModel {
     @Override
     protected void initialize() {
         super.initialize();
+
+        TypeDefinitionBuilder.initBuilders(this);
+
         serviceRepository = new FrameworkServiceRepository(this);
 
         ExtensionLoader<ScopeModelInitializer> initializerExtensionLoader = this.getExtensionLoader(ScopeModelInitializer.class);
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
index c8afc13..54a27c7 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
@@ -67,6 +67,7 @@ public class ModuleModel extends ScopeModel {
         if (applicationDeployer != null) {
             applicationDeployer.notifyModuleChanged(this, DeployState.PENDING);
         }
+        this.internalModule = isInternal;
     }
 
     @Override
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleServiceRepository.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleServiceRepository.java
index b16a669..4815b30 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleServiceRepository.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleServiceRepository.java
@@ -188,6 +188,15 @@ public class ModuleServiceRepository {
         return Collections.unmodifiableList(serviceDescriptors);
     }
 
+    public ServiceDescriptor getService(String serviceName) {
+        // TODO, may need to distinguish service by class loader.
+        List<ServiceDescriptor> serviceDescriptors = services.get(serviceName);
+        if (CollectionUtils.isEmpty(serviceDescriptors)) {
+            return null;
+        }
+        return serviceDescriptors.get(0);
+    }
+
     public ServiceDescriptor lookupService(String interfaceName) {
         if (services.containsKey(interfaceName)) {
             List<ServiceDescriptor> serviceDescriptors = services.get(interfaceName);
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
index dd4becb..1eb9772 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
@@ -72,6 +72,7 @@ public abstract class ScopeModel implements ExtensionAccessor {
 
     private Map<String, Object> attributes;
     private final AtomicBoolean destroyed = new AtomicBoolean(false);
+    protected boolean internalModule;
 
     public ScopeModel(ScopeModel parent, ExtensionScope scope) {
         this.parent = parent;
@@ -227,6 +228,10 @@ public abstract class ScopeModel implements ExtensionAccessor {
         this.desc = buildDesc();
     }
 
+    public boolean isInternal() {
+        return internalModule;
+    }
+
     /**
      * @return the describe string of this scope model
      */
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceDescriptor.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceDescriptor.java
index c063ec5..b3ac2f4 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceDescriptor.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceDescriptor.java
@@ -17,16 +17,21 @@
 package org.apache.dubbo.rpc.model;
 
 import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;
+import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.ConcurrentNavigableMap;
+import java.util.concurrent.ConcurrentSkipListMap;
 
 /**
  * ServiceModel and ServiceMetadata are to some extend duplicated with each other. We should merge them in the future.
@@ -37,11 +42,18 @@ public class ServiceDescriptor {
     // to accelerate search
     private final Map<String, List<MethodDescriptor>> methods = new HashMap<>();
     private final Map<String, Map<String, MethodDescriptor>> descToMethods = new HashMap<>();
+    private ConcurrentNavigableMap<String, FullServiceDefinition> serviceDefinitions = new ConcurrentSkipListMap<>();
 
     public ServiceDescriptor(Class<?> interfaceClass) {
         this.serviceInterfaceClass = interfaceClass;
         this.serviceName = interfaceClass.getName();
         initMethods();
+        initServiceDefinition(interfaceClass);
+    }
+
+    private void initServiceDefinition(Class<?> interfaceClass) {
+        FullServiceDefinition fullServiceDefinition = ServiceDefinitionBuilder.buildFullDefinition(interfaceClass, Collections.emptyMap());
+        serviceDefinitions.put(serviceName, fullServiceDefinition);
     }
 
     private void initMethods() {
@@ -116,6 +128,14 @@ public class ServiceDescriptor {
         return methods.get(methodName);
     }
 
+    public ConcurrentNavigableMap<String, FullServiceDefinition> getServiceDefinitions() {
+        return serviceDefinitions;
+    }
+
+    public FullServiceDefinition getServiceDefinition(String serviceName) {
+        return serviceDefinitions.get(serviceName);
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder b/dubbo-common/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder
rename to dubbo-common/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/CommonScopeModelInitializerTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/CommonScopeModelInitializerTest.java
index 3062c58..d7794f5 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/CommonScopeModelInitializerTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/CommonScopeModelInitializerTest.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.common.status.reporter.FrameworkStatusReportService;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java
index 7abdda6..e083969 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common;
 
 import org.apache.dubbo.common.utils.NetUtils;
+
 import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/beans/InstantiationStrategyTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/beans/InstantiationStrategyTest.java
index 80bdcf3..c54fe38 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/beans/InstantiationStrategyTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/beans/InstantiationStrategyTest.java
@@ -27,6 +27,7 @@ import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ScopeModel;
 import org.apache.dubbo.rpc.model.ScopeModelAccessor;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/beans/ScopeBeanFactoryTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/beans/ScopeBeanFactoryTest.java
index 3f95fa8..8a5fa08 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/beans/ScopeBeanFactoryTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/beans/ScopeBeanFactoryTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.beans.model.FooBeanWithApplicationModel;
 import org.apache.dubbo.common.beans.model.FooBeanWithFrameworkModel;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/cache/FileCacheStoreTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/cache/FileCacheStoreTest.java
new file mode 100644
index 0000000..e9cc973
--- /dev/null
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/cache/FileCacheStoreTest.java
@@ -0,0 +1,62 @@
+/*
+ * 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.common.cache;
+
+import org.junit.jupiter.api.Test;
+
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class FileCacheStoreTest {
+    FileCacheStore cacheStore;
+
+    @Test
+    public void testCache() throws Exception {
+        String directoryPath = getDirectoryOfClassPath();
+        String filePath = "test-cache.dubbo.cache";
+        cacheStore = new FileCacheStore(directoryPath, filePath);
+        Map<String, String> properties = cacheStore.loadCache(10);
+        assertEquals(2, properties.size());
+
+        Map<String, String> newProperties = new HashMap<>();
+        newProperties.put("newKey1", "newValue1");
+        newProperties.put("newKey2", "newValue2");
+        newProperties.put("newKey3", "newValue3");
+        newProperties.put("newKey4", "newValue4");
+        cacheStore = new FileCacheStore(directoryPath, "non-exit.dubbo.cache");
+        cacheStore.refreshCache(newProperties, "test refresh cache");
+        Map<String, String> propertiesLimitTo2 = cacheStore.loadCache(2);
+        assertEquals(2, propertiesLimitTo2.size());
+
+        Map<String, String> propertiesLimitTo10 = cacheStore.loadCache(10);
+        assertEquals(4, propertiesLimitTo10.size());
+    }
+
+    private String getDirectoryOfClassPath() throws URISyntaxException {
+        URL resource = this.getClass().getResource("/log4j.xml");
+        String path = Paths.get(resource.toURI()).toFile().getAbsolutePath();
+        int index = path.indexOf("log4j.xml");
+        String directoryPath = path.substring(0, index);
+        return directoryPath;
+    }
+
+}
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/concurrent/CompletableFutureTaskTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/concurrent/CompletableFutureTaskTest.java
index cf2b709..58317dd 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/concurrent/CompletableFutureTaskTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/concurrent/CompletableFutureTaskTest.java
@@ -16,12 +16,9 @@
  */
 package org.apache.dubbo.common.concurrent;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.times;
+import org.apache.dubbo.common.utils.NamedThreadFactory;
+
+import org.junit.jupiter.api.Test;
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CountDownLatch;
@@ -32,8 +29,12 @@ import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.dubbo.common.utils.NamedThreadFactory;
-import org.junit.jupiter.api.Test;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
 
 public class CompletableFutureTaskTest {
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentTest.java
index 699edef..cf2235e 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentTest.java
@@ -20,8 +20,8 @@ import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
 import org.apache.dubbo.common.config.configcenter.wrapper.CompositeDynamicConfiguration;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.rpc.model.ApplicationModel;
-
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/config/PropertiesConfigurationTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/config/PropertiesConfigurationTest.java
index 55afe86..d301f58 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/config/PropertiesConfigurationTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/config/PropertiesConfigurationTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.config;
 
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationFactoryTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationFactoryTest.java
index 7af1663..32430a8 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationFactoryTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationFactoryTest.java
@@ -17,8 +17,8 @@
 package org.apache.dubbo.common.config.configcenter.file;
 
 import org.apache.dubbo.common.config.ConfigurationUtils;
-
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationTest.java
index 4d3caea..e7ecd4f 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationTest.java
@@ -16,10 +16,11 @@
  */
 package org.apache.dubbo.common.config.configcenter.file;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+
+import org.apache.commons.io.FileUtils;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionDirectorTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionDirectorTest.java
index 372c3f5..0ef945d 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionDirectorTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionDirectorTest.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.common.extension.director.impl.TestModuleService;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java
index e262bc1..cf59887 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java
@@ -64,6 +64,7 @@ import org.apache.dubbo.common.extension.wrapper.impl.DemoImpl;
 import org.apache.dubbo.common.lang.Prioritized;
 import org.apache.dubbo.common.url.component.ServiceConfigURL;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/activate/impl/OldActivateExt1Impl2.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/activate/impl/OldActivateExt1Impl2.java
index c4aa3c1..0e1eda3 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/activate/impl/OldActivateExt1Impl2.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/activate/impl/OldActivateExt1Impl2.java
@@ -16,9 +16,10 @@
  */
 package org.apache.dubbo.common.extension.activate.impl;
 
-import com.alibaba.dubbo.common.extension.Activate;
 import org.apache.dubbo.common.extension.activate.ActivateExt1;
 
+import com.alibaba.dubbo.common.extension.Activate;
+
 @Activate(group = "old_group")
 public class OldActivateExt1Impl2 implements ActivateExt1 {
     public String echo(String msg) {
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/activate/impl/OldActivateExt1Impl3.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/activate/impl/OldActivateExt1Impl3.java
index 497db35..3f42f40 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/activate/impl/OldActivateExt1Impl3.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/activate/impl/OldActivateExt1Impl3.java
@@ -16,9 +16,10 @@
  */
 package org.apache.dubbo.common.extension.activate.impl;
 
-import com.alibaba.dubbo.common.extension.Activate;
 import org.apache.dubbo.common.extension.activate.ActivateExt1;
 
+import com.alibaba.dubbo.common.extension.Activate;
+
 @Activate(group = "old_group")
 public class OldActivateExt1Impl3 implements ActivateExt1 {
     public String echo(String msg) {
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjectorTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjectorTest.java
index cf40f50..9057b2f 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjectorTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjectorTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.common.extension.ExtensionInjector;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.common.extension.director.FooFrameworkProvider;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/support/ActivateComparatorTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/support/ActivateComparatorTest.java
index c6baf04..29d8b1c 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/support/ActivateComparatorTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/support/ActivateComparatorTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.extension.support;
 
 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;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/lang/ShutdownHookCallbacksTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/lang/ShutdownHookCallbacksTest.java
index 6d0e7a4..faedb76 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/lang/ShutdownHookCallbacksTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/lang/ShutdownHookCallbacksTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.lang;
 
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/logger/LoggerFactoryTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/logger/LoggerFactoryTest.java
index 685569c..c83765f 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/logger/LoggerFactoryTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/logger/LoggerFactoryTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.logger;
 
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.Test;
 
 import java.io.File;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/status/StatusTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/status/StatusTest.java
index 41cad69..02a4c4e 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/status/StatusTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/status/StatusTest.java
@@ -20,10 +20,10 @@ package org.apache.dubbo.common.status;
 import org.junit.jupiter.api.Test;
 
 import static org.apache.dubbo.common.status.Status.Level.OK;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.isEmptyOrNullString;
-import static org.hamcrest.MatcherAssert.assertThat;
 
 public class StatusTest {
     @Test
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReportServiceTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReportServiceTest.java
index a308ba3..12696da 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReportServiceTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReportServiceTest.java
@@ -16,11 +16,12 @@
  */
 package org.apache.dubbo.common.status.reporter;
 
-import com.google.gson.Gson;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
+import com.google.gson.Gson;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/LoadStatusCheckerTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/LoadStatusCheckerTest.java
index baafdca..3361ee3 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/LoadStatusCheckerTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/LoadStatusCheckerTest.java
@@ -20,10 +20,11 @@ package org.apache.dubbo.common.status.support;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.status.Status;
+
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.Matchers.notNullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
 
 public class LoadStatusCheckerTest {
     private static Logger logger = LoggerFactory.getLogger(LoadStatusCheckerTest.class);
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/MemoryStatusCheckerTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/MemoryStatusCheckerTest.java
index 94e3b1d..e04b8d7 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/MemoryStatusCheckerTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/MemoryStatusCheckerTest.java
@@ -20,13 +20,14 @@ package org.apache.dubbo.common.status.support;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.status.Status;
+
 import org.junit.jupiter.api.Test;
 
 import static org.apache.dubbo.common.status.Status.Level.OK;
 import static org.apache.dubbo.common.status.Status.Level.WARN;
 import static org.hamcrest.CoreMatchers.anyOf;
-import static org.hamcrest.Matchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
 
 public class MemoryStatusCheckerTest {
     private static final Logger logger = LoggerFactory.getLogger(MemoryStatusCheckerTest.class);
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/StatusUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/StatusUtilsTest.java
index 90b9400..9d6d059 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/StatusUtilsTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/status/support/StatusUtilsTest.java
@@ -18,16 +18,17 @@
 package org.apache.dubbo.common.status.support;
 
 import org.apache.dubbo.common.status.Status;
+
 import org.junit.jupiter.api.Test;
 
 import java.util.HashMap;
 import java.util.Map;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.isEmptyOrNullString;
 import static org.hamcrest.Matchers.not;
-import static org.hamcrest.MatcherAssert.assertThat;
 
 public class StatusUtilsTest {
     @Test
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/threadpool/manager/ExecutorRepositoryTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/threadpool/manager/ExecutorRepositoryTest.java
index 33ab9fb..98d6cea 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/threadpool/manager/ExecutorRepositoryTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/threadpool/manager/ExecutorRepositoryTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.common.threadpool.manager;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoaderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoaderTest.java
index 10331e8..4592103 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoaderTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ClassLoaderResourceLoaderTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.common.utils;
 import org.apache.dubbo.common.extension.DubboInternalLoadingStrategy;
 import org.apache.dubbo.common.extension.director.FooAppProvider;
 import org.apache.dubbo.common.resource.GlobalResourcesRepository;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java
index b042167..787b837 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ConfigUtilsTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.config.InmemoryConfiguration;
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.threadpool.ThreadPool;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/HolderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/HolderTest.java
index 0534712..0735ad3 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/HolderTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/HolderTest.java
@@ -19,8 +19,8 @@ package org.apache.dubbo.common.utils;
 
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.Matchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
 
 public class HolderTest {
     @Test
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LRUCacheTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LRU2CacheTest.java
similarity index 93%
rename from dubbo-common/src/test/java/org/apache/dubbo/common/utils/LRUCacheTest.java
rename to dubbo-common/src/test/java/org/apache/dubbo/common/utils/LRU2CacheTest.java
index 78749bb..a616a33 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LRUCacheTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LRU2CacheTest.java
@@ -19,15 +19,15 @@ package org.apache.dubbo.common.utils;
 
 import org.junit.jupiter.api.Test;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-public class LRUCacheTest {
+public class LRU2CacheTest {
     @Test
     public void testCache() throws Exception {
-        LRUCache<String, Integer> cache = new LRUCache<String, Integer>(3);
+        LRU2Cache<String, Integer> cache = new LRU2Cache<String, Integer>(3);
         cache.put("one", 1);
         cache.put("two", 2);
         cache.put("three", 3);
@@ -63,7 +63,7 @@ public class LRUCacheTest {
 
     @Test
     public void testCapacity() throws Exception {
-        LRUCache<String, Integer> cache = new LRUCache<String, Integer>();
+        LRU2Cache<String, Integer> cache = new LRU2Cache<String, Integer>();
         assertThat(cache.getMaxCapacity(), equalTo(1000));
         cache.setMaxCapacity(10);
         assertThat(cache.getMaxCapacity(), equalTo(10));
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LogHelperTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LogHelperTest.java
index 78de5f8..5134b95 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LogHelperTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LogHelperTest.java
@@ -18,6 +18,7 @@
 package org.apache.dubbo.common.utils;
 
 import org.apache.dubbo.common.logger.Logger;
+
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LogUtilTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LogUtilTest.java
index aec7cc7..4793d7b 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LogUtilTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/LogUtilTest.java
@@ -22,8 +22,8 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.Matchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/NamedThreadFactoryTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/NamedThreadFactoryTest.java
index ece6111..c28b701 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/NamedThreadFactoryTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/NamedThreadFactoryTest.java
@@ -20,11 +20,11 @@ package org.apache.dubbo.common.utils;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.allOf;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertSame;
-import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class NamedThreadFactoryTest {
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java b/dubbo-common/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java
index c9044fe..5771e99 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java
@@ -18,10 +18,11 @@ package org.apache.dubbo.config;
 
 
 import org.apache.dubbo.common.constants.CommonConstants;
+
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.io.TempDir;
 
 import java.io.File;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigConfigurationAdapterTest.java b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigConfigurationAdapterTest.java
index 05a9fe7..3a4a7dd 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigConfigurationAdapterTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigConfigurationAdapterTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config.context;
 
 import org.apache.dubbo.config.RegistryConfig;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
index 321343c..e4a3757 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
@@ -26,6 +26,7 @@ import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.ProviderConfig;
 import org.apache.dubbo.config.RegistryConfig;
 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;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/descriptor/MethodDescriptorTest.java b/dubbo-common/src/test/java/org/apache/dubbo/descriptor/MethodDescriptorTest.java
index 0ec485d..333557c 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/descriptor/MethodDescriptorTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/descriptor/MethodDescriptorTest.java
@@ -16,10 +16,11 @@
  */
 package org.apache.dubbo.descriptor;
 
-import io.reactivex.Single;
 import org.apache.dubbo.common.stream.StreamObserver;
 import org.apache.dubbo.proto.HelloReply;
 import org.apache.dubbo.rpc.model.MethodDescriptor;
+
+import io.reactivex.Single;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import reactor.core.publisher.Mono;
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/MetadataTest.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/MetadataTest.java
similarity index 96%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/MetadataTest.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/MetadataTest.java
index a75be44..ee59c62 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/MetadataTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/MetadataTest.java
@@ -23,9 +23,11 @@ import org.apache.dubbo.metadata.definition.common.ResultWithRawCollections;
 import org.apache.dubbo.metadata.definition.common.TestService;
 import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
 import org.apache.dubbo.metadata.definition.model.TypeDefinition;
+import org.apache.dubbo.rpc.model.FrameworkModel;
 
 import com.google.gson.Gson;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -35,6 +37,11 @@ import org.junit.jupiter.api.Test;
  */
 public class MetadataTest {
 
+    @BeforeAll
+    public static void setup() {
+        TypeDefinitionBuilder.initBuilders(FrameworkModel.defaultModel());
+    }
+
     /**
      *
      */
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/MetadataUtils.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/MetadataUtils.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/MetadataUtils.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/MetadataUtils.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilderTest.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilderTest.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilderTest.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/Test3TypeBuilder.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/Test3TypeBuilder.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/Test3TypeBuilder.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/Test3TypeBuilder.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TestTypeBuilder.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/TestTypeBuilder.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TestTypeBuilder.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/TestTypeBuilder.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilderTest.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilderTest.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilderTest.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/common/ClassExtendsMap.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/common/ClassExtendsMap.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/common/ClassExtendsMap.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/common/ClassExtendsMap.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/common/ColorEnum.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/common/ColorEnum.java
similarity index 100%
copy from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/common/ColorEnum.java
copy to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/common/ColorEnum.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/common/OuterClass.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/common/OuterClass.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/common/OuterClass.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/common/OuterClass.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/common/ResultWithRawCollections.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/common/ResultWithRawCollections.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/common/ResultWithRawCollections.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/common/ResultWithRawCollections.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/common/TestService.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/common/TestService.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/common/TestService.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/common/TestService.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/ComplexObject.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/ComplexObject.java
similarity index 98%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/ComplexObject.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/ComplexObject.java
index 9371e8a..b984dee 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/ComplexObject.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/ComplexObject.java
@@ -32,8 +32,8 @@ public class ComplexObject {
     public ComplexObject() {
     }
 
-    public ComplexObject(String var1, int var2, long l, String[] var3, List<Integer> var4, ComplexObject.TestEnum testEnum) {
-        this.setInnerObject(new ComplexObject.InnerObject());
+    public ComplexObject(String var1, int var2, long l, String[] var3, List<Integer> var4, TestEnum testEnum) {
+        this.setInnerObject(new InnerObject());
         this.getInnerObject().setInnerA(var1);
         this.getInnerObject().setInnerB(var2);
         this.setIntList(var4);
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/DemoService.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/DemoService.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/DemoService.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/DemoService.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockMethodAnnotation.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockMethodAnnotation.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockMethodAnnotation.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockMethodAnnotation.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockMethodAnnotation2.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockMethodAnnotation2.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockMethodAnnotation2.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockMethodAnnotation2.java
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockTypeAnnotation.java b/dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockTypeAnnotation.java
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockTypeAnnotation.java
rename to dubbo-common/src/test/java/org/apache/dubbo/metadata/definition/service/annotation/MockTypeAnnotation.java
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ApplicationModelTest.java b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ApplicationModelTest.java
index b42a39b..d4120c9 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ApplicationModelTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ApplicationModelTest.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.common.lang.ShutdownHookCallbacks;
 import org.apache.dubbo.common.status.reporter.FrameworkStatusReportService;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.support.MockScopeModelDestroyListener;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkModelTest.java b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkModelTest.java
index ee32037..9ea6fb8 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkModelTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkModelTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.model;
 
 import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.utils.StringUtils;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkServiceRepositoryTest.java b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkServiceRepositoryTest.java
index 6bdef4f..3969583 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkServiceRepositoryTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkServiceRepositoryTest.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.support.DemoService;
 import org.apache.dubbo.rpc.support.DemoServiceImpl;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleModelTest.java b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleModelTest.java
index 75366f5..f813dfb 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleModelTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleModelTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.config.ConfigurationCache;
 import org.apache.dubbo.common.config.ModuleEnvironment;
 import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.rpc.support.MockScopeModelDestroyListener;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleServiceRepositoryTest.java b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleServiceRepositoryTest.java
index 320bb2d..ca91caa 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleServiceRepositoryTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleServiceRepositoryTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.model;
 
 import org.apache.dubbo.rpc.support.DemoService;
 import org.apache.dubbo.rpc.support.DemoServiceImpl;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessorTest.java b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessorTest.java
index aa100e1..20a59ab 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessorTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessorTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.rpc.model;
 
 import org.apache.dubbo.rpc.support.MockScopeModelAware;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelTest.java b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelTest.java
index f450586..59c1cbc 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.rpc.model;
 
 import org.apache.dubbo.common.utils.StringUtils;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelUtilTest.java b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelUtilTest.java
index 7720d10..f6450fd 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelUtilTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelUtilTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.rpc.model;
 import org.apache.dubbo.common.config.Environment;
 import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ServiceRepositoryTest.java b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ServiceRepositoryTest.java
index 917e7dc..6daa425 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ServiceRepositoryTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ServiceRepositoryTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.model;
 
 import org.apache.dubbo.rpc.support.DemoService;
 import org.apache.dubbo.rpc.support.DemoServiceImpl;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder
similarity index 100%
rename from dubbo-metadata/dubbo-metadata-api/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder
rename to dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder
diff --git a/dubbo-common/src/test/resources/test-cache.dubbo.cache b/dubbo-common/src/test/resources/test-cache.dubbo.cache
new file mode 100644
index 0000000..0695eef
--- /dev/null
+++ b/dubbo-common/src/test/resources/test-cache.dubbo.cache
@@ -0,0 +1,2 @@
+111=cache-entry-1
+222=cache-entry-2
diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/PageServlet.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/PageServlet.java
index 2ff7035..68e287d 100644
--- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/PageServlet.java
+++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/PageServlet.java
@@ -21,7 +21,6 @@ import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.StringUtils;
 
-
 import com.alibaba.dubbo.common.Constants;
 import com.alibaba.dubbo.common.URL;
 
diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/HomePageHandler.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/HomePageHandler.java
index 09a10a1..f243345 100644
--- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/HomePageHandler.java
+++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/HomePageHandler.java
@@ -16,9 +16,9 @@
  */
 package com.alibaba.dubbo.container.page.pages;
 
-import com.alibaba.dubbo.common.URL;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 
+import com.alibaba.dubbo.common.URL;
 import com.alibaba.dubbo.container.page.Menu;
 import com.alibaba.dubbo.container.page.Page;
 import com.alibaba.dubbo.container.page.PageHandler;
diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/LogPageHandler.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/LogPageHandler.java
index c361748..874bdb3 100644
--- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/LogPageHandler.java
+++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/LogPageHandler.java
@@ -17,11 +17,9 @@
 package com.alibaba.dubbo.container.page.pages;
 
 import com.alibaba.dubbo.common.URL;
-
 import com.alibaba.dubbo.container.page.Menu;
 import com.alibaba.dubbo.container.page.Page;
 import com.alibaba.dubbo.container.page.PageHandler;
-
 import org.apache.log4j.Appender;
 import org.apache.log4j.FileAppender;
 import org.apache.log4j.Level;
diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/StatusPageHandler.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/StatusPageHandler.java
index 88a0e8f..50e5564 100644
--- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/StatusPageHandler.java
+++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/container/page/pages/StatusPageHandler.java
@@ -16,11 +16,11 @@
  */
 package com.alibaba.dubbo.container.page.pages;
 
-import com.alibaba.dubbo.common.URL;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.common.status.Status;
 import org.apache.dubbo.common.status.support.StatusUtils;
 
+import com.alibaba.dubbo.common.URL;
 import com.alibaba.dubbo.common.status.StatusChecker;
 import com.alibaba.dubbo.container.page.Menu;
 import com.alibaba.dubbo.container.page.Page;
diff --git a/dubbo-compatible/src/test/java/org/apache/dubbo/config/ConfigTest.java b/dubbo-compatible/src/test/java/org/apache/dubbo/config/ConfigTest.java
index 3e8c053..fe3ee4d 100644
--- a/dubbo-compatible/src/test/java/org/apache/dubbo/config/ConfigTest.java
+++ b/dubbo-compatible/src/test/java/org/apache/dubbo/config/ConfigTest.java
@@ -18,7 +18,6 @@
 package org.apache.dubbo.config;
 
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
-import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.service.DemoService;
 import org.apache.dubbo.service.DemoServiceImpl;
 
diff --git a/dubbo-compatible/src/test/java/org/apache/dubbo/generic/GenericServiceTest.java b/dubbo-compatible/src/test/java/org/apache/dubbo/generic/GenericServiceTest.java
index 3a469fd..cf2a320 100644
--- a/dubbo-compatible/src/test/java/org/apache/dubbo/generic/GenericServiceTest.java
+++ b/dubbo-compatible/src/test/java/org/apache/dubbo/generic/GenericServiceTest.java
@@ -18,8 +18,6 @@
 package org.apache.dubbo.generic;
 
 
-import com.alibaba.dubbo.config.ReferenceConfig;
-import com.alibaba.fastjson.JSON;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
@@ -35,6 +33,9 @@ import org.apache.dubbo.rpc.service.GenericService;
 import org.apache.dubbo.service.ComplexObject;
 import org.apache.dubbo.service.DemoService;
 import org.apache.dubbo.service.DemoServiceImpl;
+
+import com.alibaba.dubbo.config.ReferenceConfig;
+import com.alibaba.fastjson.JSON;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index 5d83fed..03875d9 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
@@ -32,7 +32,7 @@ import org.apache.dubbo.common.utils.UrlUtils;
 import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.support.Parameter;
 import org.apache.dubbo.config.utils.ConfigValidationUtils;
-import org.apache.dubbo.registry.client.metadata.MetadataUtils;
+import org.apache.dubbo.metadata.ServiceNameMapping;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.ProxyFactory;
@@ -256,12 +256,14 @@ public class ReferenceConfig<T> extends ReferenceConfigBase<T> {
 
         // init serviceMetadata
         initServiceMetadata(consumer);
+
         serviceMetadata.setServiceType(getServiceInterfaceClass());
         // TODO, uncomment this line once service key is unified
         serviceMetadata.setServiceKey(URL.buildKey(interfaceName, group, version));
 
         Map<String, String> referenceParameters = appendConfig();
-
+        // init service-application mapping
+        initServiceAppsMapping(referenceParameters);
 
         ModuleServiceRepository repository = getScopeModel().getServiceRepository();
         ServiceDescriptor serviceDescriptor = repository.registerService(interfaceClass);
@@ -283,6 +285,12 @@ public class ReferenceConfig<T> extends ReferenceConfigBase<T> {
         checkInvokerAvailable();
     }
 
+    private void initServiceAppsMapping(Map<String, String> referenceParameters) {
+        ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension(getScopeModel());
+        URL url = new ServiceConfigURL(LOCAL_PROTOCOL, LOCALHOST_VALUE, 0, interfaceName, referenceParameters);
+        serviceNameMapping.getServices(url);
+    }
+
     /**
      * convert and aggregate async method info
      *
@@ -394,7 +402,6 @@ public class ReferenceConfig<T> extends ReferenceConfigBase<T> {
             referenceParameters.get(INTERFACE_KEY), referenceParameters);
         consumerUrl = consumerUrl.setScopeModel(getScopeModel());
         consumerUrl = consumerUrl.setServiceModel(consumerModel);
-        MetadataUtils.publishServiceDefinition(consumerUrl);
 
         // create service proxy
         return (T) proxyFactory.getProxy(invoker, ProtocolUtils.isGeneric(generic));
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index bf7ae84..bc29fd0 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
@@ -32,9 +32,7 @@ import org.apache.dubbo.config.annotation.Service;
 import org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker;
 import org.apache.dubbo.config.support.Parameter;
 import org.apache.dubbo.config.utils.ConfigValidationUtils;
-import org.apache.dubbo.metadata.MetadataService;
 import org.apache.dubbo.metadata.ServiceNameMapping;
-import org.apache.dubbo.metadata.WritableMetadataService;
 import org.apache.dubbo.registry.client.metadata.MetadataUtils;
 import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.Invoker;
@@ -47,7 +45,6 @@ import org.apache.dubbo.rpc.model.ProviderModel;
 import org.apache.dubbo.rpc.model.ScopeModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
 import org.apache.dubbo.rpc.service.GenericService;
-import org.apache.dubbo.rpc.support.ProtocolUtils;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -84,6 +81,7 @@ import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;
 import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_BIND;
 import static org.apache.dubbo.config.Constants.DUBBO_PORT_TO_REGISTRY;
 import static org.apache.dubbo.config.Constants.SCOPE_NONE;
+import static org.apache.dubbo.metadata.MetadataService.isMetadataService;
 import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;
 import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;
 import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;
@@ -94,6 +92,7 @@ import static org.apache.dubbo.rpc.Constants.SCOPE_LOCAL;
 import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE;
 import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;
 import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;
+import static org.apache.dubbo.rpc.support.ProtocolUtils.isGeneric;
 
 public class ServiceConfig<T> extends ServiceConfigBase<T> {
 
@@ -134,7 +133,6 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
     private final List<Exporter<?>> exporters = new ArrayList<Exporter<?>>();
 
     private final List<ServiceListener> serviceListeners = new ArrayList<>();
-    private WritableMetadataService localMetadataService;
 
     public ServiceConfig() {
     }
@@ -156,7 +154,6 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         super.postProcessAfterScopeModelChanged(oldScopeModel, newScopeModel);
         protocolSPI = this.getExtensionLoader(Protocol.class).getAdaptiveExtension();
         proxyFactory = this.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
-        localMetadataService = this.getScopeModel().getDefaultExtension(WritableMetadataService.class);
     }
 
     @Override
@@ -261,6 +258,8 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
                     boolean succeeded = serviceNameMapping.map(url);
                     if (succeeded) {
                         logger.info("Successfully registered interface application mapping for service " + url.getServiceKey());
+                    } else {
+                        logger.error("Failed register interface application mapping for service " + url.getServiceKey());
                     }
                 } catch (Exception e) {
                     logger.error("Failed register interface application mapping for service " + url.getServiceKey(), e);
@@ -428,7 +427,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
             getMethods().forEach(method -> appendParametersWithMethod(method, map));
         }
 
-        if (ProtocolUtils.isGeneric(generic)) {
+        if (isGeneric(generic)) {
             map.put(GENERIC_KEY, generic);
             map.put(METHODS_KEY, ANY_VALUE);
         } else {
@@ -541,8 +540,8 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         }
 
         // export service
-        String host = findConfiguredHosts(protocolConfig, params);
-        Integer port = findConfiguredPorts(protocolConfig, name, params);
+        String host = findConfiguredHosts(protocolConfig, provider, params);
+        Integer port = findConfiguredPort(protocolConfig, provider, this.getExtensionLoader(Protocol.class), name, params);
         URL url = new ServiceConfigURL(name, null, null, host, port, getContextPath(protocolConfig).map(p -> p + "/" + path).orElse(path), params);
 
         // You can customize Configurator to append extra parameters
@@ -569,9 +568,13 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
             // export to remote if the config is not local (export to local only when config is local)
             if (!SCOPE_LOCAL.equalsIgnoreCase(scope)) {
                 url = exportRemote(url, registryURLs);
-                MetadataUtils.publishServiceDefinition(url);
+                if (!isGeneric(generic) && !isMetadataService(interfaceName)) {
+                    ServiceDescriptor descriptor = getScopeModel().getServiceRepository().getService(interfaceName);
+                    if (descriptor != null) {
+                        MetadataUtils.publishServiceDefinition(getScopeModel().getServiceRepository().getService(interfaceName), getApplicationModel());
+                    }
+                }
             }
-
         }
         this.urls.add(url);
     }
@@ -613,10 +616,6 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
 
         } else {
 
-            if (MetadataService.class.getName().equals(url.getServiceInterface())) {
-                localMetadataService.setMetadataServiceURL(url);
-            }
-
             if (logger.isInfoEnabled()) {
                 logger.info("Export dubbo service " + interfaceClass.getName() + " to url " + url);
             }
@@ -664,6 +663,27 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
                 && LOCAL_PROTOCOL.equalsIgnoreCase(getProtocols().get(0).getName());
     }
 
+    private void postProcessConfig() {
+        List<ConfigPostProcessor> configPostProcessors = this.getExtensionLoader(ConfigPostProcessor.class)
+                .getActivateExtension(URL.valueOf("configPostProcessor://", getScopeModel()), (String[]) null);
+        configPostProcessors.forEach(component -> component.postProcessServiceConfig(this));
+    }
+
+    public void addServiceListener(ServiceListener listener) {
+        this.serviceListeners.add(listener);
+    }
+
+    protected void onExported() {
+        for (ServiceListener serviceListener : this.serviceListeners) {
+            serviceListener.exported(this);
+        }
+    }
+
+    protected void onUnexpoted() {
+        for (ServiceListener serviceListener : this.serviceListeners) {
+            serviceListener.unexported(this);
+        }
+    }
 
     /**
      * Register & bind IP address for service provider, can be configured separately.
@@ -674,8 +694,9 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
      * @param map
      * @return
      */
-    private String findConfiguredHosts(ProtocolConfig protocolConfig,
-                                       Map<String, String> map) {
+    private static String findConfiguredHosts(ProtocolConfig protocolConfig,
+                                              ProviderConfig provider,
+                                              Map<String, String> map) {
         boolean anyhost = false;
 
         String hostToBind = getValueFromConfig(protocolConfig, DUBBO_IP_TO_BIND);
@@ -724,9 +745,10 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
      * @param name
      * @return
      */
-    private Integer findConfiguredPorts(ProtocolConfig protocolConfig,
-                                        String name,
-                                        Map<String, String> map) {
+    private static synchronized Integer findConfiguredPort(ProtocolConfig protocolConfig,
+                                                           ProviderConfig provider,
+                                                           ExtensionLoader<Protocol> extensionLoader,
+                                                           String name,Map<String, String> map) {
         Integer portToBind;
 
         // parse bind port from environment
@@ -739,7 +761,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
             if (provider != null && (portToBind == null || portToBind == 0)) {
                 portToBind = provider.getPort();
             }
-            final int defaultPort = this.getExtensionLoader(Protocol.class).getExtension(name).getDefaultPort();
+            final int defaultPort = extensionLoader.getExtension(name).getDefaultPort();
             if (portToBind == null || portToBind == 0) {
                 portToBind = defaultPort;
             }
@@ -765,7 +787,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         return portToRegistry;
     }
 
-    private Integer parsePort(String configPort) {
+    private static Integer parsePort(String configPort) {
         Integer port = null;
         if (StringUtils.isNotEmpty(configPort)) {
             try {
@@ -781,7 +803,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         return port;
     }
 
-    private String getValueFromConfig(ProtocolConfig protocolConfig, String key) {
+    private static String getValueFromConfig(ProtocolConfig protocolConfig, String key) {
         String protocolPrefix = protocolConfig.getName().toUpperCase() + "_";
         String value = ConfigUtils.getSystemProperty(protocolPrefix + key);
         if (StringUtils.isEmpty(value)) {
@@ -790,12 +812,12 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         return value;
     }
 
-    private Integer getRandomPort(String protocol) {
+    private static Integer getRandomPort(String protocol) {
         protocol = protocol.toLowerCase();
         return RANDOM_PORT_MAP.getOrDefault(protocol, Integer.MIN_VALUE);
     }
 
-    private void putRandomPort(String protocol, Integer port) {
+    private static void putRandomPort(String protocol, Integer port) {
         protocol = protocol.toLowerCase();
         if (!RANDOM_PORT_MAP.containsKey(protocol)) {
             RANDOM_PORT_MAP.put(protocol, port);
@@ -803,25 +825,4 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         }
     }
 
-    private void postProcessConfig() {
-        List<ConfigPostProcessor> configPostProcessors = this.getExtensionLoader(ConfigPostProcessor.class)
-                .getActivateExtension(URL.valueOf("configPostProcessor://", getScopeModel()), (String[]) null);
-        configPostProcessors.forEach(component -> component.postProcessServiceConfig(this));
-    }
-
-    public void addServiceListener(ServiceListener listener) {
-        this.serviceListeners.add(listener);
-    }
-
-    protected void onExported() {
-        for (ServiceListener serviceListener : this.serviceListeners) {
-            serviceListener.exported(this);
-        }
-    }
-
-    protected void onUnexpoted() {
-        for (ServiceListener serviceListener : this.serviceListeners) {
-            serviceListener.unexported(this);
-        }
-    }
 }
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 518bd99..ae1f846 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
@@ -26,6 +26,7 @@ import org.apache.dubbo.common.config.configcenter.wrapper.CompositeDynamicConfi
 import org.apache.dubbo.common.deploy.AbstractDeployer;
 import org.apache.dubbo.common.deploy.ApplicationDeployListener;
 import org.apache.dubbo.common.deploy.ApplicationDeployer;
+import org.apache.dubbo.common.deploy.DeployListener;
 import org.apache.dubbo.common.deploy.DeployState;
 import org.apache.dubbo.common.deploy.ModuleDeployer;
 import org.apache.dubbo.common.extension.ExtensionLoader;
@@ -44,16 +45,9 @@ import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.context.ConfigManager;
 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.WritableMetadataService;
 import org.apache.dubbo.metadata.report.MetadataReportFactory;
 import org.apache.dubbo.metadata.report.MetadataReportInstance;
-import org.apache.dubbo.registry.client.DefaultServiceInstance;
-import org.apache.dubbo.registry.client.ServiceInstance;
 import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;
-import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;
-import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;
 import org.apache.dubbo.registry.support.RegistryManager;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
@@ -76,15 +70,12 @@ import java.util.function.Supplier;
 
 import static java.lang.String.format;
 import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties;
-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;
 import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_SPLIT_PATTERN;
 import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;
 import static org.apache.dubbo.common.utils.StringUtils.isEmpty;
 import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;
 import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_METADATA_PUBLISH_DELAY;
 import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PUBLISH_DELAY_KEY;
-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.calInstanceRevision;
-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setMetadataStorageType;
 import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;
 
 /**
@@ -104,22 +95,16 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
 
     private final ExecutorRepository executorRepository;
 
-    private volatile ServiceInstance serviceInstance;
-
-    private AtomicBoolean hasPreparedApplicationInstance = new AtomicBoolean(false);
-    private AtomicBoolean hasPreparedInternalModule = new AtomicBoolean(false);
-
-    private volatile MetadataService metadataService;
-
-    private volatile MetadataServiceExporter metadataServiceExporter;
+    private final AtomicBoolean hasPreparedApplicationInstance = new AtomicBoolean(false);
+    private final AtomicBoolean hasPreparedInternalModule = new AtomicBoolean(false);
 
     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);
@@ -161,17 +146,16 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
         dubboShutdownHook.unregister();
     }
 
+    /**
+     * Close registration of instance for pure Consumer process by setting registerConsumer to 'false'
+     * by default is true.
+     */
     private boolean isRegisterConsumerInstance() {
         Boolean registerConsumer = getApplication().getRegisterConsumer();
-        return Boolean.TRUE.equals(registerConsumer);
-    }
-
-    private String getMetadataType() {
-        String type = getApplication().getMetadataType();
-        if (StringUtils.isEmpty(type)) {
-            type = DEFAULT_METADATA_STORAGE_TYPE;
+        if (registerConsumer == null) {
+            return true;
         }
-        return type;
+        return Boolean.TRUE.equals(registerConsumer);
     }
 
     @Override
@@ -204,8 +188,6 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
             // @since 2.7.8
             startMetadataCenter();
 
-            initMetadataService();
-
             initialized.set(true);
 
             if (logger.isInfoEnabled()) {
@@ -296,13 +278,18 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
         }
 
         MetadataReportInstance metadataReportInstance = applicationModel.getBeanFactory().getBean(MetadataReportInstance.class);
+        List<MetadataReportConfig> validMetadataReportConfigs = new ArrayList<>(metadataReportConfigs.size());
         for (MetadataReportConfig metadataReportConfig : metadataReportConfigs) {
             ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);
             if (!metadataReportConfig.isValid()) {
-                logger.info("Ignore invalid metadata-report config: " + metadataReportConfig);
+                logger.warn("Ignore invalid metadata-report config: " + metadataReportConfig);
                 continue;
             }
-            metadataReportInstance.init(metadataReportConfig);
+            validMetadataReportConfigs.add(metadataReportConfig);
+        }
+        metadataReportInstance.init(validMetadataReportConfigs);
+        if (!metadataReportInstance.inited()) {
+            throw new IllegalStateException(String.format("%s MetadataConfigs found, but none of them is valid.", metadataReportConfigs.size()));
         }
     }
 
@@ -502,19 +489,6 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
     }
 
     /**
-     * Initialize {@link MetadataService} from {@link WritableMetadataService}'s extension
-     */
-    private void initMetadataService() {
-//        startMetadataCenter();
-        this.metadataService = getExtensionLoader(WritableMetadataService.class).getDefaultExtension();
-        // support injection by super type MetadataService
-        applicationModel.getBeanFactory().registerBean(this.metadataService);
-
-        //this.metadataServiceExporter = new ConfigurableMetadataServiceExporter(metadataService);
-        this.metadataServiceExporter = getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
-    }
-
-    /**
      * Start the bootstrap
      *
      * @return
@@ -581,7 +555,7 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
         startModules();
 
         // prepare application instance
-        prepareApplicationInstance();
+//        prepareApplicationInstance();
 
         // Ignore checking new module after start
 //        executorRepository.getSharedExecutor().submit(() -> {
@@ -621,18 +595,12 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
 
     @Override
     public void prepareApplicationInstance() {
-        // ensure init and start internal module first
-        prepareInternalModule();
-
-        // always start metadata service on application model start, so it's ready whenever a new module is started
-        // export MetadataService
-        exportMetadataService();
-
         if (hasPreparedApplicationInstance.get()) {
             return;
         }
-        // if register consumer instance or has exported services
-        if (isRegisterConsumerInstance() || hasExportedServices()) {
+
+        if (isRegisterConsumerInstance()) {
+            exportMetadataService();
             if (hasPreparedApplicationInstance.compareAndSet(false, true)) {
                 // register the local ServiceInstance if required
                 registerServiceInstance();
@@ -640,7 +608,7 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
         }
     }
 
-    private void prepareInternalModule() {
+    public void prepareInternalModule() {
         synchronized (internalModuleLock) {
             if (!hasPreparedInternalModule.compareAndSet(false, true)) {
                 return;
@@ -734,122 +702,42 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
         return factory.getDynamicConfiguration(connectionURL);
     }
 
-    /**
-     * export {@link MetadataService}
-     */
-    private void exportMetadataService() {
-        // fixme, let's disable local metadata service export at this moment
-        if (!REMOTE_METADATA_STORAGE_TYPE.equals(getMetadataType())) {
-            metadataServiceExporter.export();
-        }
-    }
-
-    private void unexportMetadataService() {
-        if (metadataServiceExporter != null && metadataServiceExporter.isExported()) {
-            try {
-                metadataServiceExporter.unexport();
-            } catch (Exception ignored) {
-                // ignored
-            }
-        }
-    }
+    private volatile boolean registered;
 
     private void registerServiceInstance() {
-        if (isRegisteredServiceInstance()) {
-            return;
-        }
-
-        ApplicationConfig application = getApplication();
-        String serviceName = application.getName();
-        ServiceInstance serviceInstance = createServiceInstance(serviceName);
-        boolean registered = true;
         try {
-            ServiceInstanceMetadataUtils.registerMetadataAndInstance(serviceInstance);
+            registered = true;
+            ServiceInstanceMetadataUtils.registerMetadataAndInstance(applicationModel);
         } catch (Exception e) {
-            registered = false;
             logger.error("Register instance error", e);
         }
         if (registered) {
             // scheduled task for updating Metadata and ServiceInstance
-            asyncMetadataFuture = executorRepository.getSharedScheduledExecutor().scheduleAtFixedRate(() -> {
+            asyncMetadataFuture = executorRepository.getSharedScheduledExecutor().scheduleWithFixedDelay(() -> {
 
                 // ignore refresh metadata on stopping
                 if (applicationModel.isDestroyed()) {
                     return;
                 }
-
-                InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension(applicationModel);
-                localMetadataService.blockUntilUpdated();
                 try {
-                    if (!applicationModel.isDestroyed()) {
-                        ServiceInstanceMetadataUtils.refreshMetadataAndInstance(serviceInstance);
+                    if (!applicationModel.isDestroyed() && registered) {
+                        ServiceInstanceMetadataUtils.refreshMetadataAndInstance(applicationModel);
                     }
                 } catch (Exception e) {
                     if (!applicationModel.isDestroyed()) {
                         logger.error("Refresh instance and metadata error", e);
                     }
-                } finally {
-                    localMetadataService.releaseBlock();
                 }
             }, 0, ConfigurationUtils.get(applicationModel, METADATA_PUBLISH_DELAY_KEY, DEFAULT_METADATA_PUBLISH_DELAY), TimeUnit.MILLISECONDS);
         }
     }
 
-    private boolean isRegisteredServiceInstance() {
-        return this.serviceInstance != null;
-    }
-
-    private void doRegisterServiceInstance(ServiceInstance serviceInstance) {
-        // register instance only when at least one service is exported.
-        if (serviceInstance.getPort() > 0) {
-            publishMetadataToRemote(serviceInstance);
-            logger.info("Start registering instance address to registry.");
-            RegistryManager.getInstance(applicationModel).getServiceDiscoveries().forEach(serviceDiscovery ->
-            {
-                ServiceInstance serviceInstanceForRegistry = new DefaultServiceInstance((DefaultServiceInstance) serviceInstance);
-                calInstanceRevision(serviceDiscovery, serviceInstanceForRegistry);
-                if (logger.isDebugEnabled()) {
-                    logger.info("Start registering instance address to registry" + serviceDiscovery.getUrl() + ", instance " + serviceInstanceForRegistry);
-                }
-                // register metadata
-                serviceDiscovery.register(serviceInstanceForRegistry);
-            });
-        }
-    }
-
-    private void publishMetadataToRemote(ServiceInstance serviceInstance) {
-//        InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService)WritableMetadataService.getDefaultExtension();
-//        localMetadataService.blockUntilUpdated();
-        if (logger.isInfoEnabled()) {
-            logger.info("Start publishing metadata to remote center, this only makes sense for applications enabled remote metadata center.");
-        }
-        RemoteMetadataServiceImpl remoteMetadataService = applicationModel.getBeanFactory().getBean(RemoteMetadataServiceImpl.class);
-        remoteMetadataService.publishMetadata(serviceInstance.getServiceName());
-    }
-
     private void unregisterServiceInstance() {
-        if (isRegisteredServiceInstance()) {
-            RegistryManager.getInstance(applicationModel).getServiceDiscoveries().forEach(serviceDiscovery -> {
-                try {
-                    serviceDiscovery.unregister(serviceInstance);
-                } catch (Exception ignored) {
-                    // ignored
-                }
-            });
+        if (registered) {
+            ServiceInstanceMetadataUtils.unregisterMetadataAndInstance(applicationModel);
         }
     }
 
-    private ServiceInstance createServiceInstance(String serviceName) {
-        this.serviceInstance = new DefaultServiceInstance(serviceName, applicationModel);
-        setMetadataStorageType(serviceInstance, getMetadataType());
-        ServiceInstanceMetadataUtils.customizeInstance(this.serviceInstance);
-        return this.serviceInstance;
-    }
-
-    public ServiceInstance getServiceInstance() {
-        return serviceInstance;
-    }
-
     @Override
     public void stop() {
         applicationModel.destroy();
@@ -868,7 +756,6 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
                 asyncMetadataFuture.cancel(true);
             }
             unregisterServiceInstance();
-            unexportMetadataService();
         }
     }
 
@@ -909,7 +796,7 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
 
     @Override
     public void notifyModuleChanged(ModuleModel moduleModel, DeployState state) {
-        checkState();
+        checkState(moduleModel, state);
 
         // notify module state changed or module changed
         synchronized (stateLock) {
@@ -918,8 +805,11 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
     }
 
     @Override
-    public void checkState() {
+    public void checkState(ModuleModel moduleModel, DeployState moduleState) {
         synchronized (stateLock) {
+            if (!moduleModel.isInternal() && moduleState == DeployState.STARTED) {
+                prepareApplicationInstance();
+            }
             DeployState newState = calculateState();
             switch (newState) {
                 case STARTED:
@@ -937,11 +827,11 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
                 case FAILED:
                     Throwable error = null;
                     ModuleModel errorModule = null;
-                    for (ModuleModel moduleModel : applicationModel.getModuleModels()) {
-                        ModuleDeployer deployer = moduleModel.getDeployer();
+                    for (ModuleModel module : applicationModel.getModuleModels()) {
+                        ModuleDeployer deployer = module.getDeployer();
                         if (deployer.isFailed() && deployer.getError() != null) {
                             error = deployer.getError();
-                            errorModule = moduleModel;
+                            errorModule = module;
                             break;
                         }
                     }
@@ -1010,6 +900,21 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
         return newState;
     }
 
+    private void exportMetadataService() {
+        if (!isStarting()) {
+            return;
+        }
+        for (DeployListener<ApplicationModel> listener : listeners) {
+            try {
+                if (listener instanceof ApplicationDeployListener) {
+                    ((ApplicationDeployListener) listener).onModuleStarted(applicationModel);
+                }
+            } catch (Throwable e) {
+                logger.error(getIdentifier() + " an exception occurred when handle starting event", e);
+            }
+        }
+    }
+
     private void onStarting() {
         // pending -> starting
         // started -> starting
@@ -1035,11 +940,11 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
             }
             // refresh metadata
             try {
-                if (serviceInstance != null) {
-                    ServiceInstanceMetadataUtils.refreshMetadataAndInstance(serviceInstance);
+                if (registered) {
+                    ServiceInstanceMetadataUtils.refreshMetadataAndInstance(applicationModel);
                 }
             } catch (Exception e) {
-                logger.error("refresh metadata failed: " + e.getMessage(), e);
+                logger.error("refresh meta and instance failed: " + e.getMessage(), e);
             }
         } finally {
             // complete future
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
index b2c4bbf..0bdeb69 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
@@ -141,11 +141,11 @@ public class DefaultModuleDeployer extends AbstractDeployer<ModuleModel> impleme
             // export services
             exportServices();
 
-            // prepare application instance
-            // exclude internal module to avoid wait itself
-            if (moduleModel != moduleModel.getApplicationModel().getInternalModule()) {
-                applicationDeployer.prepareApplicationInstance();
-            }
+        // prepare application instance
+        // exclude internal module to avoid wait itself
+        if (moduleModel != moduleModel.getApplicationModel().getInternalModule()) {
+            applicationDeployer.prepareInternalModule();
+        }
 
             // refer services
             referServices();
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 39a1fc6..8d7ac95 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
@@ -22,20 +22,14 @@ import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.ApplicationConfig;
-import org.apache.dubbo.config.ArgumentConfig;
-import org.apache.dubbo.config.MethodConfig;
 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.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -46,70 +40,31 @@ 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 MetadataServiceDelegation metadataService;
 
     private volatile ServiceConfig<MetadataService> serviceConfig;
-    private ApplicationModel applicationModel;
-
-    public ConfigurableMetadataServiceExporter() {
-    }
+    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;
     }
 
-    @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);
-
+    public synchronized ConfigurableMetadataServiceExporter export() {
+        if (serviceConfig == null || !isExported()) {
+            this.serviceConfig = buildServiceConfig();
             // 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());
@@ -119,41 +74,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();
     }
@@ -227,4 +155,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-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ExporterDeployListener.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ExporterDeployListener.java
new file mode 100644
index 0000000..1a0bafc
--- /dev/null
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ExporterDeployListener.java
@@ -0,0 +1,96 @@
+/*
+ * 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.config.metadata;
+
+import org.apache.dubbo.common.deploy.ApplicationDeployListener;
+import org.apache.dubbo.common.lang.Prioritized;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;
+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;
+
+public class ExporterDeployListener implements ApplicationDeployListener, Prioritized {
+    protected volatile ConfigurableMetadataServiceExporter metadataServiceExporter;
+
+    @Override
+    public void onStarting(ApplicationModel scopeModel) {
+
+    }
+
+    @Override
+    public synchronized void onStarted(ApplicationModel applicationModel) {
+
+    }
+
+    @Override
+    public synchronized void onStopping(ApplicationModel scopeModel) {
+
+    }
+
+    private String getMetadataType(ApplicationModel applicationModel) {
+        String type = applicationModel.getApplicationConfigManager().getApplicationOrElseThrow().getMetadataType();
+        if (StringUtils.isEmpty(type)) {
+            type = DEFAULT_METADATA_STORAGE_TYPE;
+        }
+        return type;
+    }
+
+
+    public ConfigurableMetadataServiceExporter getMetadataServiceExporter() {
+        return metadataServiceExporter;
+    }
+
+    public void setMetadataServiceExporter(ConfigurableMetadataServiceExporter metadataServiceExporter) {
+        this.metadataServiceExporter = metadataServiceExporter;
+    }
+
+    @Override
+    public synchronized void onModuleStarted(ApplicationModel applicationModel) {
+        // start metadata service exporter
+        MetadataServiceDelegation metadataService = applicationModel.getBeanFactory().getOrRegisterBean(MetadataServiceDelegation.class);
+        if (metadataServiceExporter == null) {
+            metadataServiceExporter = new ConfigurableMetadataServiceExporter(applicationModel, metadataService);
+            // fixme, let's disable local metadata service export at this moment
+            if (!REMOTE_METADATA_STORAGE_TYPE.equals(getMetadataType(applicationModel))) {
+                metadataServiceExporter.export();
+            }
+        }
+    }
+
+
+    @Override
+    public synchronized void onStopped(ApplicationModel scopeModel) {
+        if (metadataServiceExporter != null && metadataServiceExporter.isExported()) {
+            try {
+                metadataServiceExporter.unexport();
+            } catch (Exception ignored) {
+                // ignored
+            }
+        }
+    }
+
+    @Override
+    public void onFailure(ApplicationModel scopeModel, Throwable cause) {
+
+    }
+
+    @Override
+    public int getPriority() {
+        return MAX_PRIORITY;
+    }
+}
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceDelegation.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceDelegation.java
new file mode 100644
index 0000000..b33d560
--- /dev/null
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceDelegation.java
@@ -0,0 +1,228 @@
+/*
+ * 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.config.metadata;
+
+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.resource.Disposable;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.metadata.MetadataInfo;
+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 java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentNavigableMap;
+import java.util.concurrent.ConcurrentSkipListMap;
+
+import static java.util.Collections.emptySortedSet;
+import static java.util.Collections.unmodifiableSortedSet;
+import static org.apache.dubbo.common.URL.buildKey;
+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;
+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, Disposable {
+    Logger logger = LoggerFactory.getLogger(getClass());
+    private final ApplicationModel applicationModel;
+    private final RegistryManager registryManager;
+    private final ConcurrentNavigableMap<String, String> serviceDefinitions = new ConcurrentSkipListMap<>();
+    private URL url;
+
+    public MetadataServiceDelegation(ApplicationModel applicationModel) {
+        this.applicationModel = applicationModel;
+        registryManager = RegistryManager.getInstance(applicationModel);
+    }
+
+    /**
+     * Gets the current Dubbo Service name
+     *
+     * @return non-null
+     */
+    @Override
+    public String serviceName() {
+        return ApplicationModel.ofNullable(applicationModel).getApplicationName();
+    }
+
+    @Override
+    public URL getMetadataURL() {
+        return url;
+    }
+
+    public void setMetadataURL(URL url) {
+        this.url = url;
+    }
+
+    @Override
+    public SortedSet<String> getSubscribedURLs() {
+        return getAllUnmodifiableSubscribedURLs();
+    }
+
+    private SortedSet<String> getAllUnmodifiableServiceURLs() {
+        SortedSet<URL> bizURLs = new TreeSet<>(URLComparator.INSTANCE);
+        List<ServiceDiscovery> serviceDiscoveries = registryManager.getServiceDiscoveries();
+        for (ServiceDiscovery sd : serviceDiscoveries) {
+            MetadataInfo metadataInfo = sd.getLocalMetadata();
+            Map<String, SortedSet<URL>> serviceURLs = metadataInfo.getExportedServiceURLs();
+            for (Map.Entry<String, SortedSet<URL>> entry : serviceURLs.entrySet()) {
+                SortedSet<URL> urls = entry.getValue();
+                if (urls != null) {
+                    for (URL url : urls) {
+                        if (!MetadataService.class.getName().equals(url.getServiceInterface())) {
+                            bizURLs.add(url);
+                        }
+                    }
+                }
+            }
+        }
+        return MetadataService.toSortedStrings(bizURLs);
+    }
+
+    private SortedSet<String> getAllUnmodifiableSubscribedURLs() {
+        SortedSet<URL> bizURLs = new TreeSet<>(URLComparator.INSTANCE);
+        List<ServiceDiscovery> serviceDiscoveries = registryManager.getServiceDiscoveries();
+        for (ServiceDiscovery sd : serviceDiscoveries) {
+            MetadataInfo metadataInfo = sd.getLocalMetadata();
+            Map<String, SortedSet<URL>> serviceURLs = metadataInfo.getSubscribedServiceURLs();
+            for (Map.Entry<String, SortedSet<URL>> entry : serviceURLs.entrySet()) {
+                SortedSet<URL> urls = entry.getValue();
+                if (urls != null) {
+                    for (URL url : urls) {
+                        if (!MetadataService.class.getName().equals(url.getServiceInterface())) {
+                            bizURLs.add(url);
+                        }
+                    }
+                }
+            }
+        }
+        return MetadataService.toSortedStrings(bizURLs);
+    }
+
+    @Override
+    public SortedSet<String> getExportedURLs(String serviceInterface, String group, String version, String protocol) {
+        if (ALL_SERVICE_INTERFACES.equals(serviceInterface)) {
+            return getAllUnmodifiableServiceURLs();
+        }
+        String serviceKey = buildKey(serviceInterface, group, version);
+        return unmodifiableSortedSet(getServiceURLs(getAllServiceURLs(), serviceKey, protocol));
+    }
+
+    private Map<String, SortedSet<URL>> getAllServiceURLs () {
+        List<ServiceDiscovery> serviceDiscoveries = registryManager.getServiceDiscoveries();
+        Map<String, SortedSet<URL>> allServiceURLs = new HashMap<>();
+        for (ServiceDiscovery sd : serviceDiscoveries) {
+            MetadataInfo metadataInfo = sd.getLocalMetadata();
+            Map<String, SortedSet<URL>> serviceURLs = metadataInfo.getExportedServiceURLs();
+            allServiceURLs.putAll(serviceURLs);
+        }
+        return allServiceURLs;
+    }
+
+    @Override
+    public Set<URL> getExportedServiceURLs() {
+        Set<URL> set = new HashSet<>();
+        registryManager.getRegistries();
+        for (Map.Entry<String, SortedSet<URL>> entry : getAllServiceURLs().entrySet()) {
+            set.addAll(entry.getValue());
+        }
+        return set;
+    }
+
+    @Override
+    public String getServiceDefinition(String interfaceName, String version, String group) {
+        return serviceDefinitions.get(URL.buildKey(interfaceName, group, version));
+    }
+
+    @Override
+    public String getServiceDefinition(String serviceKey) {
+        return serviceDefinitions.get(serviceKey);
+    }
+
+    @Override
+    public MetadataInfo getMetadataInfo(String revision) {
+        if (StringUtils.isEmpty(revision)) {
+            return null;
+        }
+
+        for (ServiceDiscovery sd : registryManager.getServiceDiscoveries()) {
+            MetadataInfo metadataInfo = sd.getLocalMetadata();
+            if (revision.equals(metadataInfo.getRevision())) {
+                return metadataInfo;
+            }
+        }
+
+        if (logger.isWarnEnabled()) {
+            logger.warn("metadata not found for revision: " + revision);
+        }
+        return null;
+    }
+
+    @Override
+    public List<MetadataInfo> getMetadataInfos() {
+        List<MetadataInfo> metadataInfos = new ArrayList<>();
+        for (ServiceDiscovery sd : registryManager.getServiceDiscoveries()) {
+            metadataInfos.add(sd.getLocalMetadata());
+        }
+        return metadataInfos;
+    }
+
+    private SortedSet<String> getServiceURLs(Map<String, SortedSet<URL>> exportedServiceURLs, String serviceKey,
+                                             String protocol) {
+
+        SortedSet<URL> serviceURLs = exportedServiceURLs.get(serviceKey);
+
+        if (isEmpty(serviceURLs)) {
+            return emptySortedSet();
+        }
+
+        return MetadataService.toSortedStrings(serviceURLs.stream().filter(url -> isAcceptableProtocol(protocol, url)));
+    }
+
+    private boolean isAcceptableProtocol(String protocol, URL url) {
+        return protocol == null
+            || protocol.equals(url.getParameter(PROTOCOL_KEY))
+            || protocol.equals(url.getProtocol());
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+
+
+    static class URLComparator implements Comparator<URL> {
+
+        public static final URLComparator INSTANCE = new URLComparator();
+
+        @Override
+        public int compare(URL o1, URL o2) {
+            return o1.toFullString().compareTo(o2.toFullString());
+        }
+    }
+}
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 56%
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 d584c74..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,12 +14,20 @@
  * 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.metadata.WritableMetadataService;
+import org.apache.dubbo.common.BaseServiceMetadata;
+import org.apache.dubbo.common.URL;
+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;
 
 import static org.apache.dubbo.common.utils.StringUtils.isBlank;
@@ -32,12 +40,12 @@ import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataU
 public class MetadataServiceURLParamsMetadataCustomizer implements ServiceInstanceCustomizer {
 
     @Override
-    public void customize(ServiceInstance serviceInstance) {
+    public void customize(ServiceInstance serviceInstance, ApplicationModel applicationModel) {
 
         Map<String, String> metadata = serviceInstance.getMetadata();
 
         String propertyName = resolveMetadataPropertyName(serviceInstance);
-        String propertyValue = resolveMetadataPropertyValue(serviceInstance);
+        String propertyValue = resolveMetadataPropertyValue(applicationModel);
 
         if (!isBlank(propertyName) && !isBlank(propertyValue)) {
             metadata.put(propertyName, propertyValue);
@@ -48,8 +56,17 @@ public class MetadataServiceURLParamsMetadataCustomizer implements ServiceInstan
         return METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME;
     }
 
-    private String resolveMetadataPropertyValue(ServiceInstance serviceInstance) {
-        WritableMetadataService writableMetadataService = WritableMetadataService.getDefaultExtension(serviceInstance.getApplicationModel());
-        return getMetadataServiceParameter(writableMetadataService.getMetadataServiceURL());
+    private String resolveMetadataPropertyValue(ApplicationModel applicationModel) {
+        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 metadataValue;
     }
 }
diff --git a/dubbo-config/dubbo-config-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.deploy.ApplicationDeployListener b/dubbo-config/dubbo-config-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.deploy.ApplicationDeployListener
new file mode 100644
index 0000000..0074701
--- /dev/null
+++ b/dubbo-config/dubbo-config-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.deploy.ApplicationDeployListener
@@ -0,0 +1 @@
+exporter=org.apache.dubbo.config.metadata.ExporterDeployListener
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..f3cb706 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 @@
-port=org.apache.dubbo.config.metadata.ServiceInstanceHostPortCustomizer
\ No newline at end of file
+metadata-url=org.apache.dubbo.config.metadata.MetadataServiceURLParamsMetadataCustomizer
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractMethodConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractMethodConfigTest.java
index ceb63d5..2c75a18 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractMethodConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractMethodConfigTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config;
 
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
index 858fcf0..7eb8c74 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
@@ -18,6 +18,7 @@
 package org.apache.dubbo.config;
 
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigScopeModelInitializerTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigScopeModelInitializerTest.java
index a527097..f80f546 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigScopeModelInitializerTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigScopeModelInitializerTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.config;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConsumerConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConsumerConfigTest.java
index 1afaeab..6bc617c 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConsumerConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConsumerConfigTest.java
@@ -20,6 +20,7 @@ package org.apache.dubbo.config;
 import org.apache.dubbo.config.api.DemoService;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
index adae9ec..5677e67 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
@@ -20,6 +20,7 @@ package org.apache.dubbo.config;
 import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.context.ConfigManager;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java
index 10186e1..d2b7ba5 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java
@@ -21,8 +21,8 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.UrlUtils;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.rpc.model.ApplicationModel;
-
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
index ceb24b1..771d8d4 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.dubbo.config;
 
-import com.google.common.collect.Lists;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.config.api.DemoService;
@@ -33,6 +32,8 @@ import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.service.GenericService;
+
+import com.google.common.collect.Lists;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
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 15707bd..7b79bf0 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
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.bootstrap;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.deploy.ApplicationDeployListener;
 import org.apache.dubbo.common.url.component.ServiceConfigURL;
 import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.common.utils.ReflectUtils;
@@ -31,19 +32,18 @@ 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.metadata.ExporterDeployListener;
 import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
 import org.apache.dubbo.config.utils.ConfigValidationUtils;
-import org.apache.dubbo.metadata.MetadataInfo;
 import org.apache.dubbo.metadata.MetadataService;
-import org.apache.dubbo.metadata.MetadataServiceExporter;
-import org.apache.dubbo.metadata.WritableMetadataService;
 import org.apache.dubbo.monitor.MonitorService;
 import org.apache.dubbo.registry.RegistryService;
 import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol;
-
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
@@ -249,7 +249,6 @@ public class DubboBootstrapTest {
 
         ApplicationModel applicationModel = bootstrap.getApplicationModel();
         DefaultApplicationDeployer applicationDeployer = getApplicationDeployer(applicationModel);
-        Assertions.assertNotNull(ReflectUtils.getFieldValue(applicationDeployer, "serviceInstance"));
         Assertions.assertNotNull(ReflectUtils.getFieldValue(applicationDeployer, "asyncMetadataFuture"));
         Assertions.assertTrue(applicationModel.getDefaultModule().getServiceRepository().getExportedServices().size() > 0);
     }
@@ -321,31 +320,27 @@ public class DubboBootstrapTest {
 
     }
 
-    private void assertMetadataService(DubboBootstrap bootstrap, int availablePort, boolean shouldReport) {
-        DefaultApplicationDeployer applicationDeployer = getApplicationDeployer(bootstrap.getApplicationModel());
-        MetadataServiceExporter metadataServiceExporter = ReflectUtils.getFieldValue(applicationDeployer, "metadataServiceExporter");
+    private ExporterDeployListener getListener(ApplicationModel model) {
+        return (ExporterDeployListener)model.getExtensionLoader(ApplicationDeployListener.class).getExtension("exporter");
+    }
+
+    private void assertMetadataService(DubboBootstrap bootstrap, int availablePort, boolean metadataExported) {
+        ExporterDeployListener listener = getListener(bootstrap.getApplicationModel());
+        ConfigurableMetadataServiceExporter metadataServiceExporter = listener.getMetadataServiceExporter();
+        Assertions.assertEquals(metadataExported, metadataServiceExporter.isExported());
         DubboProtocol protocol = DubboProtocol.getDubboProtocol(bootstrap.getApplicationModel());
         Map<String, Exporter<?>> exporters = protocol.getExporterMap();
-
-        ServiceConfig<MetadataService> serviceConfig = new ServiceConfig<>();
-        serviceConfig.setRegistry(new RegistryConfig("N/A"));
-        serviceConfig.setInterface(MetadataService.class);
-        serviceConfig.setGroup(ApplicationModel.defaultModel().getCurrentConfig().getName());
-        serviceConfig.setVersion(MetadataService.VERSION);
-
-        WritableMetadataService metadataService = WritableMetadataService.getDefaultExtension(ApplicationModel.defaultModel());
-        MetadataInfo metadataInfo = metadataService.getDefaultMetadataInfo();
-
-        Assertions.assertNotNull(metadataInfo);
-        if (shouldReport) {
-            Assertions.assertTrue(metadataServiceExporter.isExported());
+        if (metadataExported) {
             Assertions.assertEquals(2, exporters.size());
+
+            ServiceConfig<MetadataService> serviceConfig = new ServiceConfig<>();
+            serviceConfig.setRegistry(new RegistryConfig("N/A"));
+            serviceConfig.setInterface(MetadataService.class);
+            serviceConfig.setGroup(ApplicationModel.defaultModel().getCurrentConfig().getName());
+            serviceConfig.setVersion(MetadataService.VERSION);
             assertThat(exporters, hasEntry(is(serviceConfig.getUniqueServiceName() + ":" + availablePort), anything()));
-            Assertions.assertFalse(metadataInfo.hasReported());
         } else {
-            Assertions.assertFalse(metadataServiceExporter.isExported());
             Assertions.assertEquals(1, exporters.size());
-            Assertions.assertTrue(metadataInfo.hasReported());
         }
     }
 
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
index b4f4698..1db7599 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
@@ -43,6 +43,7 @@ import org.apache.dubbo.rpc.model.ModuleModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
 import org.apache.dubbo.test.check.DubboTestChecker;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilderTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilderTest.java
index 092efae..157b73d 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilderTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/AbstractInterfaceBuilderTest.java
@@ -23,8 +23,8 @@ import org.apache.dubbo.config.MetadataReportConfig;
 import org.apache.dubbo.config.ModuleConfig;
 import org.apache.dubbo.config.MonitorConfig;
 import org.apache.dubbo.config.RegistryConfig;
-
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportmetadata/MultipleRegistryCenterExportMetadataIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportmetadata/MultipleRegistryCenterExportMetadataIntegrationTest.java
index 4468434..8d11269 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportmetadata/MultipleRegistryCenterExportMetadataIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportmetadata/MultipleRegistryCenterExportMetadataIntegrationTest.java
@@ -17,10 +17,10 @@
 package org.apache.dubbo.config.integration.multiple.exportmetadata;
 
 import org.apache.dubbo.common.extension.ExtensionLoader;
-import org.apache.dubbo.config.RegistryConfig;
-import org.apache.dubbo.config.ServiceConfig;
 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.ServiceListener;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.integration.IntegrationTest;
@@ -29,6 +29,7 @@ import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.ExporterListener;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java
index 3f9a4c4..a98fa58 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java
@@ -34,6 +34,7 @@ import org.apache.dubbo.rpc.ExporterListener;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/injvm/MultipleRegistryCenterInjvmIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/injvm/MultipleRegistryCenterInjvmIntegrationTest.java
index 291f559..cdc3adf 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/injvm/MultipleRegistryCenterInjvmIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/injvm/MultipleRegistryCenterInjvmIntegrationTest.java
@@ -28,6 +28,7 @@ import org.apache.dubbo.config.integration.IntegrationTest;
 import org.apache.dubbo.rpc.ExporterListener;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest.java
index aa61d4a..1c2b154 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest.java
@@ -25,10 +25,11 @@ import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.ServiceConfig;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.integration.IntegrationTest;
+import org.apache.dubbo.config.metadata.MetadataServiceDelegation;
 import org.apache.dubbo.registry.RegistryServiceListener;
-import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;
-import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperConfig;
+import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -172,15 +173,15 @@ public class MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest imple
             Assertions.assertTrue(serviceDiscoveryRegistryInfoWrapper.isRegistered());
             // check if it's subscribed
             Assertions.assertFalse(serviceDiscoveryRegistryInfoWrapper.isSubscribed());
-            InMemoryWritableMetadataService inMemoryWritableMetadataService = serviceDiscoveryRegistryInfoWrapper.getInMemoryWritableMetadataService();
+            MetadataServiceDelegation metadataService = DubboBootstrap.getInstance().getApplicationModel().getBeanFactory().getBean(MetadataServiceDelegation.class);
             // 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(2, metadataService.getMetadataInfos().size());
         }
     }
 
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
index 519f75a..f84a9b8 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
@@ -18,11 +18,9 @@ package org.apache.dubbo.config.integration.multiple.servicediscoveryregistry;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Activate;
-import org.apache.dubbo.metadata.WritableMetadataService;
 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.InMemoryWritableMetadataService;
 
 import static org.apache.dubbo.config.integration.Constants.MULTIPLE_CONFIG_CENTER_SERVICE_DISCOVERY_REGISTRY;
 
@@ -43,7 +41,6 @@ public class MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListen
         serviceDiscoveryRegistryInfoWrapper.setHost(host);
         serviceDiscoveryRegistryInfoWrapper.setPort(port);
         serviceDiscoveryRegistryInfoWrapper.setServiceDiscoveryRegistry(serviceDiscoveryRegistry);
-        serviceDiscoveryRegistryInfoWrapper.setInMemoryWritableMetadataService((InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension(url.getScopeModel()));
         serviceDiscoveryRegistryInfoWrapper.setRegistered(true);
         return serviceDiscoveryRegistryInfoWrapper;
     }
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java
index a5f35f8..be60e4e 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java
@@ -16,17 +16,16 @@
  */
 package org.apache.dubbo.config.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.InMemoryWritableMetadataService;
 
 /**
  * The instance to wrap {@link org.apache.dubbo.registry.client.ServiceDiscoveryRegistry}
- * and {@link org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService}
  */
 public class ServiceDiscoveryRegistryInfoWrapper {
 
     private ServiceDiscoveryRegistry serviceDiscoveryRegistry;
-    private InMemoryWritableMetadataService inMemoryWritableMetadataService;
+    private MetadataServiceDelegation inMemoryWritableMetadataService;
     private boolean registered;
     private boolean subscribed;
     private String host;
@@ -40,14 +39,6 @@ public class ServiceDiscoveryRegistryInfoWrapper {
         this.serviceDiscoveryRegistry = serviceDiscoveryRegistry;
     }
 
-    public InMemoryWritableMetadataService getInMemoryWritableMetadataService() {
-        return inMemoryWritableMetadataService;
-    }
-
-    public void setInMemoryWritableMetadataService(InMemoryWritableMetadataService inMemoryWritableMetadataService) {
-        this.inMemoryWritableMetadataService = inMemoryWritableMetadataService;
-    }
-
     public boolean isRegistered() {
         return registered;
     }
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java
index 5b4b8dd..290c863 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java
@@ -27,19 +27,20 @@ import org.apache.dubbo.config.ServiceConfig;
 import org.apache.dubbo.config.ServiceListener;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.integration.IntegrationTest;
+import org.apache.dubbo.config.metadata.MetadataServiceDelegation;
 import org.apache.dubbo.metadata.MetadataInfo;
-import org.apache.dubbo.metadata.WritableMetadataService;
+import org.apache.dubbo.metadata.MetadataService;
 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.InMemoryWritableMetadataService;
 import org.apache.dubbo.registry.client.migration.MigrationInvoker;
 import org.apache.dubbo.registry.support.RegistryManager;
 import org.apache.dubbo.registry.zookeeper.ZookeeperServiceDiscovery;
 import org.apache.dubbo.rpc.cluster.Directory;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -172,8 +173,6 @@ public class SingleRegistryCenterDubboProtocolIntegrationTest implements Integra
      *     <li>Protocol port is right or not</li>
      *     <li>ServiceDiscoveryRegistry's protocol is right or not</li>
      *     <li>Registered service in registry center is right or not</li>
-     *     <li>Exported url is right or not in InMemoryWritableMetadataService</li>
-     *     <li>MetadataInfo exists or not in InMemoryWritableMetadataService</li>
      *     <li>MetadataInfo has reported or not</li>
      *     <li>MetadataInfo has reported or not has service or not</li>
      *     <li>MetadataInfo's application name is right or not</li>
@@ -224,24 +223,18 @@ public class SingleRegistryCenterDubboProtocolIntegrationTest implements Integra
         Assertions.assertTrue(services.contains(PROVIDER_APPLICATION_NAME));
 
         // obtain InMemoryWritableMetadataService instance
-        InMemoryWritableMetadataService inMemoryWritableMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension(serviceConfig.getScopeModel());
+        MetadataServiceDelegation inMemoryWritableMetadataService = (MetadataServiceDelegation) serviceConfig.getScopeModel().getBeanFactory().getBean(MetadataService.class);
         // Exported url is right or not in InMemoryWritableMetadataService
         Assertions.assertEquals(inMemoryWritableMetadataService.getExportedURLs().size(), 1);
         // MetadataInfo exists or not in InMemoryWritableMetadataService
-        Assertions.assertFalse(inMemoryWritableMetadataService.getMetadataInfos().values().isEmpty());
-        // get MetadataInfo
-        MetadataInfo metadataInfo = inMemoryWritableMetadataService.getMetadataInfos().get("default");
-        // MetadataInfo exists or not in InMemoryWritableMetadataService
-        Assertions.assertNotNull(metadataInfo);
-        // MetadataInfo has reported or not
-        Assertions.assertFalse(metadataInfo.hasReported());
+        Assertions.assertFalse(inMemoryWritableMetadataService.getMetadataInfos().isEmpty());
         // MetadataInfo has reported or not has service or not
-        Assertions.assertFalse(metadataInfo.getServices().isEmpty());
+        Assertions.assertFalse(inMemoryWritableMetadataService.getMetadataInfos().get(0).getServices().isEmpty());
         // MetadataInfo has reported or not has service or not
-        Assertions.assertEquals(metadataInfo.getServices().size(), 1);
+        Assertions.assertEquals(inMemoryWritableMetadataService.getMetadataInfos().get(0).getServices().size(), 1);
         // obtain the service's key
         String key = SingleRegistryCenterIntegrationService.class.getName() + ":" + PROTOCOL_NAME;
-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServices().get(key);
+        MetadataInfo.ServiceInfo serviceInfo = inMemoryWritableMetadataService.getMetadataInfos().get(0).getServices().get(key);
         // MetadataInfo's service exists or not
         Assertions.assertNotNull(serviceInfo);
         // The name of MetadataInfo's service is right or not
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportmetadata/SingleRegistryCenterExportMetadataIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportmetadata/SingleRegistryCenterExportMetadataIntegrationTest.java
index bfab1a6..6f2f3e6 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportmetadata/SingleRegistryCenterExportMetadataIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportmetadata/SingleRegistryCenterExportMetadataIntegrationTest.java
@@ -17,10 +17,10 @@
 package org.apache.dubbo.config.integration.single.exportmetadata;
 
 import org.apache.dubbo.common.extension.ExtensionLoader;
-import org.apache.dubbo.config.RegistryConfig;
-import org.apache.dubbo.config.ServiceConfig;
 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.ServiceListener;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.integration.IntegrationTest;
@@ -29,6 +29,7 @@ import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.ExporterListener;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java
index 3c9b9cb..16398b1 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java
@@ -34,6 +34,7 @@ import org.apache.dubbo.rpc.ExporterListener;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/injvm/SingleRegistryCenterInjvmIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/injvm/SingleRegistryCenterInjvmIntegrationTest.java
index 4e1bab9..fc414df 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/injvm/SingleRegistryCenterInjvmIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/injvm/SingleRegistryCenterInjvmIntegrationTest.java
@@ -28,6 +28,7 @@ import org.apache.dubbo.config.integration.IntegrationTest;
 import org.apache.dubbo.rpc.ExporterListener;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/MetadataServiceExporterTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/MetadataServiceExporterTest.java
deleted file mode 100644
index da704e4..0000000
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/MetadataServiceExporterTest.java
+++ /dev/null
@@ -1,252 +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.config.metadata;
-
-import org.apache.dubbo.common.URL;
-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.provider.impl.DemoServiceImpl;
-import org.apache.dubbo.metadata.MetadataService;
-import org.apache.dubbo.metadata.MetadataServiceExporter;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.rpc.model.FrameworkModel;
-import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-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
-    public void init() {
-        DubboBootstrap.reset();
-
-        ApplicationConfig applicationConfig = new ApplicationConfig("Test");
-        applicationConfig.setRegisterConsumer(true);
-        ApplicationModel.defaultModel().getApplicationConfigManager().setApplication(applicationConfig);
-        ApplicationModel.defaultModel().getApplicationConfigManager().addRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
-        ApplicationModel.defaultModel().getApplicationConfigManager().addProtocol(new ProtocolConfig("injvm"));
-    }
-
-    @Test
-    public void test() {
-        MetadataService metadataService = Mockito.mock(MetadataService.class);
-        ConfigurableMetadataServiceExporter exporter = new ConfigurableMetadataServiceExporter();
-        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();
-        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());
-    }
-
-    /**
-     * test reuse of port started by normal service
-     */
-    @Test
-    public void testPortReuse() throws Exception {
-        DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
-        ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>();
-        serviceConfig.setInterface(DemoService.class);
-        serviceConfig.setRef(new DemoServiceImpl());
-
-        ApplicationConfig applicationConfig = new ApplicationConfig("exporter-test");
-        applicationConfig.setMetadataType(DEFAULT_METADATA_STORAGE_TYPE);
-
-        providerBootstrap
-            .application(applicationConfig)
-            .registry(registryConfig)
-            .protocol(new ProtocolConfig("dubbo", 2002))
-            .service(serviceConfig);
-
-        // will start exporter
-        providerBootstrap.start();
-        ConfigurableMetadataServiceExporter exporter = (ConfigurableMetadataServiceExporter) providerBootstrap.getApplicationModel().getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
-
-        try {
-            assertTrue(exporter.isExported());
-            List<URL> urls = exporter.getExportedURLs();
-            assertNotNull(urls);
-            assertEquals(2002, urls.get(0).getPort());
-            assertEquals(DUBBO_PROTOCOL, urls.get(0).getProtocol());
-        } finally {
-            providerBootstrap.stop();
-        }
-        assertFalse(exporter.isExported());
-    }
-
-    /**
-     * test user specified port and protocol
-     * @throws Exception
-     */
-    @Test
-    public void testSpecifiedPortAndProtocol() throws Exception {
-        DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
-        ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>();
-        serviceConfig.setInterface(DemoService.class);
-        serviceConfig.setRef(new DemoServiceImpl());
-
-        ApplicationConfig applicationConfig = new ApplicationConfig("exporter-test");
-        applicationConfig.setMetadataType(DEFAULT_METADATA_STORAGE_TYPE);
-        applicationConfig.setMetadataServiceProtocol("tri");
-        applicationConfig.setMetadataServicePort(8089);
-
-        providerBootstrap
-            .application(applicationConfig)
-            .registry(registryConfig)
-            .protocol(new ProtocolConfig("dubbo", 2002))
-            .service(serviceConfig);
-
-        // will start exporter.export()
-        providerBootstrap.start();
-        ConfigurableMetadataServiceExporter exporter = (ConfigurableMetadataServiceExporter) providerBootstrap.getApplicationModel().getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
-
-        try {
-            assertTrue(exporter.isExported());
-            List<URL> urls = exporter.getExportedURLs();
-            assertNotNull(urls);
-            assertEquals(8089, urls.get(0).getPort());
-            assertEquals("tri", urls.get(0).getProtocol());
-        } finally {
-            providerBootstrap.stop();
-        }
-        assertFalse(exporter.isExported());
-    }
-
-    @Test
-    public void testMetadataStartsBeforeNormalService() throws Exception {
-        DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
-        ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>();
-        serviceConfig.setInterface(DemoService.class);
-        serviceConfig.setRef(new DemoServiceImpl());
-        serviceConfig.setDelay(1000);
-
-        ApplicationConfig applicationConfig = new ApplicationConfig("exporter-test");
-        applicationConfig.setMetadataType(DEFAULT_METADATA_STORAGE_TYPE);
-//        applicationConfig.setMetadataServiceProtocol("triple");
-//        applicationConfig.setMetadataServicePort(8089);
-
-        providerBootstrap
-            .application(applicationConfig)
-            .registry(registryConfig)
-            .protocol(new ProtocolConfig("dubbo", 2002))
-            .service(serviceConfig);
-
-        // will start exporter.export()
-        providerBootstrap.start();
-        ConfigurableMetadataServiceExporter exporter = (ConfigurableMetadataServiceExporter) providerBootstrap.getApplicationModel().getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
-
-        try {
-            assertTrue(exporter.isExported());
-            List<URL> urls = exporter.getExportedURLs();
-            assertNotNull(urls);
-            assertNotEquals(2002, urls.get(0).getPort());
-            assertEquals("dubbo", urls.get(0).getProtocol());
-        } finally {
-            providerBootstrap.stop();
-        }
-        assertFalse(exporter.isExported());
-    }
-//
-//    /**
-//     * test multiple protocols
-//     * @throws Exception
-//     */
-//    @Test
-//    public void testMultiProtocols() throws Exception {
-//        DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
-//        ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>();
-//        serviceConfig.setInterface(DemoService.class);
-//        serviceConfig.setRef(new DemoServiceImpl());
-//
-//        providerBootstrap
-//            .application("provider-app")
-//            .registry(registryConfig)
-//            .protocol(new ProtocolConfig("dubbo", 2002))
-//            .service(serviceConfig);
-//
-//        ConfigurableMetadataServiceExporter exporter = (ConfigurableMetadataServiceExporter) applicationModel.getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
-//        MetadataService metadataService = Mockito.mock(MetadataService.class);
-//        exporter.setMetadataService(metadataService);
-//
-//        try {
-//            providerBootstrap.start();
-//            assertTrue(exporter.isExported());
-//            assertTrue(exporter.supports(DEFAULT_METADATA_STORAGE_TYPE));
-//            assertTrue(exporter.supports(REMOTE_METADATA_STORAGE_TYPE));
-//            assertTrue(exporter.supports(COMPOSITE_METADATA_STORAGE_TYPE));
-//        } finally {
-//            providerBootstrap.stop();
-//        }
-//        assertFalse(exporter.isExported());
-//    }
-
-    private static RegistryConfig registryConfig;
-
-    @BeforeAll
-    public static void beforeAll() {
-        FrameworkModel.destroyAll();
-        registryConfig = new RegistryConfig(ZookeeperRegistryCenterConfig.getConnectionAddress());
-        // pre-check threads
-        //precheckUnclosedThreads();
-    }
-
-}
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 50%
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 f3ea39d..d3fe734 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,43 +14,46 @@
  * 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 com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.metadata.MetadataService;
-import org.apache.dubbo.metadata.WritableMetadataService;
+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.provider.impl.DemoServiceImpl;
 import org.apache.dubbo.registry.client.DefaultServiceInstance;
-import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 
 import java.io.IOException;
 import java.util.Map;
 
 import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;
 import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PORT_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
 import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 public class MetadataServiceURLParamsMetadataCustomizerTest {
     private static final Gson gson = new Gson();
 
     public DefaultServiceInstance instance;
-    private InMemoryWritableMetadataService 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");
+    private URL metadataServiceURL = URL.valueOf("dubbo://10.225.12.124:20880/org.apache.dubbo.metadata.MetadataService" +
+        "?application=MetadataServiceURLParamsMetadataCustomizerTest&group=MetadataServiceURLParamsMetadataCustomizerTest" +
+        "&interface=org.apache.dubbo.metadata.MetadataService&side=provider&timestamp=1637573430740&version=1.0.0");
 
 
     public static DefaultServiceInstance createInstance() {
@@ -60,8 +63,6 @@ public class MetadataServiceURLParamsMetadataCustomizerTest {
     @BeforeEach
     public void init() {
         instance = createInstance();
-        metadataService = mock(InMemoryWritableMetadataService.class);
-        when(metadataService.getMetadataServiceURL()).thenReturn(metadataServiceURL);
     }
 
     @AfterEach
@@ -71,22 +72,38 @@ public class MetadataServiceURLParamsMetadataCustomizerTest {
 
     @Test
     public void test() {
+        DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
+        ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>();
+        serviceConfig.setInterface(DemoService.class);
+        serviceConfig.setRef(new DemoServiceImpl());
+        serviceConfig.setDelay(1000);
+
+        ApplicationConfig applicationConfig = new ApplicationConfig("MetadataServiceURLParamsMetadataCustomizerTest");
+        applicationConfig.setMetadataType(DEFAULT_METADATA_STORAGE_TYPE);
+
+        providerBootstrap
+            .application(applicationConfig)
+            .registry(new RegistryConfig("N/A"))
+            .protocol(new ProtocolConfig("dubbo", 2002))
+            .service(serviceConfig);
+
+        // will start exporter.export()
+        providerBootstrap.start();
+
+        ApplicationModel applicationModel = providerBootstrap.getApplicationModel();
         MetadataServiceURLParamsMetadataCustomizer customizer = new MetadataServiceURLParamsMetadataCustomizer();
-        try (MockedStatic<WritableMetadataService> mockMetadataService = Mockito.mockStatic(WritableMetadataService.class)) {
-            mockMetadataService.when(() -> WritableMetadataService.getDefaultExtension(ApplicationModel.defaultModel())).thenReturn(metadataService);
-            customizer.customize(instance);
-
-            String val = instance.getMetadata().get(METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME);
-            Assertions.assertNotNull(val);
-
-            Map<String, String> map = gson.fromJson(val, new TypeToken<Map<String, String>>() {
-            }.getType());
-            Assertions.assertEquals(map.get(PORT_KEY), String.valueOf(metadataServiceURL.getPort()));
-            Assertions.assertEquals(map.get(PROTOCOL_KEY), metadataServiceURL.getProtocol());
-            Assertions.assertEquals(map.get(VERSION_KEY), metadataServiceURL.getVersion());
-            Assertions.assertFalse(map.containsKey(TIMESTAMP_KEY));
-            Assertions.assertFalse(map.containsKey(GROUP_KEY));
-            Assertions.assertFalse(map.containsKey(APPLICATION_KEY));
-        }
+        customizer.customize(instance, applicationModel);
+
+        String val = instance.getMetadata().get(METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME);
+        Assertions.assertNotNull(val);
+
+        Map<String, String> map = gson.fromJson(val, new TypeToken<Map<String, String>>() {
+        }.getType());
+        Assertions.assertEquals(map.get(PORT_KEY), String.valueOf(metadataServiceURL.getPort()));
+        Assertions.assertEquals(map.get(PROTOCOL_KEY), metadataServiceURL.getProtocol());
+        Assertions.assertEquals(map.get(VERSION_KEY), metadataServiceURL.getVersion());
+        Assertions.assertFalse(map.containsKey(TIMESTAMP_KEY));
+        Assertions.assertFalse(map.containsKey(GROUP_KEY));
+        Assertions.assertFalse(map.containsKey(APPLICATION_KEY));
     }
 }
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/ServiceInstanceHostPortCustomizerTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/ServiceInstanceHostPortCustomizerTest.java
deleted file mode 100644
index ebad6d9..0000000
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/ServiceInstanceHostPortCustomizerTest.java
+++ /dev/null
@@ -1,87 +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.config.metadata;
-
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.config.ApplicationConfig;
-import org.apache.dubbo.metadata.WritableMetadataService;
-import org.apache.dubbo.registry.client.DefaultServiceInstance;
-import org.apache.dubbo.registry.client.ServiceInstance;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-import org.apache.dubbo.rpc.model.FrameworkModel;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-
-/**
- * Test for https://github.com/apache/dubbo/issues/8698
- */
-class ServiceInstanceHostPortCustomizerTest {
-    private static ServiceInstanceHostPortCustomizer serviceInstanceHostPortCustomizer;
-    private static ApplicationModel applicationModel;
-
-    @BeforeAll
-    public static void setUp() {
-        applicationModel = new ApplicationModel(new FrameworkModel());
-        applicationModel.getApplicationConfigManager().setApplication(new ApplicationConfig("service-preferredProtocol"));
-        serviceInstanceHostPortCustomizer = new ServiceInstanceHostPortCustomizer();
-    }
-
-    @AfterAll
-    public static void clearUp() {
-        applicationModel.destroy();
-    }
-    
-    @Test
-    void customizePreferredProtocol() {
-        WritableMetadataService writableMetadataService = WritableMetadataService.getDefaultExtension(applicationModel);
-        
-        // Only have tri protocol
-        writableMetadataService.exportURL(
-            URL.valueOf("tri://127.1.1.1:50052/org.apache.dubbo.demo.GreetingService")
-        );
-        
-        // Trigger the fallback strategy
-        ServiceInstance serviceInstance1 = new DefaultServiceInstance("without-preferredProtocol", applicationModel);
-        serviceInstanceHostPortCustomizer.customize(serviceInstance1);
-        Assertions.assertEquals("127.1.1.1", serviceInstance1.getHost());
-        Assertions.assertEquals(50052, serviceInstance1.getPort());
-        
-        
-        // Add the default protocol
-        writableMetadataService.exportURL(
-            URL.valueOf("dubbo://127.1.2.3:20889/org.apache.dubbo.demo.HelloService")
-        );
-        
-        // pick the preferredProtocol, but not found, so trigger the fallback strategy
-        ApplicationConfig applicationConfig = applicationModel.getApplicationConfigManager().getApplication().get();
-        applicationConfig.setProtocol("not-exist-protocol");
-        ServiceInstance serviceInstance2 = new DefaultServiceInstance("with-preferredProtocol", applicationModel);
-        serviceInstanceHostPortCustomizer.customize(serviceInstance2);
-        Assertions.assertEquals("127.1.2.3", serviceInstance2.getHost());
-        Assertions.assertEquals(20889, serviceInstance2.getPort());
-
-        // pick the preferredProtocol(tri)
-        applicationConfig = applicationModel.getApplicationConfigManager().getApplication().get();
-        applicationConfig.setProtocol("tri");
-        ServiceInstance serviceInstance3 = new DefaultServiceInstance("with-preferredProtocol", applicationModel);
-        serviceInstanceHostPortCustomizer.customize(serviceInstance3);
-        Assertions.assertEquals("127.1.1.1", serviceInstance3.getHost());
-        Assertions.assertEquals(50052, serviceInstance3.getPort());
-    }
-}
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockServiceDiscovery.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockServiceDiscovery.java
index 3044dcb..11f584c 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockServiceDiscovery.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockServiceDiscovery.java
@@ -19,16 +19,22 @@ package org.apache.dubbo.config.mock;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.registry.client.AbstractServiceDiscovery;
 import org.apache.dubbo.registry.client.ServiceInstance;
+import org.apache.dubbo.rpc.model.ApplicationModel;
 
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 public class MockServiceDiscovery extends AbstractServiceDiscovery {
     private URL registryURL;
 
-    @Override
-    public void doInitialize(URL registryURL) throws Exception {
-        this.registryURL = registryURL;
+    public MockServiceDiscovery(ApplicationModel applicationModel, URL registryURL) {
+        super(applicationModel, registryURL);
+    }
+
+    public MockServiceDiscovery(String serviceName, URL registryURL) {
+        super(serviceName, registryURL);
     }
 
     @Override
@@ -57,6 +63,11 @@ public class MockServiceDiscovery extends AbstractServiceDiscovery {
     }
 
     @Override
+    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {
+        return Collections.emptyList();
+    }
+
+    @Override
     public URL getUrl() {
         return registryURL;
     }
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ConfigValidationUtilsTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ConfigValidationUtilsTest.java
index 8d98088..dabdb7a 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ConfigValidationUtilsTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ConfigValidationUtilsTest.java
@@ -18,9 +18,9 @@ package org.apache.dubbo.config.utils;
 
 import org.apache.dubbo.config.AbstractInterfaceConfig;
 import org.apache.dubbo.config.api.Greeting;
-
 import org.apache.dubbo.config.mock.GreetingMock1;
 import org.apache.dubbo.config.mock.GreetingMock2;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceCacheTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceCacheTest.java
index 2a74228..84d2029 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceCacheTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceCacheTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.utils.service.FooService;
+
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
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
new file mode 100644
index 0000000..6e60131
--- /dev/null
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/metadata/MetadataServiceExporterTest.java
@@ -0,0 +1,256 @@
+/*
+ * 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.deploy.ApplicationDeployListener;
+//import org.apache.dubbo.common.utils.NetUtils;
+//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.metadata.ConfigurableMetadataServiceExporter;
+//import org.apache.dubbo.config.metadata.ExporterDeployListener;
+//import org.apache.dubbo.config.metadata.MetadataServiceDelegation;
+//import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
+//import org.apache.dubbo.rpc.model.ApplicationModel;
+//import org.apache.dubbo.rpc.model.FrameworkModel;
+//import org.apache.dubbo.test.check.registrycenter.RegistryCenter;
+//
+//import org.junit.jupiter.api.BeforeAll;
+//import org.junit.jupiter.api.BeforeEach;
+//import org.junit.jupiter.api.Test;
+//import org.mockito.Mockito;
+//
+//import java.util.List;
+//
+//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.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;
+//
+//public class MetadataServiceExporterTest {
+//
+//    @BeforeEach
+//    public void init() {
+//        DubboBootstrap.reset();
+//
+//        ApplicationConfig applicationConfig = new ApplicationConfig("Test");
+//        applicationConfig.setRegisterConsumer(true);
+//        ApplicationModel.defaultModel().getApplicationConfigManager().setApplication(applicationConfig);
+//        ApplicationModel.defaultModel().getApplicationConfigManager().addRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
+//        ApplicationModel.defaultModel().getApplicationConfigManager().addProtocol(new ProtocolConfig("injvm"));
+//    }
+//
+//    @Test
+//    public void test() {
+//        MetadataServiceDelegation metadataService = Mockito.mock(MetadataServiceDelegation.class);
+//        ConfigurableMetadataServiceExporter exporter = new ConfigurableMetadataServiceExporter(ApplicationModel.defaultModel(), metadataService);
+//        exporter.setMetadataService(metadataService);
+//
+//        exporter.export();
+//        assertTrue(exporter.isExported());
+//        exporter.unexport();
+//
+//    }
+//
+//    @Test
+//    public void test2() throws Exception {
+//
+//        ApplicationModel applicationModel = ApplicationModel.defaultModel();
+//
+//        applicationModel.getDeployer().start().get();
+//        ExporterDeployListener listener = getListener(applicationModel);
+//        ConfigurableMetadataServiceExporter exporter = listener.getMetadataServiceExporter();
+//
+//        assertTrue(exporter.isExported());
+//
+//        applicationModel.getDeployer().stop();
+//        assertFalse(exporter.isExported());
+//    }
+//
+//    /**
+//     * test reuse of port started by normal service
+//     */
+//    @Test
+//    public void testPortReuse() throws Exception {
+//        DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
+//        ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>();
+//        serviceConfig.setInterface(DemoService.class);
+//        serviceConfig.setRef(new DemoServiceImpl());
+//
+//        ApplicationConfig applicationConfig = new ApplicationConfig("exporter-test");
+//        applicationConfig.setMetadataType(DEFAULT_METADATA_STORAGE_TYPE);
+//
+//        providerBootstrap
+//            .application(applicationConfig)
+//            .registry(registryConfig)
+//            .protocol(new ProtocolConfig("dubbo", 2002))
+//            .service(serviceConfig);
+//
+//        // will start exporter
+//        providerBootstrap.start();
+//        ExporterDeployListener listener = getListener(providerBootstrap.getApplicationModel());
+//        ConfigurableMetadataServiceExporter exporter = listener.getMetadataServiceExporter();
+//
+//        try {
+//            assertTrue(exporter.isExported());
+//            List<URL> urls = exporter.getExportedURLs();
+//            assertNotNull(urls);
+//            assertEquals(2002, urls.get(0).getPort());
+//            assertEquals(DUBBO_PROTOCOL, urls.get(0).getProtocol());
+//        } finally {
+//            providerBootstrap.stop();
+//        }
+//        assertFalse(exporter.isExported());
+//    }
+//
+//    /**
+//     * test user specified port and protocol
+//     * @throws Exception
+//     */
+//    @Test
+//    public void testSpecifiedPortAndProtocol() throws Exception {
+//        DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
+//        ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>();
+//        serviceConfig.setInterface(DemoService.class);
+//        serviceConfig.setRef(new DemoServiceImpl());
+//
+//        ApplicationConfig applicationConfig = new ApplicationConfig("exporter-test");
+//        applicationConfig.setMetadataType(DEFAULT_METADATA_STORAGE_TYPE);
+//        applicationConfig.setMetadataServiceProtocol("tri");
+//        applicationConfig.setMetadataServicePort(8089);
+//
+//        providerBootstrap
+//            .application(applicationConfig)
+//            .registry(registryConfig)
+//            .protocol(new ProtocolConfig("dubbo", 2002))
+//            .service(serviceConfig);
+//
+//        // will start exporter.export()
+//        providerBootstrap.start();
+//        ExporterDeployListener listener = getListener(providerBootstrap.getApplicationModel());
+//        ConfigurableMetadataServiceExporter exporter = listener.getMetadataServiceExporter();
+//
+//        try {
+//            assertTrue(exporter.isExported());
+//            List<URL> urls = exporter.getExportedURLs();
+//            assertNotNull(urls);
+//            assertEquals(8089, urls.get(0).getPort());
+//            assertEquals("tri", urls.get(0).getProtocol());
+//        } finally {
+//            providerBootstrap.stop();
+//        }
+//        assertFalse(exporter.isExported());
+//    }
+//
+//    @Test
+//    public void testMetadataStartsBeforeNormalService() throws Exception {
+//        DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
+//        ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>();
+//        serviceConfig.setInterface(DemoService.class);
+//        serviceConfig.setRef(new DemoServiceImpl());
+//        serviceConfig.setDelay(1000);
+//
+//        ApplicationConfig applicationConfig = new ApplicationConfig("exporter-test");
+//        applicationConfig.setMetadataType(DEFAULT_METADATA_STORAGE_TYPE);
+////        applicationConfig.setMetadataServiceProtocol("triple");
+////        applicationConfig.setMetadataServicePort(8089);
+//
+//        providerBootstrap
+//            .application(applicationConfig)
+//            .registry(registryConfig)
+//            .protocol(new ProtocolConfig("dubbo", 2002))
+//            .service(serviceConfig);
+//
+//        // will start exporter.export()
+//        providerBootstrap.start();
+//        ExporterDeployListener listener = getListener(providerBootstrap.getApplicationModel());
+//        ConfigurableMetadataServiceExporter exporter = listener.getMetadataServiceExporter();
+//        try {
+//            assertTrue(exporter.isExported());
+//            List<URL> urls = exporter.getExportedURLs();
+//            assertNotNull(urls);
+//            assertNotEquals(2002, urls.get(0).getPort());
+//            assertEquals("dubbo", urls.get(0).getProtocol());
+//        } finally {
+//            providerBootstrap.stop();
+//        }
+//        assertFalse(exporter.isExported());
+//    }
+////
+////    /**
+////     * test multiple protocols
+////     * @throws Exception
+////     */
+////    @Test
+////    public void testMultiProtocols() throws Exception {
+////        DubboBootstrap providerBootstrap = DubboBootstrap.newInstance();
+////        ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>();
+////        serviceConfig.setInterface(DemoService.class);
+////        serviceConfig.setRef(new DemoServiceImpl());
+////
+////        providerBootstrap
+////            .application("provider-app")
+////            .registry(registryConfig)
+////            .protocol(new ProtocolConfig("dubbo", 2002))
+////            .service(serviceConfig);
+////
+////        ConfigurableMetadataServiceExporter exporter = (ConfigurableMetadataServiceExporter) applicationModel.getExtensionLoader(MetadataServiceExporter.class).getDefaultExtension();
+////        MetadataService metadataService = Mockito.mock(MetadataService.class);
+////        exporter.setMetadataService(metadataService);
+////
+////        try {
+////            providerBootstrap.start();
+////            assertTrue(exporter.isExported());
+////            assertTrue(exporter.supports(DEFAULT_METADATA_STORAGE_TYPE));
+////            assertTrue(exporter.supports(REMOTE_METADATA_STORAGE_TYPE));
+////            assertTrue(exporter.supports(COMPOSITE_METADATA_STORAGE_TYPE));
+////        } finally {
+////            providerBootstrap.stop();
+////        }
+////        assertFalse(exporter.isExported());
+////    }
+//
+//    private static ZookeeperSingleRegistryCenter registryCenter;
+//    private static RegistryConfig registryConfig;
+//
+//    @BeforeAll
+//    public static void beforeAll() {
+//        FrameworkModel.destroyAll();
+//        registryCenter = new ZookeeperSingleRegistryCenter(NetUtils.getAvailablePort());
+//        registryCenter.startup();
+//        RegistryCenter.Instance instance = registryCenter.getRegistryCenterInstance().get(0);
+//        registryConfig = new RegistryConfig(String.format("%s://%s:%s",
+//            instance.getType(),
+//            instance.getHostname(),
+//            instance.getPort()));
+//
+//        // pre-check threads
+//        //precheckUnclosedThreads();
+//    }
+//
+//    private ExporterDeployListener getListener(ApplicationModel model) {
+//        return (ExporterDeployListener)model.getExtensionLoader(ApplicationDeployListener.class).getExtension("exporter");
+//    }
+//
+//}
diff --git a/dubbo-config/dubbo-config-api/src/test/resources/META-INF/services/org.apache.dubbo.registry.client.ServiceDiscovery b/dubbo-config/dubbo-config-api/src/test/resources/META-INF/services/org.apache.dubbo.registry.client.ServiceDiscovery
deleted file mode 100644
index 22ceb16..0000000
--- a/dubbo-config/dubbo-config-api/src/test/resources/META-INF/services/org.apache.dubbo.registry.client.ServiceDiscovery
+++ /dev/null
@@ -1 +0,0 @@
-mockregistry=org.apache.dubbo.config.mock.MockServiceDiscovery
\ No newline at end of file
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java
index 71add7b..bb37a5a 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java
@@ -27,6 +27,7 @@ import org.apache.dubbo.config.spring.reference.ReferenceBeanSupport;
 import org.apache.dubbo.config.spring.schema.DubboBeanDefinitionParser;
 import org.apache.dubbo.config.support.Parameter;
 import org.apache.dubbo.rpc.proxy.AbstractProxyFactory;
+
 import org.springframework.aop.framework.ProxyFactory;
 import org.springframework.aop.target.AbstractLazyCreationTargetSource;
 import org.springframework.beans.MutablePropertyValues;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
index 2fe8836..6a2d43c 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.config.spring.beans.factory.annotation;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.common.utils.Assert;
 import org.apache.dubbo.common.utils.ClassUtils;
 import org.apache.dubbo.common.utils.StringUtils;
@@ -32,6 +30,9 @@ import org.apache.dubbo.config.spring.reference.ReferenceBeanManager;
 import org.apache.dubbo.config.spring.reference.ReferenceBeanSupport;
 import org.apache.dubbo.config.spring.util.SpringCompatUtils;
 import org.apache.dubbo.rpc.service.GenericService;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.PropertyValue;
 import org.springframework.beans.PropertyValues;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
index 08814b1..3351a41 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
@@ -16,7 +16,6 @@
  */
 package org.apache.dubbo.config.spring.beans.factory.annotation;
 
-import com.alibaba.spring.util.AnnotationUtils;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.StringUtils;
@@ -30,6 +29,8 @@ import org.apache.dubbo.config.spring.context.annotation.DubboClassPathBeanDefin
 import org.apache.dubbo.config.spring.schema.AnnotationBeanDefinitionParser;
 import org.apache.dubbo.config.spring.util.DubboAnnotationUtils;
 import org.apache.dubbo.config.spring.util.SpringCompatUtils;
+
+import com.alibaba.spring.util.AnnotationUtils;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.MutablePropertyValues;
 import org.springframework.beans.factory.BeanClassLoaderAware;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/config/DubboConfigDefaultPropertyValueBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/config/DubboConfigDefaultPropertyValueBeanPostProcessor.java
index a660878..c29182c 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/config/DubboConfigDefaultPropertyValueBeanPostProcessor.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/config/DubboConfigDefaultPropertyValueBeanPostProcessor.java
@@ -17,9 +17,9 @@
 package org.apache.dubbo.config.spring.beans.factory.config;
 
 import org.apache.dubbo.config.AbstractConfig;
+import org.apache.dubbo.config.Constants;
 
 import com.alibaba.spring.beans.factory.config.GenericBeanPostProcessorAdapter;
-import org.apache.dubbo.config.Constants;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor;
 import org.springframework.beans.factory.config.BeanPostProcessor;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapApplicationListener.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapApplicationListener.java
index 90e23dc..58e295c 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapApplicationListener.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapApplicationListener.java
@@ -16,13 +16,14 @@
  */
 package org.apache.dubbo.config.spring.context;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.config.bootstrap.BootstrapTakeoverMode;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.context.event.DubboConfigInitEvent;
 import org.apache.dubbo.config.spring.util.DubboBeanUtils;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapStartStopListenerSpringAdapter.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapStartStopListenerSpringAdapter.java
index 0894a52..b5c3366 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapStartStopListenerSpringAdapter.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapStartStopListenerSpringAdapter.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.bootstrap.DubboBootstrapStartStopListener;
 import org.apache.dubbo.config.spring.context.event.DubboBootstrapStatedEvent;
 import org.apache.dubbo.config.spring.context.event.DubboBootstrapStopedEvent;
+
 import org.springframework.context.ApplicationContext;
 
 /**
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigApplicationListener.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigApplicationListener.java
index 6a839e7..96c11fa 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigApplicationListener.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigApplicationListener.java
@@ -16,11 +16,12 @@
  */
 package org.apache.dubbo.config.spring.context;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.config.spring.context.event.DubboConfigInitEvent;
 import org.apache.dubbo.config.spring.util.DubboBeanUtils;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigBeanInitializer.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigBeanInitializer.java
index a551551..71b648f 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigBeanInitializer.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigBeanInitializer.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.config.spring.context;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.config.AbstractConfig;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ConsumerConfig;
@@ -34,6 +32,9 @@ import org.apache.dubbo.config.context.ConfigManager;
 import org.apache.dubbo.config.spring.ConfigCenterBean;
 import org.apache.dubbo.config.spring.reference.ReferenceBeanManager;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.FatalBeanException;
 import org.springframework.beans.factory.BeanFactory;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboDeployApplicationListener.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboDeployApplicationListener.java
index a1cdfb3..8b8ed06 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboDeployApplicationListener.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboDeployApplicationListener.java
@@ -27,6 +27,7 @@ import org.apache.dubbo.config.spring.util.DubboBeanUtils;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ModelConstants;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboInfraBeanRegisterPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboInfraBeanRegisterPostProcessor.java
index ecbe4ad..b2ce4e6 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboInfraBeanRegisterPostProcessor.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboInfraBeanRegisterPostProcessor.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.config.spring.extension.SpringExtensionInjector;
 import org.apache.dubbo.config.spring.util.DubboBeanUtils;
 import org.apache.dubbo.config.spring.util.EnvironmentUtils;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitContext.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitContext.java
index f2a2fd3..e3c8ae7 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitContext.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitContext.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.config.spring.context;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ModelConstants;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.context.ApplicationContext;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitCustomizer.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitCustomizer.java
index fa9da0e..5d5adab 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitCustomizer.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitCustomizer.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.context;
 
 import org.apache.dubbo.common.extension.SPI;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
 import org.springframework.beans.factory.config.BeanPostProcessor;
 
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitializer.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitializer.java
index 176d694..a8f7952 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitializer.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboSpringInitializer.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
 import org.apache.dubbo.rpc.model.ScopeModel;
+
 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.context.ApplicationContext;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrar.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrar.java
index d1db4db..59cd3de 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrar.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrar.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.config.annotation.Service;
 import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor;
 import org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationPostProcessor;
 import org.apache.dubbo.config.spring.context.DubboSpringInitializer;
+
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationRegistrar.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationRegistrar.java
index 9fcc5ed..5eac728 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationRegistrar.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationRegistrar.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.context.annotation;
 
 import org.apache.dubbo.config.AbstractConfig;
 import org.apache.dubbo.config.spring.context.DubboSpringInitializer;
+
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
 import org.springframework.core.Ordered;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboApplicationStateEvent.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboApplicationStateEvent.java
index 7b1c3f0..bafa46d 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboApplicationStateEvent.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboApplicationStateEvent.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.context.event;
 
 import org.apache.dubbo.common.deploy.DeployState;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.springframework.context.ApplicationEvent;
 
 /**
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboBootstrapStatedEvent.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboBootstrapStatedEvent.java
index 21d245d..4bc4ed6 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboBootstrapStatedEvent.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboBootstrapStatedEvent.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config.spring.context.event;
 
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+
 import org.springframework.context.ApplicationEvent;
 
 /**
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboBootstrapStopedEvent.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboBootstrapStopedEvent.java
index 90bf810..3eceaa6 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboBootstrapStopedEvent.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboBootstrapStopedEvent.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config.spring.context.event;
 
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+
 import org.springframework.context.ApplicationEvent;
 
 /**
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboConfigInitEvent.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboConfigInitEvent.java
index bf3bb3d..252b482 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboConfigInitEvent.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/event/DubboConfigInitEvent.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config.spring.context.event;
 
 import org.apache.dubbo.config.spring.context.DubboConfigBeanInitializer;
+
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationEvent;
 
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjector.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjector.java
index 6e6a1a8..a451cac 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjector.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjector.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.common.extension.SPI;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.StringUtils;
+
 import org.springframework.beans.factory.ListableBeanFactory;
 import org.springframework.context.ApplicationContext;
 
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanManager.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanManager.java
index 0c7619b7..0dce203 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanManager.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanManager.java
@@ -16,13 +16,14 @@
  */
 package org.apache.dubbo.config.spring.reference;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.common.utils.Assert;
 import org.apache.dubbo.config.ReferenceConfig;
 import org.apache.dubbo.config.spring.ReferenceBean;
 import org.apache.dubbo.config.spring.util.DubboBeanUtils;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanSupport.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanSupport.java
index 066ea0b..b22d032 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanSupport.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceBeanSupport.java
@@ -16,13 +16,14 @@
  */
 package org.apache.dubbo.config.spring.reference;
 
-import com.alibaba.spring.util.AnnotationUtils;
 import org.apache.dubbo.common.utils.Assert;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.spring.Constants;
 import org.apache.dubbo.config.spring.ReferenceBean;
 import org.apache.dubbo.config.spring.util.DubboAnnotationUtils;
 import org.apache.dubbo.rpc.service.GenericService;
+
+import com.alibaba.spring.util.AnnotationUtils;
 import org.springframework.beans.MutablePropertyValues;
 import org.springframework.beans.PropertyValue;
 import org.springframework.beans.factory.config.BeanDefinition;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceCreator.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceCreator.java
index 9dc3095..4d7493e 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceCreator.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/reference/ReferenceCreator.java
@@ -16,9 +16,6 @@
  */
 package org.apache.dubbo.config.spring.reference;
 
-import com.alibaba.spring.util.AnnotationUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.config.AbstractConfig;
 import org.apache.dubbo.config.ArgumentConfig;
 import org.apache.dubbo.config.ConsumerConfig;
@@ -33,6 +30,10 @@ import org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationPropert
 import org.apache.dubbo.config.spring.util.DubboAnnotationUtils;
 import org.apache.dubbo.config.spring.util.DubboBeanUtils;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
+import com.alibaba.spring.util.AnnotationUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.propertyeditors.StringTrimmerEditor;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.convert.support.DefaultConversionService;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/AnnotationBeanDefinitionParser.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/AnnotationBeanDefinitionParser.java
index b50bddb..69911ed 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/AnnotationBeanDefinitionParser.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/AnnotationBeanDefinitionParser.java
@@ -17,8 +17,8 @@
 package org.apache.dubbo.config.spring.schema;
 
 import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor;
-
 import org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationPostProcessor;
+
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandler.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandler.java
index 200e57c..982b85d 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandler.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandler.java
@@ -32,6 +32,7 @@ import org.apache.dubbo.config.spring.ReferenceBean;
 import org.apache.dubbo.config.spring.ServiceBean;
 import org.apache.dubbo.config.spring.beans.factory.config.ConfigurableSourceBeanMetadataElement;
 import org.apache.dubbo.config.spring.context.DubboSpringInitializer;
+
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/DataSourceStatusChecker.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/DataSourceStatusChecker.java
index c9cd8b6..0f9760f 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/DataSourceStatusChecker.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/DataSourceStatusChecker.java
@@ -24,6 +24,7 @@ import org.apache.dubbo.common.status.StatusChecker;
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.config.spring.extension.SpringExtensionInjector;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.springframework.context.ApplicationContext;
 
 import javax.sql.DataSource;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/SpringStatusChecker.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/SpringStatusChecker.java
index fad4121..d83398b 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/SpringStatusChecker.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/SpringStatusChecker.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.common.status.Status;
 import org.apache.dubbo.common.status.StatusChecker;
 import org.apache.dubbo.config.spring.extension.SpringExtensionInjector;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.Lifecycle;
 
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboAnnotationUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboAnnotationUtils.java
index c8f5a23..baed5e4 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboAnnotationUtils.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboAnnotationUtils.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.annotation.Service;
 import org.apache.dubbo.rpc.service.GenericService;
+
 import org.springframework.util.Assert;
 
 import java.util.ArrayList;
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboBeanUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboBeanUtils.java
index 5fb6dd8..c350348 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboBeanUtils.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboBeanUtils.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.config.spring.util;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigAliasPostProcessor;
 import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor;
 import org.apache.dubbo.config.spring.beans.factory.annotation.ServicePackagesHolder;
@@ -31,6 +29,9 @@ import org.apache.dubbo.config.spring.context.DubboSpringInitContext;
 import org.apache.dubbo.config.spring.reference.ReferenceBeanManager;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.factory.BeanFactory;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.config.BeanPostProcessor;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java
index 027e365..ebddc1f 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java
@@ -51,10 +51,9 @@ import org.apache.dubbo.rpc.RpcContext;
 import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.service.GenericService;
-import org.junit.jupiter.api.AfterAll;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/DubboStateListener.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/DubboStateListener.java
index c5b6326..b2c3307 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/DubboStateListener.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/DubboStateListener.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring;
 
 import org.apache.dubbo.common.deploy.DeployState;
 import org.apache.dubbo.config.spring.context.event.DubboApplicationStateEvent;
+
 import org.springframework.context.ApplicationListener;
 
 public class DubboStateListener implements ApplicationListener<DubboApplicationStateEvent> {
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/JavaConfigBeanTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/JavaConfigBeanTest.java
index abd2f25..03fc754 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/JavaConfigBeanTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/JavaConfigBeanTest.java
@@ -32,6 +32,7 @@ import org.apache.dubbo.config.spring.impl.DemoServiceImpl;
 import org.apache.dubbo.rpc.Constants;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ServiceBeanTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ServiceBeanTest.java
index 518a4e8..d77cc75 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ServiceBeanTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ServiceBeanTest.java
@@ -17,8 +17,8 @@
 package org.apache.dubbo.config.spring;
 
 import org.apache.dubbo.config.annotation.Service;
-
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+
 import org.hamcrest.MatcherAssert;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MethodConfigCallbackTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MethodConfigCallbackTest.java
index ccb70c9..a0eac46 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MethodConfigCallbackTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MethodConfigCallbackTest.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.api.MethodCallback;
 import org.apache.dubbo.config.spring.context.annotation.provider.ProviderConfiguration;
 import org.apache.dubbo.config.spring.impl.MethodCallbackImpl;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ParameterConvertTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ParameterConvertTest.java
index e74d0c4..cf10022 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ParameterConvertTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ParameterConvertTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config.spring.beans.factory.annotation;
 
 import org.apache.dubbo.config.spring.util.DubboAnnotationUtils;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.springframework.test.annotation.DirtiesContext;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceCreatorTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceCreatorTest.java
index 3e27564..a5d785f 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceCreatorTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceCreatorTest.java
@@ -17,7 +17,6 @@
 package org.apache.dubbo.config.spring.beans.factory.annotation;
 
 
-import com.alibaba.spring.util.AnnotationUtils;
 import org.apache.dubbo.config.ArgumentConfig;
 import org.apache.dubbo.config.ConsumerConfig;
 import org.apache.dubbo.config.MethodConfig;
@@ -34,6 +33,8 @@ import org.apache.dubbo.config.spring.impl.NotifyService;
 import org.apache.dubbo.config.spring.reference.ReferenceCreator;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
+import com.alibaba.spring.util.AnnotationUtils;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessorTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessorTest.java
index 78fa75f..aba4c12 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessorTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessorTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.config.spring.ServiceBean;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceBeanNameBuilderTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceBeanNameBuilderTest.java
index c57667c..a117ad5 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceBeanNameBuilderTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceBeanNameBuilderTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.config.spring.beans.factory.annotation;
 import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.annotation.Service;
 import org.apache.dubbo.config.spring.api.DemoService;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/config/MultipleServicesWithMethodConfigsTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/config/MultipleServicesWithMethodConfigsTest.java
index 541c500..6253371 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/config/MultipleServicesWithMethodConfigsTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/config/MultipleServicesWithMethodConfigsTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.beans.factory.config;
 
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.ServiceBean;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional1/XmlReferenceBeanConditionalTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional1/XmlReferenceBeanConditionalTest.java
index 54ed291..c18b64f 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional1/XmlReferenceBeanConditionalTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional1/XmlReferenceBeanConditionalTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.boot.conditional1;
 
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional2/JavaConfigAnnotationReferenceBeanConditionalTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional2/JavaConfigAnnotationReferenceBeanConditionalTest.java
index 5b4f7bb..ec4c71c 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional2/JavaConfigAnnotationReferenceBeanConditionalTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional2/JavaConfigAnnotationReferenceBeanConditionalTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.config.spring.ReferenceBean;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.config.spring.context.annotation.provider.HelloServiceImpl;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional3/JavaConfigRawReferenceBeanConditionalTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional3/JavaConfigRawReferenceBeanConditionalTest.java
index 014682b..ba5fa3c 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional3/JavaConfigRawReferenceBeanConditionalTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional3/JavaConfigRawReferenceBeanConditionalTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.config.spring.context.annotation.provider.HelloServiceImpl;
 import org.apache.dubbo.config.spring.reference.ReferenceBeanBuilder;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional4/JavaConfigReferenceBeanConditionalTest4.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional4/JavaConfigReferenceBeanConditionalTest4.java
index ce6968a..3e01fe0 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional4/JavaConfigReferenceBeanConditionalTest4.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/conditional4/JavaConfigReferenceBeanConditionalTest4.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.config.spring.ReferenceBean;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.config.spring.context.annotation.provider.HelloServiceImpl;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/configprops/SpringBootConfigPropsTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/configprops/SpringBootConfigPropsTest.java
index 1542a2a..4d2b8e3 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/configprops/SpringBootConfigPropsTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/configprops/SpringBootConfigPropsTest.java
@@ -32,6 +32,7 @@ import org.apache.dubbo.config.context.ModuleConfigManager;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.rpc.model.ModuleModel;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/configprops/SpringBootMultipleConfigPropsTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/configprops/SpringBootMultipleConfigPropsTest.java
index 27151e6..1bf1a65 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/configprops/SpringBootMultipleConfigPropsTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/configprops/SpringBootMultipleConfigPropsTest.java
@@ -32,6 +32,7 @@ import org.apache.dubbo.config.context.ModuleConfigManager;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.rpc.model.ModuleModel;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml/SpringBootImportDubboXmlTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml/SpringBootImportDubboXmlTest.java
index bd7ffea..3975978 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml/SpringBootImportDubboXmlTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml/SpringBootImportDubboXmlTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.boot.importxml;
 
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml2/SpringBootImportAndScanTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml2/SpringBootImportAndScanTest.java
index 1a815f2..a13c44b 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml2/SpringBootImportAndScanTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml2/SpringBootImportAndScanTest.java
@@ -19,9 +19,10 @@ package org.apache.dubbo.config.spring.boot.importxml2;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.ReferenceBean;
-import org.apache.dubbo.config.spring.reference.ReferenceBeanManager;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
+import org.apache.dubbo.config.spring.reference.ReferenceBeanManager;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml2/dubbo-provider.xml b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml2/dubbo-provider.xml
index b2dfdb5..f6281ac 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml2/dubbo-provider.xml
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/boot/importxml2/dubbo-provider.xml
@@ -19,9 +19,9 @@
   -->
 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
-       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
+       xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 <!--    <context:property-placeholder/>-->
 
     <dubbo:application name="${myapp.name:foo}"/>
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/KeepRunningOnSpringClosedTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/KeepRunningOnSpringClosedTest.java
index 2fcbeb5..4cc6908 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/KeepRunningOnSpringClosedTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/KeepRunningOnSpringClosedTest.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.DubboStateListener;
 import org.apache.dubbo.config.spring.SysProps;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrarTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrarTest.java
index 7522ba6..a12c1bb 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrarTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrarTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.config.spring.api.DemoService;
 import org.apache.dubbo.config.spring.context.annotation.consumer.ConsumerConfiguration;
 import org.apache.dubbo.config.spring.context.annotation.provider.DemoServiceImpl;
 import org.apache.dubbo.config.spring.context.annotation.provider.ProviderConfiguration;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationTest.java
index e745f51..17a27f4 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationTest.java
@@ -20,8 +20,8 @@ import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ModuleConfig;
 import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.RegistryConfig;
-
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboTest.java
index 17c4286..75ff827 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.config.spring.api.DemoService;
 import org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationTestConfiguration;
 import org.apache.dubbo.config.spring.context.annotation.consumer.test.TestConsumerConfiguration;
 import org.apache.dubbo.config.spring.context.annotation.provider.DemoServiceImpl;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/customize/DubboSpringInitCustomizerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/customize/DubboSpringInitCustomizerTest.java
index c5e6cfb..f8b98bc 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/customize/DubboSpringInitCustomizerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/customize/DubboSpringInitCustomizerTest.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/properties/DefaultDubboConfigBinderTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/properties/DefaultDubboConfigBinderTest.java
index d64b60d..ea42e1f 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/properties/DefaultDubboConfigBinderTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/properties/DefaultDubboConfigBinderTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjectorTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjectorTest.java
index 78bf9eb..8514a07 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjectorTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjectorTest.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.config.spring.impl.DemoServiceImpl;
 import org.apache.dubbo.config.spring.impl.HelloServiceImpl;
 import org.apache.dubbo.config.spring.util.DubboBeanUtils;
 import org.apache.dubbo.rpc.Protocol;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/impl/MethodCallbackImpl.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/impl/MethodCallbackImpl.java
index 7f9a454..a005471 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/impl/MethodCallbackImpl.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/impl/MethodCallbackImpl.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config.spring.impl;
 
 import org.apache.dubbo.config.spring.api.MethodCallback;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.env.Environment;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/Issue6000Test.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/Issue6000Test.java
index c652a4c..3be2329 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/Issue6000Test.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/Issue6000Test.java
@@ -19,9 +19,10 @@ package org.apache.dubbo.config.spring.issues.issue6000;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.config.spring.issues.issue6000.adubbo.HelloDubbo;
+
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import org.springframework.context.annotation.ComponentScan;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/adubbo/HelloDubbo.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/adubbo/HelloDubbo.java
index c66ced0..44962c8 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/adubbo/HelloDubbo.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/adubbo/HelloDubbo.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config.spring.issues.issue6000.adubbo;
 
 import org.apache.dubbo.config.spring.api.HelloService;
+
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/dubbo/MyReferenceConfig.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/dubbo/MyReferenceConfig.java
index a235115..f5d3155 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/dubbo/MyReferenceConfig.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6000/dubbo/MyReferenceConfig.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.issues.issue6000.dubbo;
 
 import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.spring.api.HelloService;
+
 import org.springframework.context.annotation.Configuration;
 
 /**
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6252/Issue6252Test.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6252/Issue6252Test.java
index 8d9e815..51b6f14 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6252/Issue6252Test.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue6252/Issue6252Test.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.DemoService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue7003/Issue7003Test.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue7003/Issue7003Test.java
index a31fbee..71edfbe 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue7003/Issue7003Test.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue7003/Issue7003Test.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.config.spring.ReferenceBean;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9172/MultipleConsumerAndProviderTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9172/MultipleConsumerAndProviderTest.java
index 654ba9c..4e196b2 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9172/MultipleConsumerAndProviderTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9172/MultipleConsumerAndProviderTest.java
@@ -27,6 +27,7 @@ import org.apache.dubbo.config.spring.impl.DemoServiceImpl;
 import org.apache.dubbo.config.spring.impl.HelloServiceImpl;
 import org.apache.dubbo.config.spring.util.DubboBeanUtils;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9207/ConfigCenterBeanTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9207/ConfigCenterBeanTest.java
index 86a42fc..78b891f 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9207/ConfigCenterBeanTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue9207/ConfigCenterBeanTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.config.spring.ConfigCenterBean;
 import org.apache.dubbo.config.spring.SysProps;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.config.spring.util.DubboBeanUtils;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.BeansException;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/DemoBeanFactoryPostProcessor.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/DemoBeanFactoryPostProcessor.java
index 9aca76f..e5cafe8 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/DemoBeanFactoryPostProcessor.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/DemoBeanFactoryPostProcessor.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config.spring.propertyconfigurer.consumer;
 
 import org.apache.dubbo.config.spring.api.HelloService;
+
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/dubbo-consumer.xml b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/dubbo-consumer.xml
index d00f3b2..5f78077 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/dubbo-consumer.xml
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/dubbo-consumer.xml
@@ -17,9 +17,9 @@
   -->
 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
-       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
+       xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
-       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
         <property name="location">
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/dubbo-consumer.xml b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/dubbo-consumer.xml
index 6048716..d3e5725 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/dubbo-consumer.xml
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/dubbo-consumer.xml
@@ -17,9 +17,9 @@
   -->
 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
-       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
+       xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
-       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
     <bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
         <property name="location">
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/dubbo-consumer.xml b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/dubbo-consumer.xml
index 4a5d492..89f42b6 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/dubbo-consumer.xml
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/dubbo-consumer.xml
@@ -17,9 +17,9 @@
   -->
 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
-       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
+       xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
-       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
     <dubbo:application name="demo-consumer">
     </dubbo:application>
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/DubboConfigBeanInitializerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/DubboConfigBeanInitializerTest.java
index a056711..c2b42ca 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/DubboConfigBeanInitializerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/DubboConfigBeanInitializerTest.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.DubboConfigBeanInitializer;
 import org.apache.dubbo.config.spring.context.annotation.provider.ProviderConfiguration;
 import org.apache.dubbo.config.spring.util.DubboBeanUtils;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/local-call-consumer.xml b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/local-call-consumer.xml
index aa41fb9..bbac855 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/local-call-consumer.xml
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/local-call-consumer.xml
@@ -18,9 +18,9 @@
 
 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
-       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
+       xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
     <dubbo:reference id="helloService" interface="org.apache.dubbo.config.spring.api.HelloService"/>
 
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallmix/local-call-consumer.xml b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallmix/local-call-consumer.xml
index aa41fb9..bbac855 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallmix/local-call-consumer.xml
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallmix/local-call-consumer.xml
@@ -18,9 +18,9 @@
 
 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
-       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
+       xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
     <dubbo:reference id="helloService" interface="org.apache.dubbo.config.spring.api.HelloService"/>
 
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registry/MockServiceDiscovery.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registry/MockServiceDiscovery.java
index e77719d..a5c5b3c 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registry/MockServiceDiscovery.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registry/MockServiceDiscovery.java
@@ -19,16 +19,22 @@ package org.apache.dubbo.config.spring.registry;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.registry.client.AbstractServiceDiscovery;
 import org.apache.dubbo.registry.client.ServiceInstance;
+import org.apache.dubbo.rpc.model.ApplicationModel;
 
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 public class MockServiceDiscovery extends AbstractServiceDiscovery {
     private URL registryURL;
 
-    @Override
-    public void doInitialize(URL registryURL) throws Exception {
-        this.registryURL = registryURL;
+    public MockServiceDiscovery(ApplicationModel applicationModel, URL registryURL) {
+        super(applicationModel, registryURL);
+    }
+
+    public MockServiceDiscovery(String serviceName, URL registryURL) {
+        super(serviceName, registryURL);
     }
 
     @Override
@@ -54,6 +60,11 @@ public class MockServiceDiscovery extends AbstractServiceDiscovery {
     }
 
     @Override
+    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {
+        return Collections.emptyList();
+    }
+
+    @Override
     public URL getUrl() {
         return registryURL;
     }
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registry/nacos/nacos/NacosServiceNameTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registry/nacos/nacos/NacosServiceNameTest.java
index 5aa5783..0ea50e6 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registry/nacos/nacos/NacosServiceNameTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registry/nacos/nacos/NacosServiceNameTest.java
@@ -23,9 +23,9 @@ import org.junit.jupiter.api.Test;
 
 import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_CATEGORY;
 import static org.apache.dubbo.registry.nacos.NacosServiceName.WILDCARD;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * {@link NacosServiceName} Test
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandlerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandlerTest.java
index 7415f17..69bb8d7 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandlerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandlerTest.java
@@ -32,6 +32,7 @@ import org.apache.dubbo.config.spring.ServiceBean;
 import org.apache.dubbo.config.spring.api.DemoService;
 import org.apache.dubbo.config.spring.impl.DemoServiceImpl;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java
index 79d0afe..061130f 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.config.context.ModuleConfigManager;
 import org.apache.dubbo.config.spring.ServiceBean;
 import org.apache.dubbo.config.spring.api.DemoService;
 import org.apache.dubbo.rpc.service.GenericService;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceWithoutInterfaceTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceWithoutInterfaceTest.java
index ff0861d..e5a947f 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceWithoutInterfaceTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceWithoutInterfaceTest.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.utils.ClassUtils;
 import org.apache.dubbo.config.ReferenceConfigBase;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.rpc.service.GenericService;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/DataSourceStatusCheckerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/DataSourceStatusCheckerTest.java
index fac121d..1606258 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/DataSourceStatusCheckerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/DataSourceStatusCheckerTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.status;
 
 import org.apache.dubbo.common.status.Status;
 import org.apache.dubbo.config.spring.ServiceBean;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/SpringStatusCheckerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/SpringStatusCheckerTest.java
index 384112f..5eeb0cb 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/SpringStatusCheckerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/SpringStatusCheckerTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.config.spring.status;
 
 import org.apache.dubbo.common.status.Status;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery
deleted file mode 100644
index cea6b84..0000000
--- a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery
+++ /dev/null
@@ -1 +0,0 @@
-mock=org.apache.dubbo.config.spring.registry.MockServiceDiscovery
\ No newline at end of file
diff --git a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
index 7d35543..dcba4ff 100644
--- a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
+++ b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
@@ -17,16 +17,6 @@
 
 package org.apache.dubbo.configcenter.support.nacos;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.nacos.api.NacosFactory;
-import com.alibaba.nacos.api.PropertyKeyConst;
-import com.alibaba.nacos.api.config.ConfigService;
-import com.alibaba.nacos.api.config.listener.AbstractSharedListener;
-import com.alibaba.nacos.api.exception.NacosException;
-import com.alibaba.nacos.client.config.http.HttpAgent;
-import com.alibaba.nacos.common.http.HttpRestResult;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
 import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;
@@ -38,6 +28,17 @@ import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.MD5Utils;
 import org.apache.dubbo.common.utils.StringUtils;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.api.NacosFactory;
+import com.alibaba.nacos.api.PropertyKeyConst;
+import com.alibaba.nacos.api.config.ConfigService;
+import com.alibaba.nacos.api.config.listener.AbstractSharedListener;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.client.config.http.HttpAgent;
+import com.alibaba.nacos.common.http.HttpRestResult;
+
 import java.lang.reflect.Field;
 import java.util.HashMap;
 import java.util.Map;
diff --git a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
index cb867d7..a7ac3f2 100644
--- a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
+++ b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.NamedThreadFactory;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperClient;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
+
 import org.apache.zookeeper.data.Stat;
 
 import java.util.Collection;
diff --git a/dubbo-container/dubbo-container-spring/src/main/java/org/apache/dubbo/container/spring/SpringContainer.java b/dubbo-container/dubbo-container-spring/src/main/java/org/apache/dubbo/container/spring/SpringContainer.java
index e221577..e3c0040 100644
--- a/dubbo-container/dubbo-container-spring/src/main/java/org/apache/dubbo/container/spring/SpringContainer.java
+++ b/dubbo-container/dubbo-container-spring/src/main/java/org/apache/dubbo/container/spring/SpringContainer.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.container.Container;
+
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
 /**
diff --git a/dubbo-demo/dubbo-demo-api/dubbo-demo-api-consumer/src/main/java/org/apache/dubbo/demo/consumer/Application.java b/dubbo-demo/dubbo-demo-api/dubbo-demo-api-consumer/src/main/java/org/apache/dubbo/demo/consumer/Application.java
index 785e53d..b9f31c9 100644
--- a/dubbo-demo/dubbo-demo-api/dubbo-demo-api-consumer/src/main/java/org/apache/dubbo/demo/consumer/Application.java
+++ b/dubbo-demo/dubbo-demo-api/dubbo-demo-api-consumer/src/main/java/org/apache/dubbo/demo/consumer/Application.java
@@ -19,9 +19,9 @@ package org.apache.dubbo.demo.consumer;
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.MetadataReportConfig;
+import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.ReferenceConfig;
 import org.apache.dubbo.config.RegistryConfig;
-import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.demo.DemoService;
 import org.apache.dubbo.rpc.service.GenericService;
diff --git a/dubbo-demo/dubbo-demo-api/dubbo-demo-api-provider/src/main/java/org/apache/dubbo/demo/provider/Application.java b/dubbo-demo/dubbo-demo-api/dubbo-demo-api-provider/src/main/java/org/apache/dubbo/demo/provider/Application.java
index 7712d6f..73a5d73 100644
--- a/dubbo-demo/dubbo-demo-api/dubbo-demo-api-provider/src/main/java/org/apache/dubbo/demo/provider/Application.java
+++ b/dubbo-demo/dubbo-demo-api/dubbo-demo-api-provider/src/main/java/org/apache/dubbo/demo/provider/Application.java
@@ -19,9 +19,9 @@ package org.apache.dubbo.demo.provider;
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.MetadataReportConfig;
+import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.ServiceConfig;
-import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.demo.DemoService;
 
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
index b5e2eac..81dd095 100644
--- a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
@@ -74,10 +74,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-xds</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-filter-validation</artifactId>
         </dependency>
         <dependency>
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/com/apache/dubbo/demo/graalvm/consumer/Application.java b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/com/apache/dubbo/demo/graalvm/consumer/Application.java
index 254842a..1c253d8 100644
--- a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/com/apache/dubbo/demo/graalvm/consumer/Application.java
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/com/apache/dubbo/demo/graalvm/consumer/Application.java
@@ -16,7 +16,6 @@
  */
 package com.apache.dubbo.demo.graalvm.consumer;
 
-import org.apace.dubbo.graalvm.demo.DemoService;
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ProtocolConfig;
@@ -24,6 +23,8 @@ import org.apache.dubbo.config.ReferenceConfig;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 
+import org.apace.dubbo.graalvm.demo.DemoService;
+
 import java.util.HashMap;
 import java.util.Map;
 
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
index bcc6d9a..1870d96 100644
--- a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
@@ -68,10 +68,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-xds</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-filter-validation</artifactId>
         </dependency>
         <dependency>
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/DemoServiceImpl.java b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/DemoServiceImpl.java
index 37459c5..38a0348 100644
--- a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/DemoServiceImpl.java
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/DemoServiceImpl.java
@@ -16,9 +16,10 @@
  */
 package org.apache.dubbo.demo.graalvm.provider;
 
-import org.apace.dubbo.graalvm.demo.DemoService;
 import org.apache.dubbo.rpc.RpcContext;
 
+import org.apace.dubbo.graalvm.demo.DemoService;
+
 
 public class DemoServiceImpl implements DemoService {
 
diff --git a/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml b/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml
index a89803c..d04700d 100644
--- a/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml
+++ b/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml
@@ -26,7 +26,7 @@
 
     <dubbo:metadata-report address="zookeeper://127.0.0.1:2181"/>
 
-    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
+    <dubbo:registry id="demo1" address="zookeeper://127.0.0.1:2181?registry-type=service"/>
 
     <dubbo:protocol name="dubbo" port="-1"/>
     <dubbo:protocol name="rest" port="-1"/>
diff --git a/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-provider/src/main/resources/spring/dubbo-provider.xml b/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-provider/src/main/resources/spring/dubbo-provider.xml
index 64c81e1..60f1d93 100644
--- a/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-provider/src/main/resources/spring/dubbo-provider.xml
+++ b/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-provider/src/main/resources/spring/dubbo-provider.xml
@@ -21,7 +21,7 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
-    <dubbo:application name="demo-provider">
+    <dubbo:application name="demo-provider" metadata-type="remote">
     </dubbo:application>
 
     <dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml
index f5ed76d..2dc55ad 100644
--- a/dubbo-dependencies-bom/pom.xml
+++ b/dubbo-dependencies-bom/pom.xml
@@ -169,7 +169,7 @@
         <mortbay_jetty_version>6.1.26</mortbay_jetty_version>
         <portlet_version>2.0</portlet_version>
         <maven_flatten_version>1.1.0</maven_flatten_version>
-        <revision>3.0.6-SNAPSHOT</revision>
+        <revision>3.0.5-metadata-SNAPSHOT</revision>
     </properties>
 
     <dependencyManagement>
diff --git a/dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml b/dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
index eea6d0e..853048c 100644
--- a/dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
+++ b/dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
@@ -32,7 +32,7 @@
     <packaging>pom</packaging>
 
     <properties>
-        <revision>3.0.6-SNAPSHOT</revision>
+        <revision>3.0.5-metadata-SNAPSHOT</revision>
         <maven_flatten_version>1.1.0</maven_flatten_version>
         <zookeeper_version>3.7.0</zookeeper_version>
     </properties>
diff --git a/dubbo-distribution/dubbo-all/pom.xml b/dubbo-distribution/dubbo-all/pom.xml
index a9d3190..5eb590e 100644
--- a/dubbo-distribution/dubbo-all/pom.xml
+++ b/dubbo-distribution/dubbo-all/pom.xml
@@ -173,27 +173,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-kubernetes</artifactId>
-            <version>${project.version}</version>
-            <scope>compile</scope>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-dns</artifactId>
-            <version>${project.version}</version>
-            <scope>compile</scope>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-xds</artifactId>
-            <version>${project.version}</version>
-            <scope>compile</scope>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-monitor-api</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
@@ -429,12 +408,9 @@
                                     <include>org.apache.dubbo:dubbo-plugin</include>
                                     <include>org.apache.dubbo:dubbo-qos</include>
                                     <include>org.apache.dubbo:dubbo-registry-api</include>
-                                    <include>org.apache.dubbo:dubbo-registry-dns</include>
-                                    <include>org.apache.dubbo:dubbo-registry-kubernetes</include>
                                     <include>org.apache.dubbo:dubbo-registry-multicast</include>
                                     <include>org.apache.dubbo:dubbo-registry-multiple</include>
                                     <include>org.apache.dubbo:dubbo-registry-nacos</include>
-                                    <include>org.apache.dubbo:dubbo-registry-xds</include>
                                     <include>org.apache.dubbo:dubbo-registry-zookeeper</include>
                                     <include>org.apache.dubbo:dubbo-registry</include>
                                     <include>org.apache.dubbo:dubbo-remoting-api</include>
@@ -683,24 +659,12 @@
                                 <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>
                                 <transformer
                                     implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
-                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.WritableMetadataService
-                                    </resource>
-                                </transformer>
-                                <transformer
-                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>
                                         META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.builder.TypeBuilder
                                     </resource>
                                 </transformer>
@@ -845,12 +809,6 @@
                                 <transformer
                                     implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
-                                        META-INF/dubbo/internal/org.apache.dubbo.registry.client.selector.ServiceInstanceSelector
-                                    </resource>
-                                </transformer>
-                                <transformer
-                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>
                                         META-INF/dubbo/internal/org.apache.dubbo.registry.integration.RegistryProtocolListener
                                     </resource>
                                 </transformer>
diff --git a/dubbo-distribution/dubbo-bom/pom.xml b/dubbo-distribution/dubbo-bom/pom.xml
index 821fa9e..1065927 100644
--- a/dubbo-distribution/dubbo-bom/pom.xml
+++ b/dubbo-distribution/dubbo-bom/pom.xml
@@ -155,21 +155,6 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-registry-xds</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-registry-dns</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-registry-kubernetes</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.dubbo</groupId>
                 <artifactId>dubbo-monitor-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
diff --git a/dubbo-distribution/dubbo-core-spi/pom.xml b/dubbo-distribution/dubbo-core-spi/pom.xml
index 8453537..84e78a5 100644
--- a/dubbo-distribution/dubbo-core-spi/pom.xml
+++ b/dubbo-distribution/dubbo-core-spi/pom.xml
@@ -367,24 +367,12 @@
                                 <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>
                                 <transformer
                                     implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
-                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.WritableMetadataService
-                                    </resource>
-                                </transformer>
-                                <transformer
-                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>
                                         META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.builder.TypeBuilder
                                     </resource>
                                 </transformer>
@@ -529,12 +517,6 @@
                                 <transformer
                                     implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
-                                        META-INF/dubbo/internal/org.apache.dubbo.registry.client.selector.ServiceInstanceSelector
-                                    </resource>
-                                </transformer>
-                                <transformer
-                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>
                                         META-INF/dubbo/internal/org.apache.dubbo.registry.integration.RegistryProtocolListener
                                     </resource>
                                 </transformer>
diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/support/lru/LruCache.java b/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/support/lru/LruCache.java
index 1b8022f..5b7c256 100644
--- a/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/support/lru/LruCache.java
+++ b/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/support/lru/LruCache.java
@@ -18,7 +18,7 @@ package org.apache.dubbo.cache.support.lru;
 
 import org.apache.dubbo.cache.Cache;
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.utils.LRUCache;
+import org.apache.dubbo.common.utils.LRU2Cache;
 
 import java.util.Map;
 
@@ -54,7 +54,7 @@ public class LruCache implements Cache {
      */
     public LruCache(URL url) {
         final int max = url.getParameter("cache.size", 1000);
-        this.store = new LRUCache<>(max);
+        this.store = new LRU2Cache<>(max);
     }
 
     /**
diff --git a/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/lru/LruCacheFactoryTest.java b/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/lru/LruCacheFactoryTest.java
index 8244d4a..132d65a 100644
--- a/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/lru/LruCacheFactoryTest.java
+++ b/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/lru/LruCacheFactoryTest.java
@@ -19,10 +19,11 @@ package org.apache.dubbo.cache.support.lru;
 import org.apache.dubbo.cache.Cache;
 import org.apache.dubbo.cache.support.AbstractCacheFactory;
 import org.apache.dubbo.cache.support.AbstractCacheFactoryTest;
+
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.core.Is.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
 
 public class LruCacheFactoryTest extends AbstractCacheFactoryTest{
     @Test
diff --git a/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/threadlocal/ThreadLocalCacheFactoryTest.java b/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/threadlocal/ThreadLocalCacheFactoryTest.java
index f84e05e..aa57668 100644
--- a/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/threadlocal/ThreadLocalCacheFactoryTest.java
+++ b/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/threadlocal/ThreadLocalCacheFactoryTest.java
@@ -19,10 +19,11 @@ package org.apache.dubbo.cache.support.threadlocal;
 import org.apache.dubbo.cache.Cache;
 import org.apache.dubbo.cache.support.AbstractCacheFactory;
 import org.apache.dubbo.cache.support.AbstractCacheFactoryTest;
+
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.core.Is.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
 
 public class ThreadLocalCacheFactoryTest extends AbstractCacheFactoryTest {
     @Test
diff --git a/dubbo-metadata/dubbo-metadata-api/pom.xml b/dubbo-metadata/dubbo-metadata-api/pom.xml
index 3903f38..ecfd6bc 100644
--- a/dubbo-metadata/dubbo-metadata-api/pom.xml
+++ b/dubbo-metadata/dubbo-metadata-api/pom.xml
@@ -44,7 +44,7 @@
             <artifactId>dubbo-cluster</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
-        
+
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java
index 72a7985..e18d789 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/AbstractServiceNameMapping.java
@@ -19,12 +19,17 @@ package org.apache.dubbo.metadata;
 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.CollectionUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ScopeModelAware;
 
+import java.util.Collections;
+import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
 
 import static java.util.Collections.emptySet;
 import static java.util.Collections.unmodifiableSet;
@@ -38,12 +43,12 @@ import static org.apache.dubbo.common.utils.StringUtils.isBlank;
 public abstract class AbstractServiceNameMapping implements ServiceNameMapping, ScopeModelAware {
     protected final Logger logger = LoggerFactory.getLogger(getClass());
     protected ApplicationModel applicationModel;
-    private WritableMetadataService metadataService;
+    private final Map<String, Set<String>> serviceToAppsMapping = new ConcurrentHashMap<>();
+    private final Map<String, MappingListener> mappingListeners = new ConcurrentHashMap<>();
 
     @Override
     public void setApplicationModel(ApplicationModel applicationModel) {
         this.applicationModel = applicationModel;
-        metadataService = WritableMetadataService.getDefaultExtension(applicationModel);
     }
 
     /**
@@ -60,6 +65,8 @@ public abstract class AbstractServiceNameMapping implements ServiceNameMapping,
      */
     abstract public Set<String> getAndListen(URL url, MappingListener mappingListener);
 
+    abstract protected void removeListener(URL url, MappingListener mappingListener);
+
     @Override
     public Set<String> getServices(URL subscribedURL) {
         Set<String> subscribedServices = new TreeSet<>();
@@ -70,8 +77,10 @@ public abstract class AbstractServiceNameMapping implements ServiceNameMapping,
             subscribedServices.addAll(parseServices(serviceNames));
         }
 
+        String key = ServiceNameMapping.buildMappingKey(subscribedURL);
+
         if (isEmpty(subscribedServices)) {
-            Set<String> cachedServices = metadataService.getCachedMapping(ServiceNameMapping.buildMappingKey(subscribedURL));
+            Set<String> cachedServices = this.getCachedMapping(key);
             if(!isEmpty(cachedServices)) {
                 subscribedServices.addAll(cachedServices);
             }
@@ -81,35 +90,68 @@ public abstract class AbstractServiceNameMapping implements ServiceNameMapping,
             Set<String> mappedServices = get(subscribedURL);
             logger.info(subscribedURL.getServiceInterface() + " mapping to " + mappedServices + " instructed by remote metadata center.");
             subscribedServices.addAll(mappedServices);
-            metadataService.putCachedMapping(ServiceNameMapping.buildMappingKey(subscribedURL), subscribedServices);
         }
+
+        this.putCachedMapping(key, subscribedServices);
+
         return subscribedServices;
     }
 
+    /**
+     * Register callback to listen to mapping changes.
+     *
+     * @return cached or remote mapping data
+     */
     @Override
-    public Set<String> getAndListenServices(URL registryURL, URL subscribedURL, MappingListener listener) {
-        Set<String> subscribedServices = new TreeSet<>();
-        Set<String> globalConfiguredSubscribingServices = parseServices(registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY));
-
-        String serviceNames = subscribedURL.getParameter(PROVIDED_BY);
-        if (StringUtils.isNotEmpty(serviceNames)) {
-            logger.info(subscribedURL.getServiceInterface() + " mapping to " + serviceNames + " instructed by provided-by set by user.");
-            subscribedServices.addAll(parseServices(serviceNames));
-        }
-
-        if (isEmpty(subscribedServices)) {
-            Set<String> mappedServices = getAndListen(subscribedURL, listener);
-            logger.info(subscribedURL.getServiceInterface() + " mapping to " + mappedServices + " instructed by remote metadata center.");
-            subscribedServices.addAll(mappedServices);
-            if (isEmpty(subscribedServices)) {
-                logger.info(subscribedURL.getServiceInterface() + " mapping to " + globalConfiguredSubscribingServices + " by default.");
-                subscribedServices.addAll(globalConfiguredSubscribingServices);
+    public Set<String> getAndListen(URL registryURL, URL subscribedURL, MappingListener listener) {
+        String key = ServiceNameMapping.buildMappingKey(subscribedURL);
+        // use previously cached services.
+        Set<String> cachedServices = this.getCachedMapping(key);
+
+       Runnable runnable = () -> {
+            synchronized (mappingListeners) {
+                if (listener != null) {
+                    Set<String> mappedServices = getAndListen(subscribedURL, listener);
+                    this.putCachedMapping(key, mappedServices);
+                    mappingListeners.put(subscribedURL.getProtocolServiceKey(), listener);
+                } else {
+                    Set<String> mappedServices = get(subscribedURL);
+                    this.putCachedMapping(key, mappedServices);
+                }
+            }
+        };
+
+        // Asynchronously register listener in case previous cache does not exist or cache updating in the future.
+        if (CollectionUtils.isEmpty(cachedServices)) {
+            runnable.run();
+            cachedServices = this.getCachedMapping(key);
+            if (CollectionUtils.isEmpty(cachedServices)) {
+                String registryServices = registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY);
+                if (StringUtils.isNotEmpty(registryServices)) {
+                    logger.info(subscribedURL.getServiceInterface() + " mapping to " + registryServices + " instructed by registry subscribed-services.");
+                    cachedServices = parseServices(registryServices);
+                }
             }
+        } else {
+            ExecutorService executorService = applicationModel.getApplicationExecutorRepository().nextExecutorExecutor();
+            executorService.submit(runnable);
         }
 
-        metadataService.putCachedMapping(ServiceNameMapping.buildMappingKey(subscribedURL), subscribedServices);
+        return cachedServices;
+    }
 
-        return subscribedServices;
+    @Override
+    public MappingListener stopListen(URL subscribeURL) {
+        synchronized (mappingListeners) {
+            MappingListener listener = mappingListeners.remove(subscribeURL.getProtocolServiceKey());
+            //todo, remove listener from remote metadata center
+            listener.stop();
+            removeListener(subscribeURL, listener);
+            if (mappingListeners.size() == 0) {
+                removeCachedMapping(ServiceNameMapping.buildMappingKey(subscribeURL));
+            }
+            return listener;
+        }
     }
 
     static Set<String> parseServices(String literalServices) {
@@ -120,4 +162,28 @@ public abstract class AbstractServiceNameMapping implements ServiceNameMapping,
                 .collect(toSet()));
     }
 
+    @Override
+    public void putCachedMapping(String serviceKey, Set<String> apps) {
+        serviceToAppsMapping.put(serviceKey, new TreeSet<>(apps));
+    }
+
+    @Override
+    public Set<String> getCachedMapping(String mappingKey) {
+        return serviceToAppsMapping.get(mappingKey);
+    }
+
+    @Override
+    public Set<String> getCachedMapping(URL consumerURL) {
+        return serviceToAppsMapping.get(ServiceNameMapping.buildMappingKey(consumerURL));
+    }
+
+    @Override
+    public Set<String> removeCachedMapping(String serviceKey) {
+        return serviceToAppsMapping.remove(serviceKey);
+    }
+
+    @Override
+    public Map<String, Set<String>> getCachedMapping() {
+        return Collections.unmodifiableMap(serviceToAppsMapping);
+    }
 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MappingListener.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MappingListener.java
index f709d75..c9e7922 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MappingListener.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MappingListener.java
@@ -18,4 +18,6 @@ package org.apache.dubbo.metadata;
 
 public interface MappingListener {
     void onEvent(MappingChangedEvent event);
+
+    void stop();
 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java
index 8cfa3de..32b3f5b 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java
@@ -24,7 +24,7 @@ public class MetadataConstants {
     public static final String SERVICE_META_DATA_STORE_TAG = ".smd";
     public static final String CONSUMER_META_DATA_STORE_TAG = ".cmd";
     public static final String METADATA_PUBLISH_DELAY_KEY = "dubbo.application.metadata.publish.delay";
-    public static final int DEFAULT_METADATA_PUBLISH_DELAY = 10000;
+    public static final int DEFAULT_METADATA_PUBLISH_DELAY = 30000;
     public static final String METADATA_PROXY_TIMEOUT_KEY = "dubbo.application.metadata.proxy.delay";
     public static final int DEFAULT_METADATA_TIMEOUT_VALUE = 5000;
 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
index 3c3a614..0d10238 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
@@ -27,12 +27,17 @@ import org.apache.dubbo.common.utils.StringUtils;
 
 import java.io.Serializable;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.SortedSet;
 import java.util.TreeMap;
+import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentNavigableMap;
+import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import static org.apache.dubbo.common.constants.CommonConstants.DOT_SEPARATOR;
@@ -59,9 +64,15 @@ public class MetadataInfo implements Serializable {
     private String revision;
     private Map<String, ServiceInfo> services;
 
+    private volatile AtomicBoolean initiated = new AtomicBoolean(false);
+
     // used at runtime
-    private transient Map<String, String> extendParams;
-    private transient AtomicBoolean reported = new AtomicBoolean(false);
+    private transient final Map<String, String> extendParams;
+    private transient final Map<String, String> instanceParams;
+    protected transient AtomicBoolean updated = new AtomicBoolean(false);
+    private transient ConcurrentNavigableMap<String, SortedSet<URL>> subscribedServiceURLs;
+    private transient ConcurrentNavigableMap<String, SortedSet<URL>> exportedServiceURLs;
+    private transient ExtensionLoader<MetadataParamsFilter> loader;
 
     public MetadataInfo() {
         this(null);
@@ -76,30 +87,52 @@ public class MetadataInfo implements Serializable {
         this.revision = revision;
         this.services = services == null ? new ConcurrentHashMap<>() : services;
         this.extendParams = new ConcurrentHashMap<>();
+        this.instanceParams = new ConcurrentHashMap<>();
     }
 
-    public void addService(ServiceInfo serviceInfo) {
-        if (serviceInfo == null) {
+    /**
+     * Initialize is needed when MetadataInfo is created from deserialization on the consumer side before being used for RPC call.
+     */
+    public void init() {
+        if (!initiated.compareAndSet(false, true)) {
             return;
         }
-        this.services.put(serviceInfo.getMatchKey(), serviceInfo);
-        markChanged();
+        if (CollectionUtils.isNotEmptyMap(services)) {
+            services.forEach((_k, serviceInfo) -> {
+                serviceInfo.init();
+            });
+        }
     }
 
-    public void removeService(ServiceInfo serviceInfo) {
-        if (serviceInfo == null) {
-            return;
+    public synchronized void addService(URL url) {
+        // fixme, pass in application mode context during initialization of MetadataInfo.
+        if (this.loader == null) {
+            this.loader = url.getOrDefaultApplicationModel().getExtensionLoader(MetadataParamsFilter.class);
+        }
+        List<MetadataParamsFilter> filters = loader.getActivateExtension(url, "params-filter");
+        // generate service level metadata
+        ServiceInfo serviceInfo = new ServiceInfo(url, filters);
+        this.services.put(serviceInfo.getMatchKey(), serviceInfo);
+        // extract common instance level params
+        extractInstanceParams(url, filters);
+
+        if (exportedServiceURLs == null) {
+            exportedServiceURLs = new ConcurrentSkipListMap<>();
         }
-        this.services.remove(serviceInfo.getMatchKey());
-        markChanged();
+        addURL(exportedServiceURLs, url);
+        updated.compareAndSet(false, true);
     }
 
-    public void removeService(String key) {
-        if (key == null) {
+    public synchronized void removeService(URL url) {
+        if (url == null) {
             return;
         }
-        this.services.remove(key);
-        markChanged();
+        this.services.remove(url.getProtocolServiceKey());
+        if (exportedServiceURLs != null) {
+            removeURL(exportedServiceURLs, url);
+        }
+
+        updated.compareAndSet(false, true);
     }
 
     public String getRevision() {
@@ -109,11 +142,13 @@ public class MetadataInfo implements Serializable {
     /**
      * Reported status and metadata modification must be synchronized if used in multiple threads.
      */
-    public String calAndGetRevision() {
-        if (revision != null && hasReported()) {
+    public synchronized String calAndGetRevision() {
+        if (revision != null && !updated.get()) {
             return revision;
         }
 
+        updated.compareAndSet(true, false);
+
         if (CollectionUtils.isEmptyMap(services)) {
             this.revision = EMPTY_REVISION;
         } else {
@@ -137,27 +172,6 @@ public class MetadataInfo implements Serializable {
         this.revision = revision;
     }
 
-    /**
-     * Reported status and metadata modification must be synchronized if used in multiple threads.
-     */
-    public boolean hasReported() {
-        return reported.get();
-    }
-
-    /**
-     * Reported status and metadata modification must be synchronized if used in multiple threads.
-     */
-    public void markReported() {
-        reported.compareAndSet(false, true);
-    }
-
-    /**
-     * Reported status and metadata modification must be synchronized if used in multiple threads.
-     */
-    public void markChanged() {
-        reported.compareAndSet(true, false);
-    }
-
     public String getApp() {
         return app;
     }
@@ -170,10 +184,6 @@ public class MetadataInfo implements Serializable {
         return services;
     }
 
-    public void setServices(Map<String, ServiceInfo> services) {
-        this.services = services;
-    }
-
     public ServiceInfo getServiceInfo(String protocolServiceKey) {
         return services.get(protocolServiceKey);
     }
@@ -182,6 +192,10 @@ public class MetadataInfo implements Serializable {
         return extendParams;
     }
 
+    public Map<String, String> getInstanceParams() {
+        return instanceParams;
+    }
+
     public String getParameter(String key, String serviceKey) {
         ServiceInfo serviceInfo = services.get(serviceKey);
         if (serviceInfo == null) {
@@ -210,6 +224,52 @@ public class MetadataInfo implements Serializable {
         return serviceInfo.toFullString();
     }
 
+    public synchronized void addSubscribedURL(URL url) {
+        if (subscribedServiceURLs == null) {
+            subscribedServiceURLs = new ConcurrentSkipListMap<>();
+        }
+        addURL(subscribedServiceURLs, url);
+    }
+
+    public boolean removeSubscribedURL(URL url) {
+        if (subscribedServiceURLs == null) {
+            return true;
+        }
+        return removeURL(subscribedServiceURLs, url);
+    }
+
+    public ConcurrentNavigableMap<String, SortedSet<URL>> getSubscribedServiceURLs() {
+        return subscribedServiceURLs;
+    }
+
+    public ConcurrentNavigableMap<String, SortedSet<URL>> getExportedServiceURLs() {
+        return exportedServiceURLs;
+    }
+
+    private boolean addURL(Map<String, SortedSet<URL>> serviceURLs, URL url) {
+        SortedSet<URL> urls = serviceURLs.computeIfAbsent(url.getServiceKey(), this::newSortedURLs);
+        // make sure the parameters of tmpUrl is variable
+        return urls.add(url);
+    }
+
+    boolean removeURL(Map<String, SortedSet<URL>> serviceURLs, URL url) {
+        String key = url.getServiceKey();
+        SortedSet<URL> urls = serviceURLs.getOrDefault(key, null);
+        if (urls == null) {
+            return true;
+        }
+        boolean r = urls.remove(url);
+        // if it is empty
+        if (urls.isEmpty()) {
+            serviceURLs.remove(key);
+        }
+        return r;
+    }
+
+    private SortedSet<URL> newSortedURLs(String serviceKey) {
+        return new TreeSet<>(URLComparator.INSTANCE);
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(app, services);
@@ -228,8 +288,34 @@ public class MetadataInfo implements Serializable {
         MetadataInfo other = (MetadataInfo)obj;
 
         return Objects.equals(app, other.getApp())
-            && ((services == null && other.getServices() == null)
-                || (services != null && services.equals(other.getServices())));
+            && ((services == null && other.services == null)
+                || (services != null && services.equals(other.services)));
+    }
+
+    private void extractInstanceParams(URL url, List<MetadataParamsFilter> filters) {
+        if (CollectionUtils.isEmpty(filters)) {
+            return;
+        }
+
+        filters.forEach(filter -> {
+            String[] included = filter.instanceParamsIncluded();
+            if (ArrayUtils.isEmpty(included)) {
+                /*
+                 * Does not put any parameter in instance if not specified.
+                 * It will bring no functional suppression as long as all params will appear in service metadata.
+                 */
+            } else {
+                for (String p : included) {
+                    String value = url.getParameter(p);
+                    if (value != null) {
+                        String oldValue = instanceParams.put(p, value);
+                        if (oldValue != null && !oldValue.equals(value)) {
+                            throw new IllegalStateException(String.format("Inconsistent instance metadata found in different services: %s, %s", oldValue, value));
+                        }
+                    }
+                }
+            }
+        });
     }
 
     @Override
@@ -267,32 +353,29 @@ public class MetadataInfo implements Serializable {
         private Map<String, String> params;
 
         // params configured on consumer side,
-        private transient Map<String, String> consumerParams;
+        private volatile transient Map<String, String> consumerParams;
         // cached method params
-        private transient Map<String, Map<String, String>> methodParams;
-        private transient Map<String, Map<String, String>> consumerMethodParams;
+        private volatile transient Map<String, Map<String, String>> methodParams;
+        private volatile transient Map<String, Map<String, String>> consumerMethodParams;
         // cached numbers
-        private transient Map<String, Number> numbers;
-        private transient Map<String, Map<String, Number>> methodNumbers;
+        private volatile transient Map<String, Number> numbers;
+        private volatile transient Map<String, Map<String, Number>> methodNumbers;
         // service + group + version
-        private transient String serviceKey;
+        private volatile transient String serviceKey;
         // service + group + version + protocol
-        private transient String matchKey;
+        private volatile transient String matchKey;
 
         private transient URL url;
-        private transient ExtensionLoader<MetadataParamsFilter> loader;
 
         private final static String[] KEYS_TO_REMOVE = {MONITOR_KEY, BIND_IP_KEY, BIND_PORT_KEY, QOS_ENABLE,
             QOS_HOST, QOS_PORT, ACCEPT_FOREIGN_IP, VALIDATION_KEY, INTERFACES, PID_KEY, TIMESTAMP_KEY};
 
         public ServiceInfo() {}
 
-        public ServiceInfo(URL url) {
+        public ServiceInfo(URL url, List<MetadataParamsFilter> filters) {
             this(url.getServiceInterface(), url.getGroup(), url.getVersion(), url.getProtocol(), url.getPath(), null);
-            this.loader = url.getOrDefaultApplicationModel().getExtensionLoader(MetadataParamsFilter.class);
             this.url = url;
             Map<String, String> params = new HashMap<>();
-            List<MetadataParamsFilter> filters = loader.getActivateExtension(url, "params-filter");
             if (filters.size() == 0) {
                 params.putAll(url.getParameters());
                 for (String key : KEYS_TO_REMOVE) {
@@ -320,6 +403,9 @@ public class MetadataInfo implements Serializable {
                 }
             }
             this.params = params;
+            // initialize method params caches.
+            this.methodParams = URLParam.initMethodParameters(params);
+            this.consumerMethodParams = URLParam.initMethodParameters(consumerParams);
         }
 
         public ServiceInfo(String name, String group, String version, String protocol, String path, Map<String, String> params) {
@@ -330,10 +416,24 @@ public class MetadataInfo implements Serializable {
             this.path = path;
             this.params = params == null ? new ConcurrentHashMap<>() : params;
 
-            this.serviceKey = URL.buildKey(name, group, version);
+            this.serviceKey = buildServiceKey(name, group, version);
             this.matchKey = buildMatchKey();
         }
 
+        /**
+         * Initialize necessary caches right after deserialization on the consumer side
+         */
+        protected void init() {
+            buildMatchKey();
+            buildServiceKey(name, group, version);
+            // init method params
+            this.methodParams = URLParam.initMethodParameters(params);
+            // Actually, consumer params is empty after deserialization on the consumer side, so no need to initialize.
+            // Check how InstanceAddressURL operates on consumer url for more detail.
+//            this.consumerMethodParams = URLParam.initMethodParameters(consumerParams);
+            // no need to init numbers for it's only for cache purpose
+        }
+
         public String getMatchKey() {
             if (matchKey != null) {
                 return matchKey;
@@ -350,11 +450,16 @@ public class MetadataInfo implements Serializable {
             return matchKey;
         }
 
+        private String buildServiceKey(String name, String group, String version) {
+            this.serviceKey = URL.buildKey(name, group, version);
+            return this.serviceKey;
+        }
+
         public String getServiceKey() {
             if (serviceKey != null) {
                 return serviceKey;
             }
-            this.serviceKey = URL.buildKey(name, group, version);
+            buildServiceKey(name, group, version);
             return serviceKey;
         }
 
@@ -430,11 +535,6 @@ public class MetadataInfo implements Serializable {
         }
 
         public String getMethodParameter(String method, String key, String defaultValue) {
-            if (methodParams == null) {
-                methodParams = URLParam.initMethodParameters(params);
-                consumerMethodParams = URLParam.initMethodParameters(consumerParams);
-            }
-
             String value = getMethodParameter(method, key, consumerMethodParams);
             if (value != null) {
                 return value;
@@ -445,11 +545,13 @@ public class MetadataInfo implements Serializable {
 
         private String getMethodParameter(String method, String key, Map<String, Map<String, String>> map) {
             String value = null;
-            if (map != null) {
-                Map<String, String> keyMap = map.get(method);
-                if (keyMap != null) {
-                    value = keyMap.get(key);
-                }
+            if (map == null) {
+                return value;
+            }
+
+            Map<String, String> keyMap = map.get(method);
+            if (keyMap != null) {
+                value = keyMap.get(key);
             }
             return value;
         }
@@ -460,12 +562,8 @@ public class MetadataInfo implements Serializable {
         }
 
         public boolean hasMethodParameter(String method) {
-            if (methodParams == null) {
-                methodParams = URLParam.initMethodParameters(params);
-                consumerMethodParams = URLParam.initMethodParameters(consumerParams);
-            }
-
-            return consumerMethodParams.containsKey(method) || methodParams.containsKey(method);
+            return (consumerMethodParams != null && consumerMethodParams.containsKey(method))
+                || (methodParams != null && methodParams.containsKey(method));
         }
 
         public String toDescString() {
@@ -476,18 +574,24 @@ public class MetadataInfo implements Serializable {
             if (consumerParams != null) {
                 this.consumerParams.put(key, value);
             }
+            // refresh method params
+            consumerMethodParams = URLParam.initMethodParameters(consumerParams);
         }
 
         public void addParameterIfAbsent(String key, String value) {
             if (consumerParams != null) {
                 this.consumerParams.putIfAbsent(key, value);
             }
+            // refresh method params
+            consumerMethodParams = URLParam.initMethodParameters(consumerParams);
         }
 
         public void addConsumerParams(Map<String, String> params) {
             // copy once for one service subscription
             if (consumerParams == null) {
                 consumerParams = new ConcurrentHashMap<>(params);
+                // init method params
+                consumerMethodParams = URLParam.initMethodParameters(consumerParams);
             }
         }
 
@@ -552,4 +656,14 @@ public class MetadataInfo implements Serializable {
                 "}";
         }
     }
+
+    static class URLComparator implements Comparator<URL> {
+
+        public static final URLComparator INSTANCE = new URLComparator();
+
+        @Override
+        public int compare(URL o1, URL o2) {
+            return o1.toFullString().compareTo(o2.toFullString());
+        }
+    }
 }
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 5ccb0b0..6e48658 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
@@ -20,51 +20,29 @@ import org.apache.dubbo.common.URL;
 
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
-import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
 import static java.util.Collections.unmodifiableSortedSet;
-import static java.util.stream.StreamSupport.stream;
 import static org.apache.dubbo.common.URL.buildKey;
 
 /**
- * A framework interface of Dubbo Metadata Service defines the contract of Dubbo Services registration and subscription
- * between Dubbo service providers and its consumers. The implementation will be exported as a normal Dubbo service that
- * the clients would subscribe, whose version comes from the {@link #version()} method and group gets from
- * {@link #serviceName()}, that means, The different Dubbo service(application) will export the different
- * {@link MetadataService} that persists all the exported and subscribed metadata, they are present by
- * {@link #getExportedURLs()} and {@link #getSubscribedURLs()} respectively. What's more, {@link MetadataService}
- * also providers the fine-grain methods for the precise queries.
- *
- * @see WritableMetadataService
- * @since 2.7.5
+ * This service is used to expose the metadata information inside a Dubbo process.
+ * Typical uses include:
+ * 1. The Consumer queries the metadata information of the Provider to list the interfaces and each interface's configuration
+ * 2. The Console (dubbo-admin) queries for the metadata of a specific process, or aggregate data of all processes.
  */
 public interface MetadataService {
 
-    //FIXME the value is default, it was used by testing temporarily
-    static final String DEFAULT_EXTENSION = "default";
-
-    /**
-     * The value of all service names
-     */
-    String ALL_SERVICE_NAMES = "*";
-
     /**
      * The value of All service instances
      */
     String ALL_SERVICE_INTERFACES = "*";
 
     /**
-     * The service interface name of {@link MetadataService}
-     */
-    String SERVICE_INTERFACE_NAME = MetadataService.class.getName();
-
-    /**
      * The contract version of {@link MetadataService}, the future update must make sure compatible.
      */
     String VERSION = "1.0.0";
@@ -86,6 +64,8 @@ public interface MetadataService {
         return VERSION;
     }
 
+    URL getMetadataURL();
+
     /**
      * the list of String that presents all Dubbo subscribed {@link URL urls}
      *
@@ -176,39 +156,11 @@ public interface MetadataService {
         return getServiceDefinition(buildKey(interfaceName, group, version));
     }
 
-    /**
-     * Interface definition.
-     *
-     * @return
-     */
     String getServiceDefinition(String serviceKey);
 
     MetadataInfo getMetadataInfo(String revision);
 
-    Map<String, MetadataInfo> getMetadataInfos();
-
-    /**
-     * Is the {@link URL} for the {@link MetadataService} or not?
-     *
-     * @param url {@link URL url}
-     * @return
-     */
-    static boolean isMetadataServiceURL(URL url) {
-        String serviceInterface = url.getServiceInterface();
-        return SERVICE_INTERFACE_NAME.equals(serviceInterface);
-    }
-
-    /**
-     * Convert the multiple {@link URL urls} to a {@link List list} of {@link URL urls}
-     *
-     * @param urls the strings presents the {@link URL Dubbo URLs}
-     * @return non-null
-     */
-    static List<URL> toURLs(Iterable<String> urls) {
-        return stream(urls.spliterator(), false)
-                .map(URL::valueOf)
-                .collect(Collectors.toList());
-    }
+    List<MetadataInfo> getMetadataInfos();
 
     /**
      * Convert the specified {@link Iterable} of {@link URL URLs} to be the {@link URL#toFullString() strings} presenting
@@ -234,45 +186,8 @@ public interface MetadataService {
         return unmodifiableSortedSet(stream.map(URL::toFullString).collect(TreeSet::new, Set::add, Set::addAll));
     }
 
-    /**
-     * Export Metadata in Service Instance of Service Discovery
-     * <p>
-     * Used for consumer to get Service Instance Metadata
-     * if Registry is unsupported with publishing metadata
-     *
-     * @param instanceMetadata {@link Map} of provider Service Instance Metadata
-     * @since 3.0
-     */
-    default void exportInstanceMetadata(String instanceMetadata) {
-        throw new UnsupportedOperationException("This operation is not supported for consumer.");
-    }
-
-    /**
-     * Get all Metadata listener from local
-     * <p>
-     * Used for consumer to get Service Instance Metadata
-     * if Registry is unsupported with publishing metadata
-     *
-     * @return {@link Map} of {@link InstanceMetadataChangedListener}
-     * @since 3.0
-     */
-    default Map<String, InstanceMetadataChangedListener> getInstanceMetadataChangedListenerMap() {
-        throw new UnsupportedOperationException("This operation is not supported for consumer.");
+    static boolean isMetadataService(String interfaceName) {
+        return interfaceName != null && interfaceName.equals(MetadataService.class.getName());
     }
 
-    /**
-     * 1. Fetch Metadata in Service Instance of Service Discovery
-     * 2. Add a metadata change listener
-     * <p>
-     * Used for consumer to get Service Instance Metadata
-     * if Registry is unsupported with publishing metadata
-     *
-     * @param consumerId consumerId
-     * @param listener   {@link InstanceMetadataChangedListener} used to notify event
-     * @return {@link Map} of provider Service Instance Metadata
-     * @since 3.0
-     */
-    default String getAndListenInstanceMetadata(String consumerId, InstanceMetadataChangedListener listener) {
-        throw new UnsupportedOperationException("This operation is not supported for consumer.");
-    }
 }
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/ServiceNameMapping.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/ServiceNameMapping.java
index ac71b5c..ab923e7 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/ServiceNameMapping.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/ServiceNameMapping.java
@@ -18,13 +18,15 @@ package org.apache.dubbo.metadata;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.SPI;
+import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.model.ScopeModel;
 import org.apache.dubbo.rpc.model.ScopeModelUtil;
 
 import java.util.Arrays;
-import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 import static java.util.Collections.emptySet;
 import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;
@@ -32,9 +34,9 @@ import static org.apache.dubbo.common.extension.ExtensionScope.APPLICATION;
 import static org.apache.dubbo.common.utils.StringUtils.SLASH;
 
 /**
- * The interface for Dubbo service name Mapping
+ * This will interact with remote metadata center to find the interface-app mapping and will cache the data locally.
  *
- * @since 2.7.5
+ * Call variants of getCachedMapping() methods whenever need to use the mapping data.
  */
 @SPI(value = "metadata", scope = APPLICATION)
 public interface ServiceNameMapping {
@@ -65,26 +67,54 @@ public interface ServiceNameMapping {
     }
 
     static String toStringKeys(Set<String> serviceNames) {
-        return serviceNames.toString();
+        if (CollectionUtils.isEmpty(serviceNames)) {
+            return "";
+        }
+
+        StringBuilder builder = new StringBuilder();
+        for (String n : serviceNames) {
+            builder.append(n);
+            builder.append(COMMA_SEPARATOR);
+        }
+
+        builder.deleteCharAt(builder.length() - 1);
+        return builder.toString();
     }
 
     static Set<String> getAppNames(String content) {
         if (StringUtils.isBlank(content)) {
             return emptySet();
         }
-        return new HashSet<>(Arrays.asList(content.split(COMMA_SEPARATOR)));
+        return new TreeSet<>(Arrays.asList(content.split(COMMA_SEPARATOR)));
     }
 
     /**
-     * 1.developer explicitly specifies the application name this interface belongs to
-     * 2.check Interface-App mapping
+     * Get the mapping data from remote metadata center and cache in local storage.
+     *
+     * @return app list current interface mapping to, in sequence determined by:
+     * 1.check PROVIDED_BY
+     * 2.check remote metadata center
+     *
      */
     Set<String> getServices(URL subscribedURL);
 
     /**
-     * 1.developer explicitly specifies the application name this interface belongs to
-     * 2.check Interface-App mapping
-     * 3.use the services specified in registry url.
+     * Register listener to get notified once mapping data changes.
+     *
+     * @param listener
+     * @return
      */
-    Set<String> getAndListenServices(URL registryURL, URL subscribedURL, MappingListener listener);
+    Set<String> getAndListen(URL registryURL, URL subscribedURL, MappingListener listener);
+
+    MappingListener stopListen(URL subscribeURL);
+
+    void putCachedMapping(String serviceKey, Set<String> apps);
+
+    Set<String> getCachedMapping(String mappingKey);
+
+    Set<String> getCachedMapping(URL consumerURL);
+
+    Map<String, Set<String>> getCachedMapping();
+
+    Set<String> removeCachedMapping(String serviceKey);
 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/WritableMetadataService.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/WritableMetadataService.java
deleted file mode 100644
index bd77ec5..0000000
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/WritableMetadataService.java
+++ /dev/null
@@ -1,100 +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.ExtensionLoader;
-import org.apache.dubbo.common.extension.ExtensionScope;
-import org.apache.dubbo.common.extension.SPI;
-import org.apache.dubbo.rpc.model.ScopeModel;
-import org.apache.dubbo.rpc.model.ScopeModelUtil;
-
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Local {@link MetadataService} that extends {@link MetadataService} and provides the modification, which is used for
- * Dubbo's consumers and providers.
- *
- * @since 2.7.5
- */
-@SPI(value = "default", scope = ExtensionScope.APPLICATION)
-public interface WritableMetadataService extends MetadataService {
-
-    /**
-     * Exports a {@link URL}
-     *
-     * @param url a {@link URL}
-     * @return If success , return <code>true</code>
-     */
-    boolean exportURL(URL url);
-
-    /**
-     * Unexports a {@link URL}
-     *
-     * @param url a {@link URL}
-     * @return If success , return <code>true</code>
-     */
-    boolean unexportURL(URL url);
-
-    /**
-     * Subscribes a {@link URL}
-     *
-     * @param url a {@link URL}
-     * @return If success , return <code>true</code>
-     */
-    boolean subscribeURL(URL url);
-
-    /**
-     * Unsubscribes a {@link URL}
-     *
-     * @param url a {@link URL}
-     * @return If success , return <code>true</code>
-     */
-    boolean unsubscribeURL(URL url);
-
-    void publishServiceDefinition(URL url);
-
-    default void setMetadataServiceURL(URL url) {
-
-    }
-
-    default URL getMetadataServiceURL() {
-        return null;
-    }
-
-    void putCachedMapping(String serviceKey, Set<String> apps);
-
-    Set<String> getCachedMapping(String mappingKey);
-
-    Set<String> getCachedMapping(URL consumerURL);
-
-    Set<String> removeCachedMapping(String serviceKey);
-
-    Map<String, Set<String>> getCachedMapping();
-
-    MetadataInfo getDefaultMetadataInfo();
-
-    /**
-     * Get {@link ExtensionLoader#getDefaultExtension() the defautl extension} of {@link WritableMetadataService}
-     *
-     * @return non-null
-     */
-    static WritableMetadataService getDefaultExtension(ScopeModel scopeModel) {
-        return ScopeModelUtil.getExtensionLoader(WritableMetadataService.class, scopeModel).getDefaultExtension();
-    }
-}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java
index 3dc659e..9cb009b 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java
@@ -45,6 +45,9 @@ public interface MetadataReport {
     default void publishAppMetadata(SubscriberMetadataIdentifier identifier, MetadataInfo metadataInfo) {
     }
 
+    default void unPublishAppMetadata(SubscriberMetadataIdentifier identifier, MetadataInfo metadataInfo) {
+    }
+
     default MetadataInfo getAppMetadata(SubscriberMetadataIdentifier identifier, Map<String, String> instanceMetadata) {
         return null;
     }
@@ -78,6 +81,10 @@ public interface MetadataReport {
         return false;
     }
 
+    default void removeServiceAppMappingListener(String serviceKey, MappingListener listener) {
+
+    }
+
     /**
      * Service<-->Application Mapping -- START
      **/
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 ee40342..be4664d 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
@@ -18,34 +18,68 @@ package org.apache.dubbo.metadata.report;
 
 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;
+import java.util.List;
 import java.util.Map;
 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;
 
 /**
- * 2019-08-09
+ * Repository of MetadataReport instances that can talk to remote metadata server.
+ *
+ * MetadataReport instances are initiated during the beginning of deployer.start() and used by components that
+ * need to interact with metadata server.
+ *
+ * If multiple metadata reports and registries need to be declared, it is recommended to group each two metadata report and registry together by giving them the same id:
+ * <dubbo:registry id=demo1 address="registry://"/>
+ * <dubbo:metadata id=demo1 address="metadata://"/>
+ *
+ * <dubbo:registry id=demo2 address="registry://"/>
+ * <dubbo:metadata id=demo2 address="metadata://"/>
  */
-public class MetadataReportInstance {
+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) {
+    public void init(List<MetadataReportConfig> metadataReportConfigs) {
         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();
+        for (MetadataReportConfig metadataReportConfig : metadataReportConfigs) {
+            init(metadataReportConfig, metadataReportFactory);
+        }
+    }
+
+    private void init(MetadataReportConfig config, MetadataReportFactory metadataReportFactory) {
         URL url = config.toUrl();
         if (METADATA_REPORT_KEY.equals(url.getProtocol())) {
             String protocol = url.getParameter(METADATA_REPORT_KEY, DEFAULT_DIRECTORY);
@@ -56,7 +90,7 @@ public class MetadataReportInstance {
                     .build();
         }
         url = url.addParameterIfAbsent(APPLICATION_KEY, applicationModel.getCurrentConfig().getName());
-        String relatedRegistryId = config.getRegistry() == null ? DEFAULT_KEY : config.getRegistry();
+        String relatedRegistryId = isEmpty(config.getRegistry()) ? (isEmpty(config.getId()) ? DEFAULT_KEY : config.getId()) : config.getRegistry();
 //        RegistryConfig registryConfig = applicationModel.getConfigManager().getRegistry(relatedRegistryId)
 //                .orElseThrow(() -> new IllegalStateException("Registry id " + relatedRegistryId + " does not exist."));
         MetadataReport metadataReport = metadataReportFactory.getMetadataReport(url);
@@ -66,26 +100,34 @@ public class MetadataReportInstance {
     }
 
     public Map<String, MetadataReport> getMetadataReports(boolean checked) {
-        if (checked) {
-            checkInit();
-        }
         return metadataReports;
     }
 
     public MetadataReport getMetadataReport(String registryKey) {
-        checkInit();
         MetadataReport metadataReport = metadataReports.get(registryKey);
-        if (metadataReport == null) {
+        if (metadataReport == null && metadataReports.size() > 0) {
             metadataReport = metadataReports.values().iterator().next();
         }
         return metadataReport;
     }
 
+    public MetadataReport getNopMetadataReport() {
+        return nopMetadataReport;
+    }
+
+    public String getMetadataType() {
+        return metadataType;
+    }
 
-    private void checkInit() {
-        if (!init.get()) {
-            throw new IllegalStateException("the metadata report was not initialized.");
-        }
+    public boolean inited() {
+        return init.get();
     }
 
+    @Override
+    public void destroy() {
+        metadataReports.forEach((_k, reporter) -> {
+            reporter.destroy();
+        });
+        metadataReports.clear();
+    }
 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
index 093fadb..71901c5 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.metadata.report.support;
 
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
@@ -32,6 +30,9 @@ 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 com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -75,9 +76,6 @@ import static org.apache.dubbo.metadata.report.support.Constants.DEFAULT_METADAT
 import static org.apache.dubbo.metadata.report.support.Constants.DUBBO_METADATA;
 import static org.apache.dubbo.metadata.report.support.Constants.USER_HOME;
 
-/**
- *
- */
 public abstract class AbstractMetadataReport implements MetadataReport {
 
     protected final static String DEFAULT_ROOT = "dubbo";
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/main/java/org/apache/dubbo/metadata/store/AbstractAbstractWritableMetadataService.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/AbstractAbstractWritableMetadataService.java
deleted file mode 100644
index d084477..0000000
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/AbstractAbstractWritableMetadataService.java
+++ /dev/null
@@ -1,98 +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.store;
-
-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.StringUtils;
-import org.apache.dubbo.metadata.WritableMetadataService;
-import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
-
-import com.google.gson.Gson;
-
-import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;
-import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
-import static org.apache.dubbo.common.utils.ClassUtils.forName;
-import static org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder.buildFullDefinition;
-import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;
-import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;
-import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;
-import static org.apache.dubbo.rpc.support.ProtocolUtils.isGeneric;
-
-/**
- * The abstract implementation of {@link WritableMetadataService}
- *
- * @see WritableMetadataService
- * @since 2.7.8
- */
-public abstract class AbstractAbstractWritableMetadataService implements WritableMetadataService {
-
-    protected final Logger logger = LoggerFactory.getLogger(getClass());
-
-    @Override
-    public void publishServiceDefinition(URL url) {
-        if (SERVICE_INTERFACE_NAME.equals(url.getServiceInterface())) { // Ignore the interface "MetadataService"
-            return;
-        }
-
-        // Remove the useless parameters
-        url = url.removeParameters(PID_KEY, TIMESTAMP_KEY, BIND_IP_KEY, BIND_PORT_KEY, TIMESTAMP_KEY);
-
-        String side = url.getSide();
-        if (PROVIDER_SIDE.equalsIgnoreCase(side)) {
-            publishProviderServiceDefinition(url);
-        } else {
-            publishConsumerParameters(url);
-        }
-    }
-
-    protected void publishProviderServiceDefinition(URL url) {
-        String serviceDefinition = getServiceDefinition(url);
-        if (!StringUtils.isBlank(serviceDefinition)) {
-            publishServiceDefinition(url.getServiceKey(), serviceDefinition);
-        }
-    }
-
-    protected String getServiceDefinition(URL exportedURL) {
-        String interfaceName = exportedURL.getServiceInterface();
-        String json = null;
-        try {
-            if (StringUtils.isNotEmpty(interfaceName) && !isGeneric(exportedURL.getParameter(GENERIC_KEY))) {
-                Class interfaceClass = forName(interfaceName);
-                ServiceDefinition serviceDefinition = buildFullDefinition(interfaceClass, exportedURL.getParameters());
-                Gson gson = new Gson();
-                json = gson.toJson(serviceDefinition);
-            }
-        } catch (ClassNotFoundException e) {
-            //ignore error
-            if (logger.isErrorEnabled()) {
-                logger.error("The interface class[name : " + interfaceName + "] can't be found , providerUrl: "
-                        + exportedURL.toFullString());
-            }
-        }
-        return json;
-    }
-
-    protected void publishConsumerParameters(URL url) {
-    }
-
-    protected void publishServiceDefinition(String key, String json) {
-    }
-
-}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/AbstractServiceNameMappingTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/AbstractServiceNameMappingTest.java
index 2c974c8..7f71705 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/AbstractServiceNameMappingTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/AbstractServiceNameMappingTest.java
@@ -17,19 +17,16 @@
 package org.apache.dubbo.metadata;
 
 import org.apache.dubbo.common.URL;
+
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
 
 import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDED_BY;
 import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;
@@ -40,53 +37,68 @@ import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SER
 class AbstractServiceNameMappingTest {
 
     private MockServiceNameMapping mapping = new MockServiceNameMapping();
-    private MockWritableMetadataService writableMetadataService = new MockWritableMetadataService();
+    private MockServiceNameMapping2 mapping2 = new MockServiceNameMapping2();
+
+    URL url = URL.valueOf("dubbo://127.0.0.1:21880/" + AbstractServiceNameMappingTest.class);
 
     @BeforeEach
-    public void setUp() throws Exception {
-        Field metadataService = mapping.getClass().getSuperclass().getDeclaredField("metadataService");
-        metadataService.setAccessible(true);
-        metadataService.set(mapping, writableMetadataService);
+    public void setUp() throws Exception {}
+
+    @AfterEach
+    public void clearup() throws Exception {
+        mapping.removeCachedMapping(ServiceNameMapping.buildMappingKey(url));
     }
 
     @Test
     void testGetServices() {
-        URL url = URL.valueOf("dubbo://127.0.0.1:21880/" + AbstractServiceNameMappingTest.class);
         url = url.addParameter(PROVIDED_BY, "app1,app2");
         Set<String> services = mapping.getServices(url);
         Assertions.assertTrue(services.contains("app1"));
         Assertions.assertTrue(services.contains("app2"));
 
+        // check mapping cache works.
         url = url.removeParameter(PROVIDED_BY);
         services = mapping.getServices(url);
+        Assertions.assertTrue(services.contains("app1"));
+        Assertions.assertTrue(services.contains("app2"));
+
+        // remove mapping cache, check get() works.
+        mapping.removeCachedMapping(ServiceNameMapping.buildMappingKey(url));
+        services = mapping.getServices(url);
         Assertions.assertTrue(services.contains("remote-app1"));
         Assertions.assertTrue(services.contains("remote-app2"));
 
 
-        Map<String, Set<String>> cachedMapping = writableMetadataService.getCachedMapping();
-        Assertions.assertNotNull(cachedMapping);
-        Assertions.assertTrue(cachedMapping.containsKey(ServiceNameMapping.buildMappingKey(url)));
-        Assertions.assertIterableEquals(cachedMapping.get(ServiceNameMapping.buildMappingKey(url)), services);
-
+        Assertions.assertNotNull(mapping.getCachedMapping(url));
+        Assertions.assertIterableEquals(mapping.getCachedMapping(url), services);
     }
 
     @Test
     public void testGetAndListener() {
-        URL url = URL.valueOf("dubbo://127.0.0.1:21880/" + AbstractServiceNameMappingTest.class);
         URL registryURL = URL.valueOf("registry://127.0.0.1:7777/test");
         registryURL = registryURL.addParameter(SUBSCRIBED_SERVICE_NAMES_KEY, "registry-app1");
 
-        Set<String> services = mapping.getAndListenServices(registryURL, url, null);
+        Set<String> services = mapping2.getAndListen(registryURL, url, null);
         Assertions.assertTrue(services.contains("registry-app1"));
 
-        mapping.enabled = true;
-        services = mapping.getAndListenServices(registryURL, url, event -> {
+        // remove mapping cache, check get() works.
+        mapping.removeCachedMapping(ServiceNameMapping.buildMappingKey(url));
+        mapping2.enabled = true;
+        services = mapping2.getAndListen(registryURL, url, new MappingListener() {
+            @Override
+            public void onEvent(MappingChangedEvent event) {
+
+            }
+
+            @Override
+            public void stop() {
+
+            }
         });
         Assertions.assertTrue(services.contains("remote-app3"));
 
     }
 
-
     private class MockServiceNameMapping extends AbstractServiceNameMapping {
 
         public boolean enabled = false;
@@ -105,93 +117,41 @@ class AbstractServiceNameMappingTest {
         }
 
         @Override
-        public boolean map(URL url) {
-            return false;
-        }
-    }
-
-    private class MockWritableMetadataService implements WritableMetadataService {
-        private final Map<String, Set<String>> serviceToAppsMapping = new HashMap<>();
-
-        @Override
-        public String serviceName() {
-            return null;
-        }
-
-        @Override
-        public SortedSet<String> getExportedURLs(String serviceInterface, String group, String version, String protocol) {
-            return null;
-        }
-
-        @Override
-        public String getServiceDefinition(String serviceKey) {
-            return null;
-        }
-
-        @Override
-        public MetadataInfo getMetadataInfo(String revision) {
-            return null;
-        }
-
-        @Override
-        public Map<String, MetadataInfo> getMetadataInfos() {
-            return null;
-        }
-
-        @Override
-        public boolean exportURL(URL url) {
-            return false;
-        }
-
-        @Override
-        public boolean unexportURL(URL url) {
-            return false;
-        }
+        protected void removeListener(URL url, MappingListener mappingListener) {
 
-        @Override
-        public boolean subscribeURL(URL url) {
-            return false;
         }
 
         @Override
-        public boolean unsubscribeURL(URL url) {
+        public boolean map(URL url) {
             return false;
         }
+    }
 
-        @Override
-        public void publishServiceDefinition(URL url) {
-
-        }
+    private class MockServiceNameMapping2 extends AbstractServiceNameMapping {
 
-        @Override
-        public Set<String> getCachedMapping(String mappingKey) {
-            return serviceToAppsMapping.get(mappingKey);
-        }
+        public boolean enabled = false;
 
         @Override
-        public Set<String> getCachedMapping(URL consumerURL) {
-            String serviceKey = ServiceNameMapping.buildMappingKey(consumerURL);
-            return serviceToAppsMapping.get(serviceKey);
+        public Set<String> get(URL url) {
+            return Collections.emptySet();
         }
 
         @Override
-        public Set<String> removeCachedMapping(String serviceKey) {
-            return serviceToAppsMapping.remove(serviceKey);
+        public Set<String> getAndListen(URL url, MappingListener mappingListener) {
+            if (!enabled) {
+                return Collections.emptySet();
+            }
+            return new HashSet<>(Arrays.asList("remote-app3"));
         }
 
         @Override
-        public void putCachedMapping(String serviceKey, Set<String> apps) {
-            serviceToAppsMapping.put(serviceKey, new TreeSet<>(apps));
-        }
+        protected void removeListener(URL url, MappingListener mappingListener) {
 
-        @Override
-        public Map<String, Set<String>> getCachedMapping() {
-            return serviceToAppsMapping;
         }
 
         @Override
-        public MetadataInfo getDefaultMetadataInfo() {
-            return null;
+        public boolean map(URL url) {
+            return false;
         }
     }
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java
index ca25300..4a8cc31 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.metadata;
 
 import org.apache.dubbo.common.URL;
 
+import com.google.gson.Gson;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
@@ -63,7 +64,7 @@ public class MetadataInfoTest {
         MetadataInfo metadataInfo = new MetadataInfo("demo");
 
         // export normal url again
-        metadataInfo.addService(new MetadataInfo.ServiceInfo(url));
+        metadataInfo.addService(url);
         MetadataInfo.ServiceInfo serviceInfo2 = metadataInfo.getServiceInfo(url.getProtocolServiceKey());
         assertNotNull(serviceInfo2);
         assertEquals(5, serviceInfo2.getParams().size());
@@ -80,31 +81,31 @@ public class MetadataInfoTest {
     public void testEqualsAndRevision() {
         // same metadata
         MetadataInfo metadataInfo = new MetadataInfo("demo");
-        metadataInfo.addService(new MetadataInfo.ServiceInfo(url));
+        metadataInfo.addService(url);
         MetadataInfo sameMetadataInfo = new MetadataInfo("demo");
-        sameMetadataInfo.addService(new MetadataInfo.ServiceInfo(url));
+        sameMetadataInfo.addService(url);
         assertEquals(metadataInfo, sameMetadataInfo);
         assertEquals(metadataInfo.calAndGetRevision(), sameMetadataInfo.calAndGetRevision());
 
         // url with different params that are not counted in ServiceInfo
         MetadataInfo metadataInfoWithDifferentParam1 = new MetadataInfo("demo");
-        metadataInfoWithDifferentParam1.addService(new MetadataInfo.ServiceInfo(url.addParameter("delay", 6000)));
+        metadataInfoWithDifferentParam1.addService(url.addParameter("delay", 6000));
         assertEquals(metadataInfo, metadataInfoWithDifferentParam1);
         assertEquals(metadataInfo.calAndGetRevision(), metadataInfoWithDifferentParam1.calAndGetRevision());
         // url with different params that are counted in ServiceInfo
         MetadataInfo metadataInfoWithDifferentParam2 = new MetadataInfo("demo");
-        metadataInfoWithDifferentParam2.addService(new MetadataInfo.ServiceInfo(url.addParameter(TIMEOUT_KEY, 6000)));
+        metadataInfoWithDifferentParam2.addService(url.addParameter(TIMEOUT_KEY, 6000));
         assertNotEquals(metadataInfo, metadataInfoWithDifferentParam2);
         assertNotEquals(metadataInfo.calAndGetRevision(), metadataInfoWithDifferentParam2.calAndGetRevision());
 
         MetadataInfo metadataInfoWithDifferentGroup = new MetadataInfo("demo");
-        metadataInfoWithDifferentGroup.addService(new MetadataInfo.ServiceInfo(url.addParameter(GROUP_KEY, "newGroup")));
+        metadataInfoWithDifferentGroup.addService(url.addParameter(GROUP_KEY, "newGroup"));
         assertNotEquals(metadataInfo, metadataInfoWithDifferentGroup);
         assertNotEquals(metadataInfo.calAndGetRevision(), metadataInfoWithDifferentGroup.calAndGetRevision());
 
         MetadataInfo metadataInfoWithDifferentServices = new MetadataInfo("demo");
-        metadataInfoWithDifferentServices.addService(new MetadataInfo.ServiceInfo(url));
-        metadataInfoWithDifferentServices.addService(new MetadataInfo.ServiceInfo(url2));
+        metadataInfoWithDifferentServices.addService(url);
+        metadataInfoWithDifferentServices.addService(url2);
         assertNotEquals(metadataInfo, metadataInfoWithDifferentServices);
         assertNotEquals(metadataInfo.calAndGetRevision(), metadataInfoWithDifferentServices.calAndGetRevision());
     }
@@ -112,12 +113,29 @@ public class MetadataInfoTest {
     @Test
     public void testChanged() {
         MetadataInfo metadataInfo = new MetadataInfo("demo");
-        metadataInfo.addService(new MetadataInfo.ServiceInfo(url));
-        metadataInfo.addService(new MetadataInfo.ServiceInfo(url2));
-        assertFalse(metadataInfo.hasReported());
-        metadataInfo.markReported();
-        assertTrue(metadataInfo.hasReported());
-        metadataInfo.removeService(new MetadataInfo.ServiceInfo(url2));
-        assertFalse(metadataInfo.hasReported());
+        metadataInfo.addService(url);
+        metadataInfo.addService(url2);
+        assertTrue(metadataInfo.updated.get());
+        metadataInfo.calAndGetRevision();
+        assertFalse(metadataInfo.updated.get());
+        metadataInfo.removeService(url2);
+        assertTrue(metadataInfo.updated.get());
+    }
+
+    @Test
+    public void testJsonFormat() {
+        MetadataInfo metadataInfo = new MetadataInfo("demo");
+
+        // export normal url again
+        metadataInfo.addService(url);
+        Gson gson = new Gson();
+       System.out.println(gson.toJson(metadataInfo));
+
+        MetadataInfo metadataInfo2 = new MetadataInfo("demo");
+        // export normal url again
+        metadataInfo2.addService(url);
+        metadataInfo2.addService(url2);
+        System.out.println(gson.toJson(metadataInfo2));
+
     }
 }
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..ac329ee 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,13 +21,17 @@ 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.hamcrest.Matchers;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Map;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
@@ -41,9 +45,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");
@@ -61,16 +65,11 @@ class MetadataReportInstanceTest {
 
     @Test
     public void test() {
-        Assertions.assertThrows(IllegalStateException.class,
-            () -> metadataReportInstance.getMetadataReport(registryId),
-            "the metadata report was not initialized.");
-
-        Assertions.assertThrows(IllegalStateException.class,
-            () -> metadataReportInstance.getMetadataReports(true),
+        Assertions.assertNull(metadataReportInstance.getMetadataReport(registryId),
             "the metadata report was not initialized.");
+        assertThat(metadataReportInstance.getMetadataReports(true), Matchers.anEmptyMap());
 
-
-        metadataReportInstance.init(metadataReportConfig);
+        metadataReportInstance.init(Arrays.asList(metadataReportConfig));
         MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryId);
         Assertions.assertNotNull(metadataReport);
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java
index 90df3db..3a58933 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java
@@ -17,7 +17,6 @@
 package org.apache.dubbo.metadata.report.identifier;
 
 import org.apache.dubbo.metadata.MetadataConstants;
-import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactoryTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactoryTest.java
index 4a9acc9..eb68abf 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactoryTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactoryTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.metadata.report.support;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.NetUtils;
+import org.apache.dubbo.metadata.MappingListener;
 import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
 import org.apache.dubbo.metadata.report.MetadataReport;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
@@ -79,6 +80,11 @@ public class AbstractMetadataReportFactoryTest {
                 }
 
                 @Override
+                public void removeServiceAppMappingListener(String serviceKey, MappingListener listener) {
+
+                }
+
+                @Override
                 public String getServiceDefinition(MetadataIdentifier consumerMetadataIdentifier) {
                     return null;
                 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportTest.java
index 9d20e91..624a97f 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportTest.java
@@ -17,10 +17,10 @@
 
 package org.apache.dubbo.metadata.report.support;
 
-import com.google.gson.Gson;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.metadata.MappingListener;
 import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;
 import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
 import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum;
@@ -28,6 +28,8 @@ 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 org.apache.dubbo.rpc.model.ApplicationModel;
+
+import com.google.gson.Gson;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -314,6 +316,11 @@ public class AbstractMetadataReportTest {
         public String getServiceDefinition(MetadataIdentifier consumerMetadataIdentifier) {
             throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
         }
+
+        @Override
+        public void removeServiceAppMappingListener(String serviceKey, MappingListener listener) {
+            throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
+        }
     }
 
     private static class RetryMetadataReport extends AbstractMetadataReport {
@@ -376,6 +383,11 @@ public class AbstractMetadataReportTest {
             throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
         }
 
+        @Override
+        public void removeServiceAppMappingListener(String serviceKey, MappingListener listener) {
+            throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
+        }
+
     }
 
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/test/JTestMetadataReport4Test.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/test/JTestMetadataReport4Test.java
index c52aff9..8e94495 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/test/JTestMetadataReport4Test.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/test/JTestMetadataReport4Test.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.metadata.test;
 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.MappingListener;
 import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
 import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
@@ -98,4 +99,9 @@ public class JTestMetadataReport4Test extends AbstractMetadataReport {
     public String getServiceDefinition(MetadataIdentifier consumerMetadataIdentifier) {
         return store.get(consumerMetadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY));
     }
+
+    @Override
+    public void removeServiceAppMappingListener(String serviceKey, MappingListener listener) {
+
+    }
 }
diff --git a/dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java b/dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java
index 13adf95..e320f4b 100644
--- a/dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java
+++ b/dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java
@@ -16,11 +16,6 @@
  */
 package org.apache.dubbo.metadata.definition.protobuf;
 
-import com.google.protobuf.ByteString;
-import com.google.protobuf.Descriptors;
-import com.google.protobuf.GeneratedMessageV3;
-import com.google.protobuf.ProtocolStringList;
-import com.google.protobuf.UnknownFieldSet;
 import org.apache.dubbo.common.lang.Prioritized;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
@@ -28,6 +23,12 @@ import org.apache.dubbo.metadata.definition.TypeDefinitionBuilder;
 import org.apache.dubbo.metadata.definition.builder.TypeBuilder;
 import org.apache.dubbo.metadata.definition.model.TypeDefinition;
 
+import com.google.protobuf.ByteString;
+import com.google.protobuf.Descriptors;
+import com.google.protobuf.GeneratedMessageV3;
+import com.google.protobuf.ProtocolStringList;
+import com.google.protobuf.UnknownFieldSet;
+
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 import java.util.HashMap;
diff --git a/dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java b/dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java
index 0919410..426fe0c 100644
--- a/dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java
+++ b/dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java
@@ -17,10 +17,12 @@
 package org.apache.dubbo.metadata.definition.protobuf;
 
 import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;
+import org.apache.dubbo.metadata.definition.TypeDefinitionBuilder;
 import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
 import org.apache.dubbo.metadata.definition.model.MethodDefinition;
 import org.apache.dubbo.metadata.definition.model.TypeDefinition;
 import org.apache.dubbo.metadata.definition.protobuf.model.ServiceInterface;
+import org.apache.dubbo.rpc.model.FrameworkModel;
 
 import org.junit.jupiter.api.Test;
 
@@ -37,6 +39,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
 public class ProtobufTypeBuilderTest {
     @Test
     public void testProtobufBuilder() {
+        TypeDefinitionBuilder.initBuilders(FrameworkModel.defaultModel());
+
         // TEST Pb Service metaData builder
         FullServiceDefinition serviceDefinition = ServiceDefinitionBuilder.buildFullDefinition(ServiceInterface.class);
         MethodDefinition methodDefinition = serviceDefinition.getMethods().get(0);
diff --git a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/EnumTypeDefinitionBuilder.java b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/EnumTypeDefinitionBuilder.java
index b766e38..bc3b05c 100644
--- a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/EnumTypeDefinitionBuilder.java
+++ b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/EnumTypeDefinitionBuilder.java
@@ -23,7 +23,6 @@ import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.Name;
 import javax.lang.model.type.DeclaredType;
-
 import java.util.Map;
 
 import static org.apache.dubbo.metadata.annotation.processing.util.FieldUtils.getDeclaredFields;
diff --git a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/GeneralTypeDefinitionBuilder.java b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/GeneralTypeDefinitionBuilder.java
index 83c3f8f..1e907e7 100644
--- a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/GeneralTypeDefinitionBuilder.java
+++ b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/GeneralTypeDefinitionBuilder.java
@@ -21,7 +21,6 @@ import org.apache.dubbo.metadata.definition.model.TypeDefinition;
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.type.DeclaredType;
-
 import java.util.Map;
 
 import static org.apache.dubbo.metadata.annotation.processing.util.FieldUtils.getNonStaticFields;
diff --git a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/PrimitiveTypeDefinitionBuilder.java b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/PrimitiveTypeDefinitionBuilder.java
index 72a5184..6153917 100644
--- a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/PrimitiveTypeDefinitionBuilder.java
+++ b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/PrimitiveTypeDefinitionBuilder.java
@@ -21,7 +21,6 @@ import org.apache.dubbo.metadata.definition.model.TypeDefinition;
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.type.PrimitiveType;
 import javax.lang.model.type.TypeMirror;
-
 import java.util.Map;
 
 import static org.apache.dubbo.metadata.annotation.processing.util.TypeUtils.isPrimitiveType;
diff --git a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/ServiceDefinitionBuilder.java b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/ServiceDefinitionBuilder.java
index 39c7bf6..4fe27b5 100644
--- a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/ServiceDefinitionBuilder.java
+++ b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/ServiceDefinitionBuilder.java
@@ -21,7 +21,6 @@ import org.apache.dubbo.metadata.definition.model.TypeDefinition;
 
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.element.TypeElement;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
diff --git a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/SimpleTypeDefinitionBuilder.java b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/SimpleTypeDefinitionBuilder.java
index 627345a..172d8aa 100644
--- a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/SimpleTypeDefinitionBuilder.java
+++ b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/SimpleTypeDefinitionBuilder.java
@@ -21,7 +21,6 @@ import org.apache.dubbo.metadata.definition.model.TypeDefinition;
 
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.type.DeclaredType;
-
 import java.util.Map;
 
 import static org.apache.dubbo.metadata.annotation.processing.util.TypeUtils.isSimpleType;
diff --git a/dubbo-metadata/dubbo-metadata-processor/src/test/java/org/apache/dubbo/metadata/annotation/processing/builder/PrimitiveTypeDefinitionBuilderTest.java b/dubbo-metadata/dubbo-metadata-processor/src/test/java/org/apache/dubbo/metadata/annotation/processing/builder/PrimitiveTypeDefinitionBuilderTest.java
index 0e5655b..c259ffc 100644
--- a/dubbo-metadata/dubbo-metadata-processor/src/test/java/org/apache/dubbo/metadata/annotation/processing/builder/PrimitiveTypeDefinitionBuilderTest.java
+++ b/dubbo-metadata/dubbo-metadata-processor/src/test/java/org/apache/dubbo/metadata/annotation/processing/builder/PrimitiveTypeDefinitionBuilderTest.java
@@ -31,7 +31,6 @@ import java.util.Set;
 
 import static org.apache.dubbo.metadata.annotation.processing.util.FieldUtils.findField;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
diff --git a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosConfigServiceWrapper.java b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosConfigServiceWrapper.java
index 54bfa60..3fb52fb 100644
--- a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosConfigServiceWrapper.java
+++ b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosConfigServiceWrapper.java
@@ -45,6 +45,10 @@ public class NacosConfigServiceWrapper {
         configService.addListener(handleInnerSymbol(dataId), handleInnerSymbol(group), listener);
     }
 
+    public void removeListener(String dataId, String group, Listener listener) throws NacosException {
+        configService.removeListener(handleInnerSymbol(dataId), handleInnerSymbol(group), listener);
+    }
+
     public String getConfig(String dataId, String group) throws NacosException {
         return configService.getConfig(handleInnerSymbol(dataId), handleInnerSymbol(group), DEFAULT_TIMEOUT);
     }
diff --git a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
index 23e866a..1baa96c 100644
--- a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
@@ -17,11 +17,6 @@
 
 package org.apache.dubbo.metadata.store.nacos;
 
-import com.alibaba.nacos.api.NacosFactory;
-import com.alibaba.nacos.api.PropertyKeyConst;
-import com.alibaba.nacos.api.config.listener.AbstractSharedListener;
-import com.alibaba.nacos.api.exception.NacosException;
-import com.google.gson.Gson;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
 import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;
@@ -39,7 +34,12 @@ 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 org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
-import org.apache.dubbo.rpc.RpcException;
+
+import com.alibaba.nacos.api.NacosFactory;
+import com.alibaba.nacos.api.PropertyKeyConst;
+import com.alibaba.nacos.api.config.listener.AbstractSharedListener;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.google.gson.Gson;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -155,6 +155,15 @@ public class NacosMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
+    public void unPublishAppMetadata(SubscriberMetadataIdentifier identifier, MetadataInfo metadataInfo) {
+        try {
+            configService.removeConfig(identifier.getApplication(), identifier.getRevision());
+        } catch (NacosException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    @Override
     public MetadataInfo getAppMetadata(SubscriberMetadataIdentifier identifier, Map<String, String> instanceMetadata) {
         try {
             String content = configService.getConfig(identifier.getApplication(), identifier.getRevision(), 3000L);
@@ -243,6 +252,14 @@ public class NacosMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
+    public void removeServiceAppMappingListener(String serviceKey, MappingListener listener) {
+        MappingDataListener mappingDataListener = casListenerMap.get(buildListenerKey(serviceKey, group));
+        if (null != mappingDataListener) {
+            removeCasServiceMappingListener(serviceKey, group, listener);
+        }
+    }
+
+    @Override
     public Set<String> getServiceAppMapping(String serviceKey, URL url) {
         String content = getConfig(serviceKey, DEFAULT_MAPPING_GROUP);
         return ServiceNameMapping.getAppNames(content);
@@ -263,6 +280,17 @@ public class NacosMetadataReport extends AbstractMetadataReport {
         addListener(serviceKey, DEFAULT_MAPPING_GROUP, mappingDataListener);
     }
 
+    private void removeCasServiceMappingListener(String serviceKey, String group, MappingListener listener) {
+        MappingDataListener mappingDataListener = casListenerMap.get(buildListenerKey(serviceKey, group));
+        if (mappingDataListener != null) {
+            mappingDataListener.removeListeners(listener);
+            if (mappingDataListener.isEmpty()) {
+                removeListener(serviceKey, DEFAULT_MAPPING_GROUP, mappingDataListener);
+                casListenerMap.remove(buildListenerKey(serviceKey, group), mappingDataListener);
+            }
+        }
+    }
+
     public void addListener(String key, String group, ConfigurationListener listener) {
         String listenerKey = buildListenerKey(key, group);
         NacosConfigListener nacosConfigListener =
@@ -275,6 +303,22 @@ public class NacosMetadataReport extends AbstractMetadataReport {
         }
     }
 
+    public void removeListener(String key, String group, ConfigurationListener listener) {
+        String listenerKey = buildListenerKey(key, group);
+        NacosConfigListener nacosConfigListener = watchListenerMap.get(listenerKey);
+        try {
+            if (nacosConfigListener != null) {
+                nacosConfigListener.removeListener(listener);
+                if (nacosConfigListener.isEmpty()) {
+                    configService.removeListener(key, group, nacosConfigListener);
+                    watchListenerMap.remove(listenerKey);
+                }
+            }
+        } catch (NacosException e) {
+            logger.error(e.getMessage());
+        }
+    }
+
     private NacosConfigListener createTargetListener(String key, String group) {
         NacosConfigListener configListener = new NacosConfigListener();
         configListener.fillContext(key, group);
@@ -294,7 +338,7 @@ public class NacosMetadataReport extends AbstractMetadataReport {
             }
         } catch (Throwable t) {
             logger.error("Failed to put " + identifier + " to nacos " + value + ", cause: " + t.getMessage(), t);
-            throw new RpcException("Failed to put " + identifier + " to nacos " + value + ", cause: " + t.getMessage(), t);
+            throw new RuntimeException("Failed to put " + identifier + " to nacos " + value + ", cause: " + t.getMessage(), t);
         }
     }
 
@@ -306,7 +350,7 @@ public class NacosMetadataReport extends AbstractMetadataReport {
             }
         } catch (Throwable t) {
             logger.error("Failed to remove " + identifier + " from nacos , cause: " + t.getMessage(), t);
-            throw new RpcException("Failed to remove " + identifier + " from nacos , cause: " + t.getMessage(), t);
+            throw new RuntimeException("Failed to remove " + identifier + " from nacos , cause: " + t.getMessage(), t);
         }
     }
 
@@ -315,7 +359,7 @@ public class NacosMetadataReport extends AbstractMetadataReport {
             return configService.getConfig(identifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY), group, 3000L);
         } catch (Throwable t) {
             logger.error("Failed to get " + identifier + " from nacos , cause: " + t.getMessage(), t);
-            throw new RpcException("Failed to get " + identifier + " from nacos , cause: " + t.getMessage(), t);
+            throw new RuntimeException("Failed to get " + identifier + " from nacos , cause: " + t.getMessage(), t);
         }
     }
 
@@ -360,6 +404,10 @@ public class NacosMetadataReport extends AbstractMetadataReport {
             this.listeners.remove(configurationListener);
         }
 
+        boolean isEmpty() {
+            return this.listeners.isEmpty();
+        }
+
         private ConfigChangeType getChangeType(String configInfo, String oldValue) {
             if (StringUtils.isBlank(configInfo)) {
                 return ConfigChangeType.DELETED;
@@ -392,6 +440,14 @@ public class NacosMetadataReport extends AbstractMetadataReport {
             listeners.add(mappingListener);
         }
 
+        public void removeListeners(MappingListener mappingListener) {
+            listeners.remove(mappingListener);
+        }
+
+        public boolean isEmpty() {
+            return listeners.isEmpty();
+        }
+
         @Override
         public void process(ConfigChangedEvent event) {
             if (ConfigChangeType.DELETED == event.getChangeType()) {
diff --git a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
index 78a1909..cf28c75 100644
--- a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
@@ -16,7 +16,6 @@
  */
 package org.apache.dubbo.metadata.store.zookeeper;
 
-import com.google.gson.Gson;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.config.configcenter.ConfigItem;
 import org.apache.dubbo.common.logger.Logger;
@@ -35,6 +34,8 @@ import org.apache.dubbo.remoting.zookeeper.DataListener;
 import org.apache.dubbo.remoting.zookeeper.EventType;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperClient;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
+
+import com.google.gson.Gson;
 import org.apache.zookeeper.data.Stat;
 
 import java.util.ArrayList;
@@ -146,6 +147,14 @@ public class ZookeeperMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
+    public void unPublishAppMetadata(SubscriberMetadataIdentifier identifier, MetadataInfo metadataInfo) {
+        String path = getNodePath(identifier);
+        if (StringUtils.isNotEmpty(zkClient.getContent(path))) {
+            zkClient.delete(path);
+        }
+    }
+
+    @Override
     public MetadataInfo getAppMetadata(SubscriberMetadataIdentifier identifier, Map<String, String> instanceMetadata) {
         String content = zkClient.getContent(getNodePath(identifier));
         return gson.fromJson(content, MetadataInfo.class);
@@ -161,6 +170,14 @@ public class ZookeeperMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
+    public void removeServiceAppMappingListener(String serviceKey, MappingListener listener) {
+        String path = buildPathKey(DEFAULT_MAPPING_GROUP, serviceKey);
+        if (null != casListenerMap.get(path)) {
+            removeCasServiceMappingListener(path, listener);
+        }
+    }
+
+    @Override
     public Set<String> getServiceAppMapping(String serviceKey, URL url) {
         String path = buildPathKey(DEFAULT_MAPPING_GROUP, serviceKey);
         return getAppNames(zkClient.getContent(path));
@@ -204,6 +221,15 @@ public class ZookeeperMetadataReport extends AbstractMetadataReport {
         zkClient.addDataListener(path, mappingDataListener);
     }
 
+    private void removeCasServiceMappingListener(String path, MappingListener listener) {
+        MappingDataListener mappingDataListener = casListenerMap.get(path);
+        mappingDataListener.removeListener(listener);
+        if (mappingDataListener.isEmpty()) {
+            zkClient.removeDataListener(path, mappingDataListener);
+            casListenerMap.remove(path, mappingDataListener);
+        }
+    }
+
     private static class MappingDataListener implements DataListener {
 
         private String serviceKey;
@@ -220,6 +246,14 @@ public class ZookeeperMetadataReport extends AbstractMetadataReport {
             this.listeners.add(listener);
         }
 
+        public void removeListener(MappingListener listener) {
+            this.listeners.remove(listener);
+        }
+
+        public boolean isEmpty() {
+            return listeners.isEmpty();
+        }
+
         @Override
         public void dataChanged(String path, Object value, EventType eventType) {
             if (!this.path.equals(path)) {
diff --git a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
index c004cc5..04cd436 100644
--- a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
+++ b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
@@ -16,10 +16,11 @@
  */
 package org.apache.dubbo.metadata.store.zookeeper;
 
-import com.google.gson.Gson;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.config.configcenter.ConfigItem;
 import org.apache.dubbo.common.utils.NetUtils;
+import org.apache.dubbo.metadata.MappingChangedEvent;
+import org.apache.dubbo.metadata.MappingListener;
 import org.apache.dubbo.metadata.MetadataInfo;
 import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;
 import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
@@ -29,9 +30,11 @@ 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 org.apache.dubbo.rpc.model.ApplicationModel;
+
+import com.google.gson.Gson;
 import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
@@ -285,12 +288,20 @@ public class ZookeeperMetadataReportTest {
         String appNames = "demo1,demo2";
 
         CountDownLatch latch = new CountDownLatch(1);
-        Set<String> serviceAppMapping = zookeeperMetadataReport.getServiceAppMapping(serviceKey, event -> {
-            Set<String> apps = event.getApps();
-            Assertions.assertEquals(apps.size(), 2);
-            Assertions.assertTrue(apps.contains("demo1"));
-            Assertions.assertTrue(apps.contains("demo2"));
-            latch.countDown();
+        Set<String> serviceAppMapping = zookeeperMetadataReport.getServiceAppMapping(serviceKey, new MappingListener() {
+            @Override
+            public void onEvent(MappingChangedEvent event) {
+                Set<String> apps = event.getApps();
+                Assertions.assertEquals(apps.size(), 2);
+                Assertions.assertTrue(apps.contains("demo1"));
+                Assertions.assertTrue(apps.contains("demo2"));
+                latch.countDown();
+            }
+
+            @Override
+            public void stop() {
+
+            }
         }, url);
         Assertions.assertTrue(serviceAppMapping.isEmpty());
 
@@ -305,7 +316,7 @@ public class ZookeeperMetadataReportTest {
         String appName = "demo";
         URL url = URL.valueOf("test://127.0.0.1:8888/" + serviceKey);
         MetadataInfo metadataInfo = new MetadataInfo(appName);
-        metadataInfo.addService(new MetadataInfo.ServiceInfo(url));
+        metadataInfo.addService(url);
 
         SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(appName, metadataInfo.calAndGetRevision());
         MetadataInfo appMetadata = zookeeperMetadataReport.getAppMetadata(identifier, Collections.emptyMap());
diff --git a/dubbo-monitor/dubbo-monitor-api/src/main/java/org/apache/dubbo/monitor/Constants.java b/dubbo-monitor/dubbo-monitor-api/src/main/java/org/apache/dubbo/monitor/Constants.java
index 11ad601..38b371b 100644
--- a/dubbo-monitor/dubbo-monitor-api/src/main/java/org/apache/dubbo/monitor/Constants.java
+++ b/dubbo-monitor/dubbo-monitor-api/src/main/java/org/apache/dubbo/monitor/Constants.java
@@ -16,9 +16,6 @@
  */
 package org.apache.dubbo.monitor;
 
-import static org.apache.dubbo.rpc.Constants.INPUT_KEY;
-import static org.apache.dubbo.rpc.Constants.OUTPUT_KEY;
-
 public interface Constants {
     String DUBBO_PROVIDER = "dubbo.provider";
 
diff --git a/dubbo-native-plugin/src/main/java/org/apache/dubbo/maven/plugin/ClassFinder.java b/dubbo-native-plugin/src/main/java/org/apache/dubbo/maven/plugin/ClassFinder.java
index bf0f02c..c5c350e 100644
--- a/dubbo-native-plugin/src/main/java/org/apache/dubbo/maven/plugin/ClassFinder.java
+++ b/dubbo-native-plugin/src/main/java/org/apache/dubbo/maven/plugin/ClassFinder.java
@@ -16,7 +16,6 @@
  */
 package org.apache.dubbo.maven.plugin;
 
-
 import java.io.File;
 import java.net.JarURLConnection;
 import java.net.URL;
diff --git a/dubbo-native-plugin/src/main/java/org/apache/dubbo/maven/plugin/Test.java b/dubbo-native-plugin/src/main/java/org/apache/dubbo/maven/plugin/Test.java
index f5ab791..29fc800 100644
--- a/dubbo-native-plugin/src/main/java/org/apache/dubbo/maven/plugin/Test.java
+++ b/dubbo-native-plugin/src/main/java/org/apache/dubbo/maven/plugin/Test.java
@@ -19,10 +19,6 @@ package org.apache.dubbo.maven.plugin;
 
 import java.util.Set;
 
-/**
- * @Author goodjava@qq.com
- * @Date 2021/9/26 14:12
- */
 public class Test {
 
     public static void main(String[] args) {
diff --git a/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json b/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json
index a713aea..8497537 100644
--- a/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json
+++ b/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json
@@ -1593,9 +1593,6 @@
     ]
   },
   {
-    "name": "org.apache.dubbo.registry.client.DefaultServiceDiscoveryFactory"
-  },
-  {
     "name": "org.apache.dubbo.registry.client.DefaultServiceInstance$Endpoint",
     "allDeclaredFields": true,
     "methods": [
diff --git a/dubbo-native-plugin/src/main/resources/META-INF/native-image/resource-config.json b/dubbo-native-plugin/src/main/resources/META-INF/native-image/resource-config.json
index 07396cb..2d1ac93 100644
--- a/dubbo-native-plugin/src/main/resources/META-INF/native-image/resource-config.json
+++ b/dubbo-native-plugin/src/main/resources/META-INF/native-image/resource-config.json
@@ -47,9 +47,6 @@
         "pattern": "\\QMETA-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping\\E"
       },
       {
-        "pattern": "\\QMETA-INF/dubbo/internal/org.apache.dubbo.metadata.WritableMetadataService\\E"
-      },
-      {
         "pattern": "\\QMETA-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder\\E"
       },
       {
diff --git a/dubbo-native/src/main/java/org/apache/dubbo/registry/client/selector/ServiceInstanceSelector$Adaptive.java b/dubbo-native/src/main/java/org/apache/dubbo/registry/client/selector/ServiceInstanceSelector$Adaptive.java
deleted file mode 100644
index d3e1be0..0000000
--- a/dubbo-native/src/main/java/org/apache/dubbo/registry/client/selector/ServiceInstanceSelector$Adaptive.java
+++ /dev/null
@@ -1,30 +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.registry.client.selector;
-import org.apache.dubbo.rpc.model.ScopeModel;
-import org.apache.dubbo.rpc.model.ScopeModelUtil;
-public class ServiceInstanceSelector$Adaptive implements org.apache.dubbo.registry.client.selector.ServiceInstanceSelector {
-public org.apache.dubbo.registry.client.ServiceInstance select(org.apache.dubbo.common.URL arg0, java.util.List arg1)  {
-if (arg0 == null) throw new IllegalArgumentException("url == null");
-org.apache.dubbo.common.URL url = arg0;
-String extName = url.getParameter("service-instance-selector", "random");
-if(extName == null) throw new IllegalStateException("Failed to get extension (org.apache.dubbo.registry.client.selector.ServiceInstanceSelector) name from url (" + url.toString() + ") use keys([service-instance-selector])");
-ScopeModel scopeModel = ScopeModelUtil.getOrDefault(url.getScopeModel(), org.apache.dubbo.registry.client.selector.ServiceInstanceSelector.class);
-org.apache.dubbo.registry.client.selector.ServiceInstanceSelector extension = (org.apache.dubbo.registry.client.selector.ServiceInstanceSelector)scopeModel.getExtensionLoader(org.apache.dubbo.registry.client.selector.ServiceInstanceSelector.class).getExtension(extName);
-return extension.select(arg0, arg1);
-}
-}
diff --git a/dubbo-native/src/main/java/org/apache/dubbo/utils/CodeGenerator.java b/dubbo-native/src/main/java/org/apache/dubbo/utils/CodeGenerator.java
index f4ca7d1..8cc77a6 100644
--- a/dubbo-native/src/main/java/org/apache/dubbo/utils/CodeGenerator.java
+++ b/dubbo-native/src/main/java/org/apache/dubbo/utils/CodeGenerator.java
@@ -16,12 +16,13 @@
  */
 package org.apache.dubbo.utils;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.dubbo.common.extension.Adaptive;
 import org.apache.dubbo.common.extension.AdaptiveClassCodeGenerator;
 import org.apache.dubbo.common.extension.SPI;
 import org.apache.dubbo.common.utils.StringUtils;
 
+import org.apache.commons.io.FileUtils;
+
 import java.io.File;
 import java.io.IOException;
 import java.lang.annotation.Annotation;
diff --git a/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/AccessKeyAuthenticatorTest.java b/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/AccessKeyAuthenticatorTest.java
index c6e11c9..c12c313 100644
--- a/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/AccessKeyAuthenticatorTest.java
+++ b/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/AccessKeyAuthenticatorTest.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.RpcInvocation;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.Test;
 
 import java.util.ArrayList;
diff --git a/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/filter/ConsumerSignFilterTest.java b/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/filter/ConsumerSignFilterTest.java
index 3093840..8a52081 100644
--- a/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/filter/ConsumerSignFilterTest.java
+++ b/dubbo-plugin/dubbo-auth/src/test/java/org/apache/dubbo/auth/filter/ConsumerSignFilterTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.junit.jupiter.api.Test;
 
 import static org.mockito.ArgumentMatchers.anyString;
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/ChangeTelnet.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/ChangeTelnet.java
index 708a18b..d0a9f2d 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/ChangeTelnet.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/ChangeTelnet.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.qos.command.impl;
 
-import io.netty.channel.Channel;
-import io.netty.util.AttributeKey;
 import org.apache.dubbo.common.utils.ArrayUtils;
 import org.apache.dubbo.qos.command.BaseCommand;
 import org.apache.dubbo.qos.command.CommandContext;
@@ -26,6 +24,9 @@ import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol;
 
+import io.netty.channel.Channel;
+import io.netty.util.AttributeKey;
+
 @Cmd(name = "cd", summary = "Change default service.", example = {
     "cd [service]"
 })
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/CountTelnet.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/CountTelnet.java
index 8fad057..03599f7 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/CountTelnet.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/CountTelnet.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.qos.command.impl;
 
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.qos.command.BaseCommand;
@@ -32,6 +30,9 @@ import org.apache.dubbo.rpc.RpcStatus;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol;
 
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+
 import java.lang.reflect.Method;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/InvokeTelnet.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/InvokeTelnet.java
index a2afa63..9734cf5 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/InvokeTelnet.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/InvokeTelnet.java
@@ -16,9 +16,6 @@
  */
 package org.apache.dubbo.qos.command.impl;
 
-import com.alibaba.fastjson.JSON;
-import io.netty.channel.Channel;
-import io.netty.util.AttributeKey;
 import org.apache.dubbo.common.utils.ArrayUtils;
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.ReflectUtils;
@@ -31,6 +28,10 @@ import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.MethodDescriptor;
 import org.apache.dubbo.rpc.model.ProviderModel;
 
+import com.alibaba.fastjson.JSON;
+import io.netty.channel.Channel;
+import io.netty.util.AttributeKey;
+
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/PublishMetadata.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/PublishMetadata.java
index 97767b1..8cf435a 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/PublishMetadata.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/PublishMetadata.java
@@ -20,11 +20,9 @@ import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.threadpool.manager.ExecutorRepository;
 import org.apache.dubbo.common.utils.ArrayUtils;
-import org.apache.dubbo.config.deploy.DefaultApplicationDeployer;
 import org.apache.dubbo.qos.command.BaseCommand;
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.qos.command.annotation.Cmd;
-import org.apache.dubbo.registry.client.ServiceInstance;
 import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
@@ -52,24 +50,20 @@ public class  PublishMetadata implements BaseCommand {
         List<ApplicationModel> applicationModels = frameworkModel.getApplicationModels();
 
         for (ApplicationModel applicationModel : applicationModels) {
-            DefaultApplicationDeployer deployer = applicationModel.getBeanFactory().getBean(DefaultApplicationDeployer.class);
-            ServiceInstance serviceInstance = deployer.getServiceInstance();
-            if (serviceInstance != null) {
-                if (ArrayUtils.isEmpty(args)) {
-                    ServiceInstanceMetadataUtils.refreshMetadataAndInstance(serviceInstance);
-                    stringBuilder.append("publish metadata succeeded. App:").append(serviceInstance.getServiceName()).append("\n");
-                } else {
-                    try {
-                        int delay = Integer.parseInt(args[0]);
-                        ExecutorRepository executorRepository = applicationModel.getExtensionLoader(ExecutorRepository.class).getDefaultExtension();
-                        executorRepository.nextScheduledExecutor()
-                            .schedule(() -> ServiceInstanceMetadataUtils.refreshMetadataAndInstance(serviceInstance), delay, TimeUnit.SECONDS);
-                    } catch (NumberFormatException e) {
-                        logger.error("Wrong delay param", e);
-                        return "publishMetadata failed! Wrong delay param!";
-                    }
-                    stringBuilder.append("publish task submitted, will publish in ").append(args[0]).append(" seconds. App:").append(serviceInstance.getServiceName()).append("\n");
+            if (ArrayUtils.isEmpty(args)) {
+                ServiceInstanceMetadataUtils.refreshMetadataAndInstance(applicationModel);
+                stringBuilder.append("publish metadata succeeded. App:").append(applicationModel.getApplicationName()).append("\n");
+            } else {
+                try {
+                    int delay = Integer.parseInt(args[0]);
+                    ExecutorRepository executorRepository = applicationModel.getExtensionLoader(ExecutorRepository.class).getDefaultExtension();
+                    executorRepository.nextScheduledExecutor()
+                        .schedule(() -> ServiceInstanceMetadataUtils.refreshMetadataAndInstance(applicationModel), delay, TimeUnit.SECONDS);
+                } catch (NumberFormatException e) {
+                    logger.error("Wrong delay param", e);
+                    return "publishMetadata failed! Wrong delay param!";
                 }
+                stringBuilder.append("publish task submitted, will publish in ").append(args[0]).append(" seconds. App:").append(applicationModel.getApplicationName()).append("\n");
             }
         }
         return stringBuilder.toString();
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/SelectTelnet.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/SelectTelnet.java
index 7fd01a1..f49544e 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/SelectTelnet.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/SelectTelnet.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.qos.command.impl;
 
-import io.netty.channel.Channel;
-import io.netty.util.AttributeKey;
 import org.apache.dubbo.common.utils.ArrayUtils;
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.StringUtils;
@@ -26,6 +24,9 @@ import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.qos.command.annotation.Cmd;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 
+import io.netty.channel.Channel;
+import io.netty.util.AttributeKey;
+
 import java.lang.reflect.Method;
 import java.util.List;
 
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/Server.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/Server.java
index 5b51023..2689ecd 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/Server.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/Server.java
@@ -16,6 +16,12 @@
  */
 package org.apache.dubbo.qos.server;
 
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.qos.server.handler.QosProcessHandler;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelInitializer;
@@ -24,11 +30,6 @@ import io.netty.channel.EventLoopGroup;
 import io.netty.channel.nio.NioEventLoopGroup;
 import io.netty.channel.socket.nio.NioServerSocketChannel;
 import io.netty.util.concurrent.DefaultThreadFactory;
-import org.apache.dubbo.common.logger.Logger;
-import org.apache.dubbo.common.logger.LoggerFactory;
-import org.apache.dubbo.common.utils.StringUtils;
-import org.apache.dubbo.qos.server.handler.QosProcessHandler;
-import org.apache.dubbo.rpc.model.FrameworkModel;
 
 import java.util.concurrent.atomic.AtomicBoolean;
 
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/HttpProcessHandler.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/HttpProcessHandler.java
index efb125f..167f5ad 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/HttpProcessHandler.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/HttpProcessHandler.java
@@ -16,6 +16,15 @@
  */
 package org.apache.dubbo.qos.server.handler;
 
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.qos.command.CommandContext;
+import org.apache.dubbo.qos.command.CommandExecutor;
+import org.apache.dubbo.qos.command.DefaultCommandExecutor;
+import org.apache.dubbo.qos.command.NoSuchCommandException;
+import org.apache.dubbo.qos.command.decoder.HttpCommandDecoder;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelFutureListener;
 import io.netty.channel.ChannelHandlerContext;
@@ -27,14 +36,6 @@ import io.netty.handler.codec.http.HttpHeaders;
 import io.netty.handler.codec.http.HttpRequest;
 import io.netty.handler.codec.http.HttpResponseStatus;
 import io.netty.handler.codec.http.HttpVersion;
-import org.apache.dubbo.common.logger.Logger;
-import org.apache.dubbo.common.logger.LoggerFactory;
-import org.apache.dubbo.qos.command.CommandContext;
-import org.apache.dubbo.qos.command.CommandExecutor;
-import org.apache.dubbo.qos.command.DefaultCommandExecutor;
-import org.apache.dubbo.qos.command.NoSuchCommandException;
-import org.apache.dubbo.qos.command.decoder.HttpCommandDecoder;
-import org.apache.dubbo.rpc.model.FrameworkModel;
 
 /**
  * Parse HttpRequest for uri and parameters
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/QosProcessHandler.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/QosProcessHandler.java
index 2bf5a16..f1dc1ee 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/QosProcessHandler.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/QosProcessHandler.java
@@ -16,6 +16,9 @@
  */
 package org.apache.dubbo.qos.server.handler;
 
+import org.apache.dubbo.common.utils.ExecutorUtil;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
@@ -30,8 +33,6 @@ import io.netty.handler.timeout.IdleStateEvent;
 import io.netty.handler.timeout.IdleStateHandler;
 import io.netty.util.CharsetUtil;
 import io.netty.util.concurrent.ScheduledFuture;
-import org.apache.dubbo.common.utils.ExecutorUtil;
-import org.apache.dubbo.rpc.model.FrameworkModel;
 
 import java.util.List;
 import java.util.concurrent.TimeUnit;
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/TelnetProcessHandler.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/TelnetProcessHandler.java
index f7560e5..4631401 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/TelnetProcessHandler.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/TelnetProcessHandler.java
@@ -16,9 +16,6 @@
  */
 package org.apache.dubbo.qos.server.handler;
 
-import io.netty.channel.ChannelFutureListener;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.StringUtils;
@@ -30,6 +27,10 @@ import org.apache.dubbo.qos.command.decoder.TelnetCommandDecoder;
 import org.apache.dubbo.qos.common.QosConstants;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 
+import io.netty.channel.ChannelFutureListener;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+
 /**
  * Telnet process handler
  */
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/CommandContextFactoryTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/CommandContextFactoryTest.java
index e65c3cd..d5d983c 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/CommandContextFactoryTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/CommandContextFactoryTest.java
@@ -20,8 +20,8 @@ package org.apache.dubbo.qos.command;
 import org.hamcrest.Matchers;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class CommandContextFactoryTest {
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/CommandContextTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/CommandContextTest.java
index 5dec30d..d6a6d3a 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/CommandContextTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/CommandContextTest.java
@@ -21,11 +21,11 @@ import io.netty.channel.Channel;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
-import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.arrayContaining;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class CommandContextTest {
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/DefaultCommandExecutorTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/DefaultCommandExecutorTest.java
index af137f7..8db17bf 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/DefaultCommandExecutorTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/DefaultCommandExecutorTest.java
@@ -18,6 +18,7 @@
 package org.apache.dubbo.qos.command;
 
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/decoder/HttpCommandDecoderTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/decoder/HttpCommandDecoderTest.java
index b030927..2911e23 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/decoder/HttpCommandDecoderTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/decoder/HttpCommandDecoderTest.java
@@ -16,21 +16,22 @@
  */
 package org.apache.dubbo.qos.command.decoder;
 
+import org.apache.dubbo.qos.command.CommandContext;
+
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.handler.codec.http.FullHttpRequest;
 import io.netty.handler.codec.http.HttpHeaders;
 import io.netty.handler.codec.http.HttpMethod;
 import io.netty.handler.codec.http.HttpRequest;
-import org.apache.dubbo.qos.command.CommandContext;
 import org.junit.jupiter.api.Test;
 
 import java.nio.charset.StandardCharsets;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.arrayContaining;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/decoder/TelnetCommandDecoderTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/decoder/TelnetCommandDecoderTest.java
index 50a1add..a33b9b1 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/decoder/TelnetCommandDecoderTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/decoder/TelnetCommandDecoderTest.java
@@ -17,12 +17,13 @@
 package org.apache.dubbo.qos.command.decoder;
 
 import org.apache.dubbo.qos.command.CommandContext;
+
 import org.junit.jupiter.api.Test;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.arrayContaining;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
 
 public class TelnetCommandDecoderTest {
     @Test
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ChangeTelnetTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ChangeTelnetTest.java
index 5ecc778..cb3a3a0 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ChangeTelnetTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ChangeTelnetTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.qos.command.impl;
 
-import io.netty.channel.Channel;
-import io.netty.util.DefaultAttributeMap;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.qos.command.BaseCommand;
@@ -27,6 +25,9 @@ import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol;
+
+import io.netty.channel.Channel;
+import io.netty.util.DefaultAttributeMap;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/CountTelnetTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/CountTelnetTest.java
index c28c9f5..5263e69 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/CountTelnetTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/CountTelnetTest.java
@@ -28,6 +28,7 @@ import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.RpcStatus;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/HelpTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/HelpTest.java
index 17031fc..642637d 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/HelpTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/HelpTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.qos.command.impl;
 
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/InvokeTelnetTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/InvokeTelnetTest.java
index 612f565..2cac564 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/InvokeTelnetTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/InvokeTelnetTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.qos.command.impl;
 
-import io.netty.channel.Channel;
-import io.netty.util.DefaultAttributeMap;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.qos.command.BaseCommand;
 import org.apache.dubbo.qos.command.CommandContext;
@@ -28,6 +26,9 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleServiceRepository;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
+
+import io.netty.channel.Channel;
+import io.netty.util.DefaultAttributeMap;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LiveTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LiveTest.java
index cdacfc5..d924bb2 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LiveTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LiveTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.qos.command.impl;
 
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java
index f95a228..601f8ad 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java
@@ -27,6 +27,7 @@ import org.apache.dubbo.rpc.model.ModuleServiceRepository;
 import org.apache.dubbo.rpc.model.ProviderModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
 import org.apache.dubbo.rpc.model.ServiceMetadata;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java
index 05a4449..d4a2a27 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java
@@ -26,6 +26,7 @@ import org.apache.dubbo.rpc.model.ModuleServiceRepository;
 import org.apache.dubbo.rpc.model.ProviderModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
 import org.apache.dubbo.rpc.model.ServiceMetadata;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java
index d0906e9..b663125 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java
@@ -26,10 +26,11 @@ import org.apache.dubbo.rpc.model.ModuleServiceRepository;
 import org.apache.dubbo.rpc.model.ProviderModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
 import org.apache.dubbo.rpc.model.ServiceMetadata;
+
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.Assertions;
 
 import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY;
 import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_TYPE;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PortTelnetTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PortTelnetTest.java
index b3b4ecf..cc01320 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PortTelnetTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PortTelnetTest.java
@@ -28,6 +28,7 @@ import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PublishMetadataTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PublishMetadataTest.java
index d6d2e68..4aaee6f 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PublishMetadataTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PublishMetadataTest.java
@@ -16,20 +16,17 @@
  */
 package org.apache.dubbo.qos.command.impl;
 
-import org.apache.dubbo.config.deploy.DefaultApplicationDeployer;
+import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.qos.command.CommandContext;
-import org.apache.dubbo.registry.client.DefaultServiceInstance;
-import org.apache.dubbo.registry.client.ServiceInstance;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
-import java.lang.reflect.Field;
-
 public class PublishMetadataTest {
     private FrameworkModel frameworkModel;
 
@@ -38,11 +35,7 @@ public class PublishMetadataTest {
         frameworkModel = new FrameworkModel();
         for (int i = 0; i < 3; i++) {
             ApplicationModel applicationModel = frameworkModel.newApplication();
-            DefaultApplicationDeployer deployer = applicationModel.getBeanFactory().getBean(DefaultApplicationDeployer.class);
-            ServiceInstance serviceInstance = new DefaultServiceInstance("APP_" + i, applicationModel);
-            Field serviceInstanceField = deployer.getClass().getDeclaredField("serviceInstance");
-            serviceInstanceField.setAccessible(true);
-            serviceInstanceField.set(deployer, serviceInstance);
+            applicationModel.getApplicationConfigManager().setApplication(new ApplicationConfig("APP_" + i));
         }
 
     }
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PwdTelnetTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PwdTelnetTest.java
index e66fb54..3cedda9 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PwdTelnetTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PwdTelnetTest.java
@@ -16,12 +16,13 @@
  */
 package org.apache.dubbo.qos.command.impl;
 
-import io.netty.channel.Channel;
-import io.netty.util.DefaultAttributeMap;
 import org.apache.dubbo.qos.command.BaseCommand;
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.remoting.RemotingException;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
+import io.netty.channel.Channel;
+import io.netty.util.DefaultAttributeMap;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/QuitTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/QuitTest.java
index 012c96b..fb9a151 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/QuitTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/QuitTest.java
@@ -18,11 +18,12 @@ package org.apache.dubbo.qos.command.impl;
 
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.qos.common.QosConstants;
+
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
-import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
 
 public class QuitTest {
     @Test
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ReadyTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ReadyTest.java
index a2a88cd..08b7a88 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ReadyTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ReadyTest.java
@@ -27,6 +27,7 @@ import org.apache.dubbo.qos.probe.impl.ProviderReadinessProbe;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SelectTelnetTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SelectTelnetTest.java
index 9f2192b..c52a1e5 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SelectTelnetTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SelectTelnetTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.qos.command.impl;
 
-import io.netty.channel.Channel;
-import io.netty.util.DefaultAttributeMap;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.qos.command.BaseCommand;
 import org.apache.dubbo.qos.command.CommandContext;
@@ -28,6 +26,9 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleServiceRepository;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
+
+import io.netty.channel.Channel;
+import io.netty.util.DefaultAttributeMap;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ShutdownTelnetTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ShutdownTelnetTest.java
index 4fa797c..a724b75 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ShutdownTelnetTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/ShutdownTelnetTest.java
@@ -16,11 +16,12 @@
  */
 package org.apache.dubbo.qos.command.impl;
 
... 15906 lines suppressed ...