You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/08/31 17:09:10 UTC

[dubbo] branch 3.0-multi-instances updated (bdf30e6 -> 185a1d1)

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

albumenj pushed a change to branch 3.0-multi-instances
in repository https://gitbox.apache.org/repos/asf/dubbo.git.


    from bdf30e6  add failback logic for ut
     add d94e699  Fix nacos group inviable in consumer side (#8533)
     add b5f657e  fix NPE on serialization checking when request timed out (#8547)
     add 8739374  Compact with dubbo-all without farbic-io (#8546)
     add 5630a3c  修复monitor未配置时返回dubbo协议的问题 (#8549)
     add 74fcf4d  Fix ShortestResponseLoadBalanceTest failure (#8519)
     add 7f91631  [3.0-Triple] Support triple server stream (#8542)
     add 592c818  improve annotation parameters test (#8535)
     add 038ee3b  perf: Optimize the zookeeper timeout in all testcase (#8564)
     add d7f2452  Fix bug of BroadcastClusterInvoker and add test cases (#8532)
     add 2d26e11  [3.0] Verify additional configuration during service reference (#8543)
     add f7933b7  Fix MetadataService connections leak (#8555)
     add 72e1f6e  fix Issue 8516 on branch 3.0: fix mock:true configuration. (#8558)
     add 0382a6b  Add test cases to the Configurator after version 2.7 (#8560)
     add 89940b0  Ignore Exception when creating Reference (for generic call) (#8534)
     add 1a466da  test: Add testcases for checking exported metadata service in single registry center (#8540)
     add acb96d4  【3.0】Enhance and fix check config (#8483)
     add 3c08fd2  Revert "test: Add testcases for checking exported metadata service in single registry center (#8540)" (#8577)
     add 7135164  fix: disable testcase of ConfigTest#testReferGenericExport (#8580)
     add bc43d68  fix duplicate config init (#8578)
     add 5be7566  Update AbstractClient.java (#8591)
     add cca6871  issue no #8589, should be use Camel-Case rule (#8590)
     add 876eae7  test: Verify the mapping between exported provider and metadata (#8510)
     add 6689f4e  Add testcase for checking exported metadata service in single registry center (#8583)
     add 67bd4d1  [3.0-tri-compiler] dubbo compiler support stream (#8566)
     add 7537786  Verify local reference for the creation of a local invoker process (#8592)
     add c089e33  chore: upgrade nacos to 2.0.3 (#8588)
     add 31e1aa6  Add volatile modifier to some variables in ListenableRouter (#8579)
     add d386cd5  Adjust the acquisition of the app, group, and version value of the url (#8582)
     add 14bd476  Add unit test for MockInvokersSelector (#8593)
     add 80b6a55  「CodeReview」fix some bad smell of Service export & refer (#8594)
     add 24e4bd3  test: Add testcase to check exported service in multiple registry center (#8598)
     add bce9641  [3.0] ignore non-dubbo nacos services (#8573)
     add 4331c22  Check if enable Remote Report Metadata before report app metadata info (#8597)
     add 37ee4fe  Fix ut after disable default metadata report (#8618)
     add 17ba017   move PR#7884 to 3.0 branch (#8616)
     add ce73b2d  Add Header Filter for Triple Protocol (#8585)
     add 6c76c73  [3.0-Triple]Support triple void response (#8608)
     add 3ac0c37  [3.0-Triple] Fix error in filters can not be returned to client (#8615)
     add dbfad05  [3.0-Triple] Remove operation handler (#8637)
     add 0f52c56  add test case for service discovery process (#8607)
     add a957fc0  Adjust the scope of the spi extension (#8600)
     add 3f59150  [3.0] add bootstrap test (#8639)
     new 7c05961  Merge remote-tracking branch 'apache/3.0' into 3.0-multi-instances
     new b74de7b  Merge branch '3.0-multi-instances' into 3.0-multi-instances-merge
     new 99e238a  Fix ut
     new 185a1d1  Add Scope Model check

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 compiler/pom.xml                                   |   2 +-
 .../main/resources/Dubbo3InterfaceStub.mustache    |  44 +-
 compiler/src/main/resources/Dubbo3Stub.mustache    |   5 +-
 compiler/src/main/resources/DubboGrpcStub.mustache |   3 -
 compiler/src/main/resources/DubboStub.mustache     |   3 -
 .../main/resources/ReactorDubboGrpcStub.mustache   |   3 -
 .../src/main/resources/RxDubboGrpcStub.mustache    |   3 -
 .../cluster/router/condition/ConditionRouter.java  |   3 -
 .../cluster/router/condition/config/AppRouter.java |   3 +-
 .../router/condition/config/ListenableRouter.java  |   4 +-
 .../cluster/router/mesh/route/MeshEnvListener.java |   3 -
 .../router/mesh/route/MeshEnvListenerFactory.java  |  10 +-
 .../cluster/router/mesh/route/MeshRuleManager.java |   5 +-
 .../cluster/support/BroadcastClusterInvoker.java   |   6 +-
 .../absent/AbsentConfiguratorTest.java             |  52 +++
 .../override/OverrideConfiguratorTest.java         |  49 +++
 .../filter/DefaultFilterChainBuilderTest.java      |  66 +++
 .../dubbo/rpc/cluster/filter/DemoServiceImpl.java  |  14 +-
 .../apache/dubbo/rpc/cluster/filter/LogFilter.java |  36 +-
 .../ShortestResponseLoadBalanceTest.java           |   7 +-
 .../router/mock/MockInvokersSelectorTest.java      |  71 ++++
 .../support/BroadCastClusterInvokerTest.java       | 164 ++++++++
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |   1 +
 .../dubbo/common/constants/CommonConstants.java    |  29 +-
 .../dubbo/common/extension/ExtensionLoader.java    |   1 +
 .../extension/support/WrapperComparator.java       |  31 +-
 .../url/component/DubboServiceAddressURL.java      |   6 -
 .../org/apache/dubbo/common/utils/ConfigUtils.java |   3 +-
 .../org/apache/dubbo/common/utils/NetUtils.java    |  55 ++-
 .../org/apache/dubbo/config/AbstractConfig.java    |   2 +-
 .../dubbo/config/AbstractInterfaceConfig.java      |  29 ++
 .../org/apache/dubbo/config/ApplicationConfig.java |  32 +-
 .../apache/dubbo/config/ConfigCenterConfig.java    |  74 ++--
 .../apache/dubbo/config/MetadataReportConfig.java  |  37 +-
 .../java/org/apache/dubbo/config/ModuleConfig.java |   2 +
 .../apache/dubbo/config/ReferenceConfigBase.java   |   9 +
 .../org/apache/dubbo/config/ServiceConfigBase.java |   9 +
 .../apache/dubbo/rpc/model/ApplicationModel.java   |   4 +
 .../apache/dubbo/rpc/model/MethodDescriptor.java   |  41 +-
 .../apache/dubbo/common/utils/NetUtilsTest.java    |  91 ++++-
 .../dubbo/config/AbstractInterfaceConfigTest.java  |  70 +---
 .../java/org/apache/dubbo/config/Greeting.java     |  12 +-
 .../org/apache/dubbo/config/GreetingLocal1.java    |   9 +-
 .../org/apache/dubbo/config/GreetingLocal2.java    |  14 +-
 .../org/apache/dubbo/config/GreetingLocal3.java    |  17 +-
 .../apache/dubbo/descriptor/DescriptorService.java |   5 +
 .../dubbo/descriptor/MethodDescriptorTest.java     |  14 +
 dubbo-config/dubbo-config-api/pom.xml              |  12 +
 .../org/apache/dubbo/config/ReferenceConfig.java   |  11 +-
 .../org/apache/dubbo/config/ServiceConfig.java     |  13 +-
 .../dubbo/config/bootstrap/DubboBootstrap.java     | 114 ++++--
 .../bootstrap/builders/MetadataReportBuilder.java  |  36 +-
 .../dubbo/config/utils/ConfigValidationUtils.java  |   2 +-
 .../apache/dubbo/config/ReferenceConfigTest.java   | 453 +++++++++++++++++++--
 .../org/apache/dubbo/config/ServiceConfigTest.java |   6 +-
 .../bootstrap/DubboBootstrapMultiInstanceTest.java |  20 +-
 .../dubbo/config/bootstrap/DubboBootstrapTest.java | 165 +++++++-
 .../org/apache/dubbo/config/url/UrlTestBase.java   |  61 +--
 .../config/utils/ConfigValidationUtilsTest.java    |  63 +++
 .../org/apache/dubbo/integration/Constants.java    |  10 +-
 ...gistryCenterExportProviderExporterListener.java |  23 +-
 ...MultipleRegistryCenterExportProviderFilter.java |  86 ++++
 ...gistryCenterExportProviderIntegrationTest.java} | 119 ++++--
 ...terExportProviderRegistryProtocolListener.java} |   8 +-
 ...ltipleRegistryCenterExportProviderService.java} |  12 +-
 ...leRegistryCenterExportProviderServiceImpl.java} |  16 +-
 ...egistryCenterExportProviderServiceListener.java |  24 +-
 ...MultipleRegistryCenterInjvmIntegrationTest.java |  15 +-
 ...terServiceDiscoveryRegistryIntegrationTest.java |  55 +--
 ...ceDiscoveryRegistryRegistryServiceListener.java |  28 +-
 ...RegistryCenterDubboProtocolIntegrationTest.java |  26 +-
 ...gistryCenterExportMetadataExporterListener.java |  24 +-
 ...gistryCenterExportMetadataIntegrationTest.java} | 131 +++---
 ...SingleRegistryCenterExportMetadataService.java} |  12 +-
 ...leRegistryCenterExportMetadataServiceImpl.java} |  17 +-
 ...egistryCenterExportMetadataServiceListener.java |  25 +-
 ...egistryCenterExportProviderIntegrationTest.java |  73 +++-
 ...nterExportProviderRegistryProtocolListener.java |   4 +-
 .../SingleRegistryCenterInjvmIntegrationTest.java  |  16 +-
 .../registrycenter/AbstractRegistryCenter.java     | 107 +++++
 .../DefaultMultipleRegistryCenter.java             | 121 ------
 .../DefaultSingleRegistryCenter.java               | 101 -----
 .../dubbo/registrycenter/RegistryCenter.java       |  33 ++
 ...r.java => ZookeeperMultipleRegistryCenter.java} |  26 +-
 .../registrycenter/ZookeeperRegistryCenter.java    | 142 +++++++
 ...ter.java => ZookeeperSingleRegistryCenter.java} |  27 +-
 .../org.apache.dubbo.common.status.StatusChecker   |  19 +-
 .../org.apache.dubbo.common.threadpool.ThreadPool  |  19 +-
 .../org.apache.dubbo.config.ServiceListener        |   2 +
 ...g.apache.dubbo.registry.RegistryServiceListener |  17 -
 ...o.registry.integration.RegistryProtocolListener |  18 +-
 .../services/org.apache.dubbo.remoting.Dispatcher  |  19 +-
 .../services/org.apache.dubbo.remoting.Transporter |  19 +-
 .../org.apache.dubbo.remoting.exchange.Exchanger   |  19 +-
 .../org.apache.dubbo.remoting.telnet.TelnetHandler |  16 -
 .../services/org.apache.dubbo.rpc.ExporterListener |  19 +-
 .../META-INF/services/org.apache.dubbo.rpc.Filter  |   1 +
 .../config/spring/util/DubboAnnotationUtils.java   |   3 +-
 .../src/main/resources/META-INF/dubbo.xsd          |   8 +-
 .../org/apache/dubbo/config/spring/ConfigTest.java |   9 +-
 .../dubbo/config/spring/JavaConfigBeanTest.java    |   8 +-
 .../annotation/MethodConfigCallbackTest.java       |   8 +-
 .../factory/annotation/ParameterConvertTest.java   |   5 +
 .../XmlReferenceBeanConditionalTest.java           |   8 +-
 ...nfigAnnotationReferenceBeanConditionalTest.java |   8 +-
 .../JavaConfigRawReferenceBeanConditionalTest.java |   8 +-
 .../JavaConfigReferenceBeanConditionalTest4.java   |   8 +-
 .../configprops/SpringBootConfigPropsTest.java     |  13 +-
 .../SpringBootMultipleConfigPropsTest.java         |  10 +-
 .../importxml/SpringBootImportDubboXmlTest.java    |   8 +-
 .../annotation/DubboConfigConfigurationTest.java   |   6 +-
 .../context/annotation/EnableDubboConfigTest.java  |  11 +-
 .../spring/issues/issue6000/Issue6000Test.java     |   8 +-
 .../spring/issues/issue6252/Issue6252Test.java     |  10 +-
 .../spring/issues/issue7003/Issue7003Test.java     |   8 +-
 .../consumer/PropertyConfigurerTest.java           |   8 +-
 .../consumer2/PropertySourcesConfigurerTest.java   |   8 +-
 .../consumer3/PropertySourcesInJavaConfigTest.java |  22 +-
 .../reference/DubboConfigBeanInitializerTest.java  |   8 +-
 .../config/spring/reference/ReferenceKeyTest.java  |   8 +-
 .../javaconfig/JavaConfigReferenceBeanTest.java    |  18 +-
 .../spring/reference/localcall/LocalCallTest.java  |   8 +-
 .../spring/reference/localcall/LocalCallTest2.java |   8 +-
 .../registrycenter/AbstractRegistryCenter.java     | 107 +++++
 .../DefaultSingleRegistryCenter.java               | 101 -----
 .../spring/registrycenter/RegistryCenter.java      |  33 ++
 ...r.java => ZookeeperMultipleRegistryCenter.java} |  42 +-
 .../registrycenter/ZookeeperRegistryCenter.java    | 142 +++++++
 ...ter.java => ZookeeperSingleRegistryCenter.java} |  27 +-
 .../config/spring/schema/GenericServiceTest.java   |  15 +-
 dubbo-dependencies-bom/pom.xml                     |   2 +-
 dubbo-distribution/dubbo-all/pom.xml               |  12 +
 .../org/apache/dubbo/metadata/MetadataInfo.java    |  63 ++-
 .../apache/dubbo/metadata/ServiceNameMapping.java  |  11 +-
 .../metadata/report/MetadataReportInstance.java    |   7 +-
 .../support/AbstractMetadataReportFactory.java     |  34 +-
 .../apache/dubbo/metadata/MetadataInfoTest.java    |  99 +++--
 .../CustomizedParamsFilter.java}                   |  19 +-
 .../metadata/filter/ExcludedParamsFilter.java      |  26 +-
 .../org.apache.dubbo.metadata.MetadataParamsFilter |   3 +-
 .../apache/dubbo/auth/AccessKeyAuthenticator.java  |   2 +-
 .../dubbo/auth/AccessKeyAuthenticatorTest.java     |   2 +-
 .../dubbo/registry/ListenerRegistryWrapper.java    |   8 +-
 .../dubbo/registry/ProviderFirstParams.java}       |  10 +-
 .../registry/client/DefaultServiceInstance.java    |   8 +-
 .../dubbo/registry/client/InstanceAddressURL.java  |  26 +-
 .../registry/client/ServiceDiscoveryRegistry.java  | 102 +----
 .../client/ServiceDiscoveryRegistryDirectory.java  |  22 +-
 .../dubbo/registry/client/ServiceInstance.java     |  11 -
 .../listener/ServiceInstancesChangedListener.java  |  42 +-
 .../metadata/MetadataServiceNameMapping.java       |  58 +--
 ...MetadataServiceURLParamsMetadataCustomizer.java |   3 +
 .../registry/client/metadata/MetadataUtils.java    |  33 +-
 .../ServiceInstanceMetadataCustomizer.java         |  40 +-
 .../metadata/ServiceInstanceMetadataUtils.java     |  42 +-
 .../store/InMemoryWritableMetadataService.java     |   2 +-
 .../metadata/store/RemoteMetadataServiceImpl.java  |   2 +-
 .../client/migration/MigrationRuleHandler.java     |  11 +-
 .../client/migration/MigrationRuleListener.java    |  33 +-
 .../client/migration/model/MigrationRule.java      |  13 +-
 .../registry/integration/RegistryProtocol.java     |  41 +-
 .../registry/support/AbstractRegistryFactory.java  |  53 ++-
 .../support/CacheableFailbackRegistry.java         |  14 +-
 .../support/DefaultProviderFirstParams.java        |  25 +-
 .../org.apache.dubbo.registry.ProviderFirstParams  |   1 +
 .../java/org/apache/dubbo/registry/MockLogger.java | 135 ++++++
 .../client/DefaultServiceInstanceTest.java         |  62 ++-
 .../registry/client/InstanceAddressURLTest.java    | 161 ++++++++
 .../client/ServiceDiscoveryRegistryTest.java       | 249 +++++++++++
 .../MockServiceInstancesChangedListener.java       |  46 +++
 .../ServiceInstancesChangedListenerTest.java       |  61 ++-
 .../metadata/MetadataServiceNameMappingTest.java   | 134 ++++++
 .../ProtocolPortsMetadataCustomizerTest.java       | 101 +++++
 .../ServiceInstanceMetadataCustomizerTest.java     | 126 ++++++
 .../metadata/store/CustomizedParamsFilter.java     |  22 +-
 .../metadata/store/ExcludedParamsFilter.java       |  16 +-
 .../store/InMemoryMetadataServiceTest.java         | 175 ++++++++
 .../store/RemoteMetadataServiceImplTest.java}      |   7 +-
 .../client/migration/MigrationInvokerTest.java     |   8 +
 .../client/migration/MigrationRuleHandlerTest.java |  26 ++
 .../migration/MigrationRuleListenerTest.java       | 174 +++++++-
 .../client/migration/model/MigrationRuleTest.java  | 134 +++---
 .../DemoService.java}                              |   9 +-
 .../DemoService2.java}                             |   9 +-
 .../support/ServiceOrientedRegistryTest.java       |  16 +-
 .../org.apache.dubbo.metadata.MetadataParamsFilter |   2 +
 .../KubernetesMeshEnvListenerFactory.java          |  51 +--
 ...uster.router.mesh.route.MeshEnvListenerFactory} |   2 +-
 .../dubbo/registry/multiple/MultipleRegistry.java  |   2 +-
 .../multiple/MultipleServiceDiscovery.java         |   2 +-
 .../registry/nacos/NacosNamingServiceWrapper.java  |   4 +
 .../apache/dubbo/registry/nacos/NacosRegistry.java |  16 +-
 .../registry/nacos/NacosServiceDiscovery.java      |  26 +-
 .../nacos/util/NacosNamingServiceUtils.java        |  15 -
 .../zookeeper/ZookeeperServiceDiscovery.java       |   9 +-
 .../zookeeper/util/CuratorFrameworkUtils.java      |  39 +-
 .../dubbo/remoting/transport/AbstractClient.java   |  13 +-
 .../java/org/apache/dubbo/rpc/HeaderFilter.java    |  11 +-
 .../apache/dubbo/rpc/filter/TokenHeaderFilter.java |  49 +++
 .../dubbo/rpc/listener/ListenerInvokerWrapper.java |   7 +
 .../dubbo/rpc/protocol/AbstractProtocol.java       |   8 +-
 .../apache/dubbo/rpc/support/AccessLogData.java    |   7 +-
 .../org/apache/dubbo/rpc/support/MockInvoker.java  |   7 +-
 .../internal/org.apache.dubbo.rpc.HeaderFilter     |   1 +
 .../dubbo/rpc/protocol/CountInvokerListener.java   |  28 +-
 .../rpc/protocol/ProtocolListenerWrapperTest.java  |  81 ++++
 .../org/apache/dubbo/rpc/support/DemoServiceA.java |   9 +-
 .../apache/dubbo/rpc/support/DemoServiceAMock.java |  12 +-
 .../org/apache/dubbo/rpc/support/DemoServiceB.java |   9 +-
 .../apache/dubbo/rpc/support/DemoServiceBMock.java |  11 +-
 .../apache/dubbo/rpc/support/MockInvokerTest.java  |  25 ++
 .../internal/org.apache.dubbo.rpc.InvokerListener  |   1 +
 .../rpc/protocol/dubbo/DecodeableRpcResult.java    |  13 +-
 .../rpc/protocol/dubbo/DubboCodecSupport.java      |  18 +-
 .../dubbo/rpc/protocol/dubbo/DubboProtocol.java    |   6 +-
 .../dubbo/rpc/protocol/injvm/InjvmExporter.java    |   2 +-
 .../dubbo/rpc/protocol/injvm/InjvmInvoker.java     |   2 +-
 .../rpc/protocol/injvm/InjvmProtocolTest.java      |  19 +-
 .../rpc/protocol/tri/AbstractClientStream.java     |   6 +-
 .../rpc/protocol/tri/AbstractServerStream.java     |  23 +-
 .../dubbo/rpc/protocol/tri/AbstractStream.java     |  54 +--
 .../dubbo/rpc/protocol/tri/ClientStream.java       |   8 +-
 .../rpc/protocol/tri/ClientTransportObserver.java  |   6 +-
 .../dubbo/rpc/protocol/tri/ServerStream.java       |  49 ++-
 .../rpc/protocol/tri/ServerTransportObserver.java  |   8 +-
 ...Serialization.java => SingleProtobufUtils.java} |  64 ++-
 .../org/apache/dubbo/rpc/protocol/tri/Stream.java  |  46 ++-
 .../dubbo/rpc/protocol/tri/TransportObserver.java  |  20 +-
 .../rpc/protocol/tri/TripleClientHandler.java      |  16 +-
 .../protocol/tri/TripleClientInboundHandler.java   |   2 +-
 .../tri/TripleHttp2ClientResponseHandler.java      |   6 +-
 .../tri/TripleHttp2FrameServerHandler.java         |   6 +-
 .../protocol/tri/TripleServerInboundHandler.java   |   2 +-
 .../apache/dubbo/rpc/protocol/tri/TripleUtil.java  |   6 +-
 .../dubbo/rpc/protocol/tri/UnaryClientStream.java  |  11 +-
 .../dubbo/rpc/protocol/tri/UnaryServerStream.java  |  18 +-
 .../rpc/protocol/tri/UnaryClientStreamTest.java    |   2 +-
 237 files changed, 5550 insertions(+), 2121 deletions(-)
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshEnvListenerFactory.java (81%)
 create mode 100644 dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/DefaultFilterChainBuilderTest.java
 copy dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DefaultMetadataParamsFilter.java => dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/DemoServiceImpl.java (76%)
 copy dubbo-rpc/dubbo-rpc-injvm/src/main/java/org/apache/dubbo/rpc/protocol/injvm/InjvmExporter.java => dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/LogFilter.java (53%)
 create mode 100644 dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/mock/MockInvokersSelectorTest.java
 create mode 100644 dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/BroadCastClusterInvokerTest.java
 create mode 100644 dubbo-cluster/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
 rename {dubbo-config/dubbo-config-api => dubbo-common}/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java (76%)
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => dubbo-common/src/test/java/org/apache/dubbo/config/Greeting.java (80%)
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => dubbo-common/src/test/java/org/apache/dubbo/config/GreetingLocal1.java (83%)
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => dubbo-common/src/test/java/org/apache/dubbo/config/GreetingLocal2.java (78%)
 copy dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DefaultMetadataParamsFilter.java => dubbo-common/src/test/java/org/apache/dubbo/config/GreetingLocal3.java (70%)
 create mode 100644 dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ConfigValidationUtilsTest.java
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/Constants.java (75%)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouter.java => dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderExporterListener.java (62%)
 create mode 100644 dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderFilter.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/{single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java => multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java} (55%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/{single/exportprovider/SingleRegistryCenterExportProviderRegistryProtocolListener.java => multiple/exportprovider/MultipleRegistryCenterExportProviderRegistryProtocolListener.java} (83%)
 rename dubbo-config/{dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registrycenter/SingleRegistryCenter.java => dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderService.java} (73%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/{registrycenter/SingleRegistryCenter.java => integration/multiple/exportprovider/MultipleRegistryCenterExportProviderServiceImpl.java} (69%)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshEnvListener.java => dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderServiceListener.java (59%)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouter.java => dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/exportmetadata/SingleRegistryCenterExportMetadataExporterListener.java (61%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/{injvm/SingleRegistryCenterInjvmIntegrationTest.java => exportmetadata/SingleRegistryCenterExportMetadataIntegrationTest.java} (57%)
 rename dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/{registrycenter/SingleRegistryCenter.java => integration/single/exportmetadata/SingleRegistryCenterExportMetadataService.java} (74%)
 rename dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/{registrycenter/MultipleRegistryCenter.java => integration/single/exportmetadata/SingleRegistryCenterExportMetadataServiceImpl.java} (69%)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshEnvListener.java => dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/exportmetadata/SingleRegistryCenterExportMetadataServiceListener.java (59%)
 create mode 100644 dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/AbstractRegistryCenter.java
 delete mode 100644 dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/DefaultMultipleRegistryCenter.java
 delete mode 100644 dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/DefaultSingleRegistryCenter.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/{RegistryCenter.java => ZookeeperMultipleRegistryCenter.java} (56%)
 create mode 100644 dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/ZookeeperRegistryCenter.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/{RegistryCenter.java => ZookeeperSingleRegistryCenter.java} (61%)
 create mode 100644 dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registrycenter/AbstractRegistryCenter.java
 delete mode 100644 dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registrycenter/DefaultSingleRegistryCenter.java
 rename dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registrycenter/{ZooKeeperServer.java => ZookeeperMultipleRegistryCenter.java} (55%)
 create mode 100644 dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registrycenter/ZookeeperRegistryCenter.java
 copy dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registrycenter/{RegistryCenter.java => ZookeeperSingleRegistryCenter.java} (61%)
 copy dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/{DefaultMetadataParamsFilter.java => filter/CustomizedParamsFilter.java} (59%)
 copy dubbo-common/src/main/java/org/apache/dubbo/common/infra/support/CmdbAdapter.java => dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/filter/ExcludedParamsFilter.java (61%)
 copy dubbo-registry/dubbo-registry-api/src/{test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => main/java/org/apache/dubbo/registry/ProviderFirstParams.java} (84%)
 copy dubbo-common/src/main/java/org/apache/dubbo/common/infra/support/CmdbAdapter.java => dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/DefaultProviderFirstParams.java (54%)
 create mode 100644 dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.ProviderFirstParams
 create mode 100644 dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/MockLogger.java
 create mode 100644 dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/InstanceAddressURLTest.java
 create mode 100644 dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryTest.java
 create mode 100644 dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/MockServiceInstancesChangedListener.java
 create mode 100644 dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMappingTest.java
 create mode 100644 dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizerTest.java
 create mode 100644 dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizerTest.java
 copy dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DefaultMetadataParamsFilter.java => dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/store/CustomizedParamsFilter.java (53%)
 rename dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DefaultMetadataParamsFilter.java => dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/store/ExcludedParamsFilter.java (69%)
 create mode 100644 dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/store/InMemoryMetadataServiceTest.java
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/{ServieDiscoveryRegistryTest.java => metadata/store/RemoteMetadataServiceImplTest.java} (88%)
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/{client/ServieDiscoveryRegistryTest.java => service/DemoService.java} (88%)
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/{client/ServieDiscoveryRegistryTest.java => service/DemoService2.java} (88%)
 create mode 100644 dubbo-registry/dubbo-registry-api/src/test/resources/META-INF/dubbo/org.apache.dubbo.metadata.MetadataParamsFilter
 copy dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/Stream.java => dubbo-registry/dubbo-registry-kubernetes/src/main/java/org/apache/dubbo/registry/kubernetes/KubernetesMeshEnvListenerFactory.java (50%)
 rename dubbo-registry/dubbo-registry-kubernetes/src/main/resources/META-INF/dubbo/internal/{org.apache.dubbo.rpc.cluster.router.mesh.route.MeshEnvListener => org.apache.dubbo.rpc.cluster.router.mesh.route.MeshEnvListenerFactory} (79%)
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/HeaderFilter.java (79%)
 create mode 100644 dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/TokenHeaderFilter.java
 create mode 100644 dubbo-rpc/dubbo-rpc-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.HeaderFilter
 rename dubbo-common/src/main/java/org/apache/dubbo/common/infra/support/CmdbAdapter.java => dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/protocol/CountInvokerListener.java (60%)
 create mode 100644 dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/protocol/ProtocolListenerWrapperTest.java
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceA.java (89%)
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceAMock.java (75%)
 copy dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceB.java (89%)
 rename dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java => dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/DemoServiceBMock.java (75%)
 create mode 100644 dubbo-rpc/dubbo-rpc-api/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.InvokerListener
 rename dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/{SingleProtobufSerialization.java => SingleProtobufUtils.java} (54%)

[dubbo] 02/04: Merge branch '3.0-multi-instances' into 3.0-multi-instances-merge

Posted by al...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0-multi-instances
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit b74de7ba118a7eff612b55a0c962a00f7102bd02
Merge: 7c05961 bdf30e6
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Tue Aug 31 20:34:15 2021 +0800

    Merge branch '3.0-multi-instances' into 3.0-multi-instances-merge

 .../apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java  | 10 +++++++++-
 .../apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java  |  8 ++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)

[dubbo] 01/04: Merge remote-tracking branch 'apache/3.0' into 3.0-multi-instances

Posted by al...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0-multi-instances
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit 7c059611a41f17f11ff3e0fd853be1a8c3a4735c
Merge: 6c65c31 3f59150
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Tue Aug 31 17:47:12 2021 +0800

    Merge remote-tracking branch 'apache/3.0' into 3.0-multi-instances
    
    # Conflicts:
    #	dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
    #	dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
    #	dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
    #	dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
    #	dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
    #	dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/MigrationRuleListenerTest.java
    #	dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
    #	dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
    #	dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
    #	dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcResult.java

 compiler/pom.xml                                   |   2 +-
 .../main/resources/Dubbo3InterfaceStub.mustache    |  44 +-
 compiler/src/main/resources/Dubbo3Stub.mustache    |   5 +-
 compiler/src/main/resources/DubboGrpcStub.mustache |   3 -
 compiler/src/main/resources/DubboStub.mustache     |   3 -
 .../main/resources/ReactorDubboGrpcStub.mustache   |   3 -
 .../src/main/resources/RxDubboGrpcStub.mustache    |   3 -
 .../cluster/router/condition/ConditionRouter.java  |   3 -
 .../cluster/router/condition/config/AppRouter.java |   3 +-
 .../router/condition/config/ListenableRouter.java  |   4 +-
 .../cluster/router/mesh/route/MeshEnvListener.java |   3 -
 .../router/mesh/route/MeshEnvListenerFactory.java  |  10 +-
 .../cluster/router/mesh/route/MeshRuleManager.java |   5 +-
 .../cluster/support/BroadcastClusterInvoker.java   |   6 +-
 .../absent/AbsentConfiguratorTest.java             |  52 ++
 .../override/OverrideConfiguratorTest.java         |  49 ++
 .../filter/DefaultFilterChainBuilderTest.java      |  66 +++
 .../dubbo/rpc/cluster/filter/DemoServiceImpl.java  |  14 +-
 .../apache/dubbo/rpc/cluster/filter/LogFilter.java |  36 +-
 .../ShortestResponseLoadBalanceTest.java           |   7 +-
 .../router/mock/MockInvokersSelectorTest.java      |  71 +++
 .../support/BroadCastClusterInvokerTest.java       | 164 +++++++
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |   1 +
 .../dubbo/common/constants/CommonConstants.java    |  29 +-
 .../dubbo/common/extension/ExtensionLoader.java    |   1 +
 .../extension/support/WrapperComparator.java       |  31 +-
 .../url/component/DubboServiceAddressURL.java      |   6 -
 .../org/apache/dubbo/common/utils/ConfigUtils.java |   3 +-
 .../org/apache/dubbo/common/utils/NetUtils.java    |  55 ++-
 .../org/apache/dubbo/config/AbstractConfig.java    |   2 +-
 .../org/apache/dubbo/config/ApplicationConfig.java |  32 +-
 .../apache/dubbo/config/ConfigCenterConfig.java    |  74 +--
 .../apache/dubbo/config/MetadataReportConfig.java  |  37 +-
 .../java/org/apache/dubbo/config/ModuleConfig.java |   2 +
 .../apache/dubbo/rpc/model/MethodDescriptor.java   |  41 +-
 .../apache/dubbo/common/utils/NetUtilsTest.java    |  91 +++-
 .../dubbo/config/AbstractInterfaceConfigTest.java  |  70 +--
 .../java/org/apache/dubbo/config/Greeting.java     |  12 +-
 .../org/apache/dubbo/config/GreetingLocal1.java    |   9 +-
 .../org/apache/dubbo/config/GreetingLocal2.java    |  14 +-
 .../org/apache/dubbo/config/GreetingLocal3.java    |  17 +-
 .../apache/dubbo/descriptor/DescriptorService.java |   5 +
 .../dubbo/descriptor/MethodDescriptorTest.java     |  14 +
 dubbo-config/dubbo-config-api/pom.xml              |   7 +
 .../org/apache/dubbo/config/ReferenceConfig.java   |  12 +-
 .../org/apache/dubbo/config/ServiceConfig.java     |  11 +-
 .../dubbo/config/bootstrap/DubboBootstrap.java     | 116 +++--
 .../bootstrap/builders/MetadataReportBuilder.java  |  36 +-
 .../dubbo/config/utils/ConfigValidationUtils.java  |   2 +-
 .../apache/dubbo/config/ReferenceConfigTest.java   | 531 ++++++++++++++++++++-
 .../org/apache/dubbo/config/ServiceConfigTest.java |   6 +-
 .../dubbo/config/bootstrap/DubboBootstrapTest.java | 166 ++++++-
 .../org/apache/dubbo/config/url/UrlTestBase.java   |  61 +--
 .../config/utils/ConfigValidationUtilsTest.java    |  63 +++
 .../org/apache/dubbo/integration/Constants.java    |  10 +-
 ...gistryCenterExportProviderExporterListener.java |  23 +-
 ...MultipleRegistryCenterExportProviderFilter.java |  86 ++++
 ...gistryCenterExportProviderIntegrationTest.java} | 113 +++--
 ...terExportProviderRegistryProtocolListener.java} |   8 +-
 ...ltipleRegistryCenterExportProviderService.java} |  12 +-
 ...leRegistryCenterExportProviderServiceImpl.java} |  16 +-
 ...egistryCenterExportProviderServiceListener.java |  24 +-
 ...MultipleRegistryCenterInjvmIntegrationTest.java |  15 +-
 ...terServiceDiscoveryRegistryIntegrationTest.java |  55 ++-
 ...ceDiscoveryRegistryRegistryServiceListener.java |  28 +-
 ...RegistryCenterDubboProtocolIntegrationTest.java |  26 +-
 ...gistryCenterExportMetadataExporterListener.java |  24 +-
 ...gistryCenterExportMetadataIntegrationTest.java} | 131 ++---
 ...SingleRegistryCenterExportMetadataService.java} |  12 +-
 ...leRegistryCenterExportMetadataServiceImpl.java} |  17 +-
 ...egistryCenterExportMetadataServiceListener.java |  25 +-
 ...egistryCenterExportProviderIntegrationTest.java |  67 ++-
 ...nterExportProviderRegistryProtocolListener.java |   4 +-
 .../SingleRegistryCenterInjvmIntegrationTest.java  |  16 +-
 .../registrycenter/AbstractRegistryCenter.java     | 107 +++++
 .../DefaultMultipleRegistryCenter.java             | 121 -----
 .../DefaultSingleRegistryCenter.java               | 101 ----
 .../dubbo/registrycenter/RegistryCenter.java       |  33 ++
 ...r.java => ZookeeperMultipleRegistryCenter.java} |  26 +-
 .../registrycenter/ZookeeperRegistryCenter.java    | 142 ++++++
 ...ter.java => ZookeeperSingleRegistryCenter.java} |  27 +-
 .../org.apache.dubbo.common.status.StatusChecker   |  19 +-
 .../org.apache.dubbo.common.threadpool.ThreadPool  |  19 +-
 .../org.apache.dubbo.config.ServiceListener        |   2 +
 ...g.apache.dubbo.registry.RegistryServiceListener |  17 -
 ...o.registry.integration.RegistryProtocolListener |  18 +-
 .../services/org.apache.dubbo.remoting.Dispatcher  |  19 +-
 .../services/org.apache.dubbo.remoting.Transporter |  19 +-
 .../org.apache.dubbo.remoting.exchange.Exchanger   |  19 +-
 .../org.apache.dubbo.remoting.telnet.TelnetHandler |  16 -
 .../services/org.apache.dubbo.rpc.ExporterListener |  19 +-
 .../META-INF/services/org.apache.dubbo.rpc.Filter  |   1 +
 .../config/spring/util/DubboAnnotationUtils.java   |   3 +-
 .../src/main/resources/META-INF/dubbo.xsd          |   8 +-
 .../org/apache/dubbo/config/spring/ConfigTest.java |   9 +-
 .../dubbo/config/spring/JavaConfigBeanTest.java    |   8 +-
 .../annotation/MethodConfigCallbackTest.java       |   8 +-
 .../factory/annotation/ParameterConvertTest.java   |   5 +
 .../XmlReferenceBeanConditionalTest.java           |   8 +-
 ...nfigAnnotationReferenceBeanConditionalTest.java |   8 +-
 .../JavaConfigRawReferenceBeanConditionalTest.java |   8 +-
 .../JavaConfigReferenceBeanConditionalTest4.java   |   8 +-
 .../configprops/SpringBootConfigPropsTest.java     |  13 +-
 .../SpringBootMultipleConfigPropsTest.java         |  10 +-
 .../importxml/SpringBootImportDubboXmlTest.java    |   8 +-
 .../annotation/DubboConfigConfigurationTest.java   |   6 +-
 .../context/annotation/EnableDubboConfigTest.java  |  11 +-
 .../spring/issues/issue6000/Issue6000Test.java     |   8 +-
 .../spring/issues/issue6252/Issue6252Test.java     |  10 +-
 .../spring/issues/issue7003/Issue7003Test.java     |   8 +-
 .../consumer/PropertyConfigurerTest.java           |   8 +-
 .../consumer2/PropertySourcesConfigurerTest.java   |   8 +-
 .../consumer3/PropertySourcesInJavaConfigTest.java |  25 +-
 .../reference/DubboConfigBeanInitializerTest.java  |   8 +-
 .../config/spring/reference/ReferenceKeyTest.java  |   8 +-
 .../javaconfig/JavaConfigReferenceBeanTest.java    |  15 +-
 .../spring/reference/localcall/LocalCallTest.java  |   8 +-
 .../spring/reference/localcall/LocalCallTest2.java |   8 +-
 .../registrycenter/AbstractRegistryCenter.java     | 107 +++++
 .../DefaultSingleRegistryCenter.java               | 101 ----
 .../spring/registrycenter/RegistryCenter.java      |  33 ++
 ...r.java => ZookeeperMultipleRegistryCenter.java} |  42 +-
 .../registrycenter/ZookeeperRegistryCenter.java    | 142 ++++++
 ...ter.java => ZookeeperSingleRegistryCenter.java} |  27 +-
 .../config/spring/schema/GenericServiceTest.java   |  15 +-
 dubbo-dependencies-bom/pom.xml                     |   2 +-
 dubbo-distribution/dubbo-all/pom.xml               |  12 +
 .../org/apache/dubbo/metadata/MetadataInfo.java    |  63 ++-
 .../apache/dubbo/metadata/ServiceNameMapping.java  |   2 +-
 .../metadata/report/MetadataReportInstance.java    |   7 +-
 .../support/AbstractMetadataReportFactory.java     |  34 +-
 .../apache/dubbo/metadata/MetadataInfoTest.java    |  99 +++-
 .../CustomizedParamsFilter.java}                   |  19 +-
 .../metadata/filter/ExcludedParamsFilter.java      |  26 +-
 .../org.apache.dubbo.metadata.MetadataParamsFilter |   3 +-
 .../apache/dubbo/auth/AccessKeyAuthenticator.java  |   2 +-
 .../dubbo/auth/AccessKeyAuthenticatorTest.java     |   2 +-
 .../dubbo/registry/ListenerRegistryWrapper.java    |   8 +-
 .../dubbo/registry/ProviderFirstParams.java}       |  10 +-
 .../registry/client/DefaultServiceInstance.java    |   7 +-
 .../dubbo/registry/client/InstanceAddressURL.java  |  26 +-
 .../registry/client/ServiceDiscoveryRegistry.java  | 100 +---
 .../client/ServiceDiscoveryRegistryDirectory.java  |  22 +-
 .../dubbo/registry/client/ServiceInstance.java     |  11 -
 .../listener/ServiceInstancesChangedListener.java  |  42 +-
 .../metadata/MetadataServiceNameMapping.java       |  58 +--
 ...MetadataServiceURLParamsMetadataCustomizer.java |   3 +
 .../registry/client/metadata/MetadataUtils.java    |  33 +-
 .../ServiceInstanceMetadataCustomizer.java         |  42 +-
 .../metadata/ServiceInstanceMetadataUtils.java     |  42 +-
 .../store/InMemoryWritableMetadataService.java     |   2 +-
 .../metadata/store/RemoteMetadataServiceImpl.java  |   2 +-
 .../client/migration/MigrationRuleHandler.java     |  11 +-
 .../client/migration/MigrationRuleListener.java    |  33 +-
 .../client/migration/model/MigrationRule.java      |   3 +
 .../registry/integration/RegistryProtocol.java     |  31 +-
 .../registry/support/AbstractRegistryFactory.java  |  53 +-
 .../support/CacheableFailbackRegistry.java         |  15 +-
 .../support/DefaultProviderFirstParams.java        |  25 +-
 .../org.apache.dubbo.registry.ProviderFirstParams  |   1 +
 .../java/org/apache/dubbo/registry/MockLogger.java | 135 ++++++
 .../client/DefaultServiceInstanceTest.java         |  62 ++-
 .../registry/client/InstanceAddressURLTest.java    | 160 +++++++
 .../client/ServiceDiscoveryRegistryTest.java       | 248 ++++++++++
 .../MockServiceInstancesChangedListener.java       |  46 ++
 .../ServiceInstancesChangedListenerTest.java       |  61 ++-
 .../metadata/MetadataServiceNameMappingTest.java   | 134 ++++++
 .../ProtocolPortsMetadataCustomizerTest.java       | 101 ++++
 .../ServiceInstanceMetadataCustomizerTest.java     | 126 +++++
 .../metadata/store/CustomizedParamsFilter.java     |  22 +-
 .../metadata/store/ExcludedParamsFilter.java       |  16 +-
 .../store/InMemoryMetadataServiceTest.java         | 175 +++++++
 .../store/RemoteMetadataServiceImplTest.java}      |   7 +-
 .../client/migration/MigrationInvokerTest.java     |   8 +
 .../client/migration/MigrationRuleHandlerTest.java |  26 +
 .../migration/MigrationRuleListenerTest.java       | 174 ++++++-
 .../client/migration/model/MigrationRuleTest.java  | 106 ++--
 .../DemoService.java}                              |   9 +-
 .../DemoService2.java}                             |   9 +-
 .../support/ServiceOrientedRegistryTest.java       |  16 +-
 .../org.apache.dubbo.metadata.MetadataParamsFilter |   2 +
 .../KubernetesMeshEnvListenerFactory.java          |  51 +-
 ...uster.router.mesh.route.MeshEnvListenerFactory} |   2 +-
 .../dubbo/registry/multiple/MultipleRegistry.java  |   2 +-
 .../multiple/MultipleServiceDiscovery.java         |   2 +-
 .../registry/nacos/NacosNamingServiceWrapper.java  |   4 +
 .../apache/dubbo/registry/nacos/NacosRegistry.java |  16 +-
 .../registry/nacos/NacosServiceDiscovery.java      |  26 +-
 .../nacos/util/NacosNamingServiceUtils.java        |  15 -
 .../zookeeper/ZookeeperServiceDiscovery.java       |   9 +-
 .../zookeeper/util/CuratorFrameworkUtils.java      |  39 +-
 .../dubbo/remoting/transport/AbstractClient.java   |  13 +-
 .../java/org/apache/dubbo/rpc/HeaderFilter.java    |  11 +-
 .../apache/dubbo/rpc/filter/TokenHeaderFilter.java |  49 ++
 .../dubbo/rpc/listener/ListenerInvokerWrapper.java |   7 +
 .../dubbo/rpc/protocol/AbstractProtocol.java       |   8 +-
 .../apache/dubbo/rpc/support/AccessLogData.java    |   7 +-
 .../org/apache/dubbo/rpc/support/MockInvoker.java  |   7 +-
 .../internal/org.apache.dubbo.rpc.HeaderFilter     |   1 +
 .../dubbo/rpc/protocol/CountInvokerListener.java   |  28 +-
 .../rpc/protocol/ProtocolListenerWrapperTest.java  |  81 ++++
 .../org/apache/dubbo/rpc/support/DemoServiceA.java |   9 +-
 .../apache/dubbo/rpc/support/DemoServiceAMock.java |  12 +-
 .../org/apache/dubbo/rpc/support/DemoServiceB.java |   9 +-
 .../apache/dubbo/rpc/support/DemoServiceBMock.java |  11 +-
 .../apache/dubbo/rpc/support/MockInvokerTest.java  |  25 +
 .../internal/org.apache.dubbo.rpc.InvokerListener  |   1 +
 .../rpc/protocol/dubbo/DecodeableRpcResult.java    |  13 +-
 .../rpc/protocol/dubbo/DubboCodecSupport.java      |  18 +-
 .../dubbo/rpc/protocol/dubbo/DubboProtocol.java    |   6 +-
 .../dubbo/rpc/protocol/injvm/InjvmExporter.java    |   2 +-
 .../dubbo/rpc/protocol/injvm/InjvmInvoker.java     |   2 +-
 .../rpc/protocol/injvm/InjvmProtocolTest.java      |  19 +-
 .../rpc/protocol/tri/AbstractClientStream.java     |   6 +-
 .../rpc/protocol/tri/AbstractServerStream.java     |  23 +-
 .../dubbo/rpc/protocol/tri/AbstractStream.java     |  54 ++-
 .../dubbo/rpc/protocol/tri/ClientStream.java       |   8 +-
 .../rpc/protocol/tri/ClientTransportObserver.java  |   6 +-
 .../dubbo/rpc/protocol/tri/ServerStream.java       |  49 +-
 .../rpc/protocol/tri/ServerTransportObserver.java  |   8 +-
 ...Serialization.java => SingleProtobufUtils.java} |  64 ++-
 .../org/apache/dubbo/rpc/protocol/tri/Stream.java  |  46 +-
 .../dubbo/rpc/protocol/tri/TransportObserver.java  |  20 +-
 .../rpc/protocol/tri/TripleClientHandler.java      |  16 +-
 .../protocol/tri/TripleClientInboundHandler.java   |   2 +-
 .../tri/TripleHttp2ClientResponseHandler.java      |   6 +-
 .../tri/TripleHttp2FrameServerHandler.java         |   6 +-
 .../protocol/tri/TripleServerInboundHandler.java   |   2 +-
 .../apache/dubbo/rpc/protocol/tri/TripleUtil.java  |   6 +-
 .../dubbo/rpc/protocol/tri/UnaryClientStream.java  |  11 +-
 .../dubbo/rpc/protocol/tri/UnaryServerStream.java  |  18 +-
 .../rpc/protocol/tri/UnaryClientStreamTest.java    |   2 +-
 232 files changed, 5513 insertions(+), 2091 deletions(-)

diff --cc dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleManager.java
index 6e988f9,b07fede..c64d780
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleManager.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleManager.java
@@@ -40,10 -42,11 +42,11 @@@ public final class MeshRuleManager 
  
          MeshAppRuleListener meshAppRuleListener = new MeshAppRuleListener(app);
          String appRuleDataId = app + MESH_RULE_DATA_ID_SUFFIX;
 -        DynamicConfiguration configuration = ApplicationModel.getEnvironment().getDynamicConfiguration()
 +        DynamicConfiguration configuration = ApplicationModel.defaultModel().getApplicationEnvironment().getDynamicConfiguration()
              .orElse(null);
  
-         Set<MeshEnvListener> envListeners = ExtensionLoader.getExtensionLoader(MeshEnvListener.class).getSupportedExtensionInstances();
+         Set<MeshEnvListenerFactory> envListenerFactories = ExtensionLoader.getExtensionLoader(MeshEnvListenerFactory.class).getSupportedExtensionInstances();
+         Set<MeshEnvListener> envListeners = envListenerFactories.stream().map(MeshEnvListenerFactory::getListener).filter(Objects::nonNull).collect(Collectors.toSet());
  
          if (configuration == null && envListeners.stream().noneMatch(MeshEnvListener::isEnable)) {
              logger.warn("Doesn't support Configuration!");
diff --cc dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
index 67de259,7c59e88..c1019ea
--- 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
@@@ -448,7 -464,12 +464,16 @@@ public interface CommonConstants 
  
      String SERVICE_NAME_MAPPING_KEY = "service-name-mapping";
  
 +    String SCOPE_MODEL = "scopeModel";
 +
 +    String SERVICE_MODEL = "serviceModel";
++
+     /**
+      * The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that
+      * the Dubbo application will be ignored
+      *
+      * @since 2.7.6
+      */
+     String DUBBO_NETWORK_IGNORED_INTERFACE = "dubbo.network.interface.ignored";
+ 
  }
diff --cc dubbo-common/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
index 4133f0e,412122e..59ff045
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
@@@ -131,13 -149,11 +149,13 @@@ public class ConfigCenterConfig extend
          if (StringUtils.isEmpty(map.get(PROTOCOL_KEY))) {
              map.put(PROTOCOL_KEY, ZOOKEEPER_PROTOCOL);
          }
 -        return UrlUtils.parseURL(address, map);
 +        URL url = UrlUtils.parseURL(address, map);
 +        url.setScopeModel(getScopeModel());
 +        return url;
      }
  
-     public boolean checkOrUpdateInited() {
-         return inited.compareAndSet(false, true);
+     public boolean checkOrUpdateInitialized(boolean update) {
+         return initialized.compareAndSet(false, update);
      }
  
      public Map<String, String> getExternalConfiguration() {
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index c66202f,04511e2..2f2e4cc
--- 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
@@@ -44,6 -45,6 +44,7 @@@ import org.apache.dubbo.rpc.model.Async
  import org.apache.dubbo.rpc.model.ConsumerModel;
  import org.apache.dubbo.rpc.model.ServiceDescriptor;
  import org.apache.dubbo.rpc.model.ServiceRepository;
++import org.apache.dubbo.rpc.model.ApplicationModel;
  import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;
  import org.apache.dubbo.rpc.service.GenericService;
  import org.apache.dubbo.rpc.support.ProtocolUtils;
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index 7ce2e3f,4c07ecc..ec49581
--- 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
@@@ -208,10 -197,8 +208,8 @@@ public class ServiceConfig<T> extends S
              this.bootstrap.service(this);
  
              // load ServiceListeners from extension
 -            ExtensionLoader<ServiceListener> extensionLoader = ExtensionLoader.getExtensionLoader(ServiceListener.class);
 +            ExtensionLoader<ServiceListener> extensionLoader = this.getExtensionLoader(ServiceListener.class);
              this.serviceListeners.addAll(extensionLoader.getSupportedExtensionInstances());
- 
-             this.checkAndUpdateSubConfigs();
          }
  
          initServiceMetadata(provider);
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
index 584544f,19d924d..ec51a07
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
@@@ -113,7 -111,7 +113,8 @@@ import static org.apache.dubbo.common.u
  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.metadata.WritableMetadataService.getDefaultExtension;
  import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setMetadataStorageType;
  import static org.apache.dubbo.registry.support.AbstractRegistryFactory.getServiceDiscoveries;
  import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;
@@@ -160,47 -158,46 +161,50 @@@ public final class DubboBootstrap 
  
      private final ExecutorService executorService = newSingleThreadExecutor();
  
 -    private final ExecutorRepository executorRepository = getExtensionLoader(ExecutorRepository.class).getDefaultExtension();
 +    private ExecutorRepository executorRepository;
 +
 +    private final ApplicationModel applicationModel;
  
-     private final ConfigManager configManager;
+     protected ScheduledFuture<?> asyncMetadataFuture;
  
-     private final Environment environment;
+     protected final ConfigManager configManager;
  
-     private ReferenceConfigCache cache;
+     protected final Environment environment;
  
-     private AtomicBoolean initialized = new AtomicBoolean(false);
+     protected ReferenceConfigCache cache;
  
-     private AtomicBoolean started = new AtomicBoolean(false);
+     protected AtomicBoolean initialized = new AtomicBoolean(false);
  
-     private AtomicBoolean startup = new AtomicBoolean(true);
+     protected AtomicBoolean started = new AtomicBoolean(false);
  
-     private AtomicBoolean destroyed = new AtomicBoolean(false);
+     protected AtomicBoolean startup = new AtomicBoolean(true);
  
-     private AtomicBoolean shutdown = new AtomicBoolean(false);
+     protected AtomicBoolean destroyed = new AtomicBoolean(false);
  
-     private volatile boolean isCurrentlyInStart = false;
+     protected AtomicBoolean shutdown = new AtomicBoolean(false);
  
-     private volatile ServiceInstance serviceInstance;
+     protected volatile boolean isCurrentlyInStart = false;
  
-     private volatile MetadataService metadataService;
+     protected volatile ServiceInstance serviceInstance;
  
-     private volatile MetadataServiceExporter metadataServiceExporter;
+     protected volatile MetadataService metadataService;
  
-     private List<ServiceConfigBase<?>> exportedServices = new ArrayList<>();
+     protected volatile MetadataServiceExporter metadataServiceExporter;
  
-     private final List<CompletableFuture<?>> asyncExportingFutures = new ArrayList<>();
+     protected List<ServiceConfigBase<?>> exportedServices = new ArrayList<>();
  
-     private final List<CompletableFuture<?>> asyncReferringFutures = new ArrayList<>();
+     protected final List<CompletableFuture<?>> asyncExportingFutures = new ArrayList<>();
  
-     private boolean asyncExportFinish = true;
+     protected final List<CompletableFuture<?>> asyncReferringFutures = new ArrayList<>();
  
-     private boolean asyncReferFinish = true;
 -    protected volatile boolean asyncExportFinish = true;
++    protected boolean asyncExportFinish = true;
+ 
+     protected volatile boolean asyncReferFinish = true;
+ 
+     protected static boolean ignoreConfigState;
  
-     private static boolean ignoreConfigState;
 +    private Module currentModule;
 +
      /**
       * See {@link ApplicationModel} and {@link ExtensionLoader} for why DubboBootstrap is designed to be singleton.
       */
@@@ -1495,29 -1451,38 +1512,34 @@@
      }
  
      private void referServices() {
 -        if (cache == null) {
 -            cache = ReferenceConfigCache.getCache();
 -        }
 -
          configManager.getReferences().forEach(rc -> {
-             // TODO, compatible with  ReferenceConfig.refer()
-             ReferenceConfig<?> referenceConfig = (ReferenceConfig<?>) rc;
-             referenceConfig.setBootstrap(this);
-             if (!referenceConfig.isRefreshed()) {
-                 referenceConfig.refresh();
-             }
- 
-             if (rc.shouldInit()) {
-                 if (rc.shouldReferAsync()) {
-                     ExecutorService executor = executorRepository.getServiceReferExecutor();
-                     CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
-                         try {
-                             cache.get(rc);
-                         } catch (Throwable t) {
-                             logger.error("refer async catch error : " + t.getMessage(), t);
-                         }
-                     }, executor);
+             try {
+                 // TODO, compatible with  ReferenceConfig.refer()
+                 ReferenceConfig<?> referenceConfig = (ReferenceConfig<?>) rc;
+                 referenceConfig.setBootstrap(this);
+                 if (!referenceConfig.isRefreshed()) {
+                     referenceConfig.refresh();
+                 }
  
-                     asyncReferringFutures.add(future);
-                 } else {
-                     cache.get(rc);
+                 if (rc.shouldInit()) {
+                     if (rc.shouldReferAsync()) {
+                         ExecutorService executor = executorRepository.getServiceReferExecutor();
+                         CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                             try {
+                                 cache.get(rc);
+                             } catch (Throwable t) {
+                                 logger.error("refer async catch error : " + t.getMessage(), t);
+                             }
+                         }, executor);
+ 
+                         asyncReferringFutures.add(future);
+                     } else {
+                         cache.get(rc);
+                     }
                  }
+             } catch (Throwable t) {
+                 logger.error("refer catch error", t);
+                 cache.destroy(rc);
              }
          });
      }
@@@ -1550,10 -1519,10 +1572,10 @@@
              registered = false;
              logger.error("Register instance error", e);
          }
 -        if(registered){
 +        if (registered) {
              // scheduled task for updating Metadata and ServiceInstance
-             executorRepository.nextScheduledExecutor().scheduleAtFixedRate(() -> {
+             asyncMetadataFuture = executorRepository.nextScheduledExecutor().scheduleAtFixedRate(() -> {
 -                InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();
 +                InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension(applicationModel);
                  localMetadataService.blockUntilUpdated();
                  try {
                      ServiceInstanceMetadataUtils.refreshMetadataAndInstance(serviceInstance);
@@@ -1566,34 -1535,6 +1588,35 @@@
          }
      }
  
 +    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.");
 +            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 (serviceInstance != null) {
              getServiceDiscoveries().forEach(serviceDiscovery -> {
diff --cc dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
index ece4e47,45841ad..84a9807
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
@@@ -22,10 -30,21 +30,22 @@@ import org.apache.dubbo.config.annotati
  import org.apache.dubbo.config.annotation.Reference;
  import org.apache.dubbo.config.api.DemoService;
  import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+ import org.apache.dubbo.config.context.ConfigManager;
  import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
+ 
+ import org.apache.dubbo.metadata.report.MetadataReport;
+ import org.apache.dubbo.metadata.report.MetadataReportInstance;
+ import org.apache.dubbo.rpc.Exporter;
+ import org.apache.dubbo.rpc.ProxyFactory;
+ import org.apache.dubbo.rpc.listener.ListenerInvokerWrapper;
  import org.apache.dubbo.rpc.model.ApplicationModel;
 +
  import org.apache.curator.test.TestingServer;
+ import org.apache.dubbo.rpc.model.ConsumerModel;
+ import org.apache.dubbo.rpc.model.ServiceMetadata;
+ import org.apache.dubbo.rpc.model.ServiceRepository;
+ import org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker;
+ import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;
  import org.junit.jupiter.api.AfterEach;
  import org.junit.jupiter.api.Assertions;
  import org.junit.jupiter.api.BeforeEach;
diff --cc dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/JavaConfigBeanTest.java
index b3ccfdd,43be931..2f216c0
--- 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
@@@ -28,12 -28,10 +28,12 @@@ import org.apache.dubbo.config.context.
  import org.apache.dubbo.config.spring.api.DemoService;
  import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  import org.apache.dubbo.config.spring.impl.DemoServiceImpl;
- import org.apache.dubbo.config.spring.registrycenter.DefaultSingleRegistryCenter;
- import org.apache.dubbo.config.spring.registrycenter.SingleRegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
  import org.apache.dubbo.rpc.Constants;
  import org.apache.dubbo.rpc.model.ApplicationModel;
 +
 +import org.junit.jupiter.api.AfterAll;
  import org.junit.jupiter.api.AfterEach;
  import org.junit.jupiter.api.Assertions;
  import org.junit.jupiter.api.BeforeAll;
diff --cc dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigTest.java
index d934565,666e0f1..4c309df
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigTest.java
@@@ -23,11 -23,12 +23,12 @@@ import org.apache.dubbo.config.MonitorC
  import org.apache.dubbo.config.ProtocolConfig;
  import org.apache.dubbo.config.ProviderConfig;
  import org.apache.dubbo.config.RegistryConfig;
 -
  import org.apache.dubbo.config.bootstrap.DubboBootstrap;
  import org.apache.dubbo.config.context.ConfigManager;
- import org.apache.dubbo.config.spring.registrycenter.ZooKeeperServer;
+ import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.ZookeeperMultipleRegistryCenter;
  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 --cc dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue7003/Issue7003Test.java
index 72bb370,869770b..e5714d4
--- 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
@@@ -22,10 -22,9 +22,10 @@@ import org.apache.dubbo.config.bootstra
  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.registrycenter.DefaultSingleRegistryCenter;
- import org.apache.dubbo.config.spring.registrycenter.SingleRegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
  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 --cc dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
index 7fdb76d,f93bf06..73ca355
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
@@@ -24,19 -24,17 +24,21 @@@ import org.apache.dubbo.config.spring.R
  import org.apache.dubbo.config.spring.api.DemoService;
  import org.apache.dubbo.config.spring.api.HelloService;
  import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 -import org.apache.dubbo.config.spring.extension.SpringExtensionFactory;
 +import org.apache.dubbo.config.spring.extension.SpringExtensionInjector;
  import org.apache.dubbo.config.spring.impl.HelloServiceImpl;
  import org.apache.dubbo.config.spring.reference.ReferenceBeanBuilder;
 +import org.apache.dubbo.config.spring.registrycenter.ZooKeeperServer;
+ import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.ZookeeperMultipleRegistryCenter;
  import org.apache.dubbo.rpc.service.GenericException;
  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.Test;
 +import org.junit.jupiter.api.BeforeAll;
  import org.junit.jupiter.api.BeforeEach;
 -import org.junit.jupiter.api.AfterEach;
 +import org.junit.jupiter.api.Test;
  import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
@@@ -62,14 -52,15 +56,17 @@@ public class JavaConfigReferenceBeanTes
  
      @BeforeEach
      public void setUp() {
+         multipleRegistryCenter = new ZookeeperMultipleRegistryCenter();
+         multipleRegistryCenter.startup();
          DubboBootstrap.reset();
 +        SpringExtensionInjector.clearContexts();
      }
  
      @AfterEach
      public void tearDown() {
          DubboBootstrap.reset();
+         multipleRegistryCenter.shutdown();
 +        SpringExtensionInjector.clearContexts();
      }
  
      @Test
diff --cc dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
index c63b09a1,08040ee..9484ebd
--- 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
@@@ -50,16 -49,18 +50,19 @@@ public class MetadataReportInstance 
          if (METADATA_REPORT_KEY.equals(url.getProtocol())) {
              String protocol = url.getParameter(METADATA_REPORT_KEY, DEFAULT_DIRECTORY);
              url = URLBuilder.from(url)
 -                .setProtocol(protocol)
 -                .removeParameter(METADATA_REPORT_KEY)
 -                .build();
 +                    .setProtocol(protocol)
 +                    .setScopeModel(config.getScopeModel())
 +                    .removeParameter(METADATA_REPORT_KEY)
 +                    .build();
          }
 -        url = url.addParameterIfAbsent(APPLICATION_KEY, ApplicationModel.getApplicationConfig().getName());
 +        url = url.addParameterIfAbsent(APPLICATION_KEY, applicationModel.getCurrentConfig().getName());
          String relatedRegistryId = config.getRegistry() == null ? DEFAULT_KEY : config.getRegistry();
 -//        RegistryConfig registryConfig = ApplicationModel.getConfigManager().getRegistry(relatedRegistryId)
 +//        RegistryConfig registryConfig = applicationModel.getConfigManager().getRegistry(relatedRegistryId)
  //                .orElseThrow(() -> new IllegalStateException("Registry id " + relatedRegistryId + " does not exist."));
-         metadataReports.put(relatedRegistryId, metadataReportFactory.getMetadataReport(url));
+         MetadataReport metadataReport = metadataReportFactory.getMetadataReport(url);
+         if (metadataReport != null) {
+             metadataReports.put(relatedRegistryId, metadataReport);
+         }
          init.set(true);
      }
  
@@@ -80,9 -81,9 +83,9 @@@
      }
  
  
 -    private static void checkInit() {
 +    private void checkInit() {
          if (!init.get()) {
-             throw new IllegalStateException("the metadata report was not inited.");
+             throw new IllegalStateException("the metadata report was not initialized.");
          }
      }
  
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
index e5fa427,e6b5923..bfdc191
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
@@@ -29,9 -27,8 +29,10 @@@ import java.util.Objects
  import java.util.SortedMap;
  import java.util.TreeMap;
  
 +import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;
 +import static org.apache.dubbo.common.constants.CommonConstants.SCOPE_MODEL;
  import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.ENDPOINTS;
+ import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.EXPORTED_SERVICES_REVISION_PROPERTY_NAME;
  
  /**
   * The default implementation of {@link ServiceInstance}.
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
index 44357c7,8aca204..1eaa2dd
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
@@@ -102,9 -87,16 +87,16 @@@ public class ServiceDiscoveryRegistry i
      public ServiceDiscoveryRegistry(URL registryURL) {
          this.registryURL = registryURL;
          this.serviceDiscovery = createServiceDiscovery(registryURL);
 -        this.writableMetadataService = WritableMetadataService.getDefaultExtension();
 +        this.writableMetadataService = WritableMetadataService.getDefaultExtension(registryURL.getScopeModel());
      }
  
+     // Currently for test purpose
+     protected ServiceDiscoveryRegistry(URL registryURL, ServiceDiscovery serviceDiscovery, WritableMetadataService writableMetadataService) {
+         this.registryURL = registryURL;
+         this.serviceDiscovery = serviceDiscovery;
+         this.writableMetadataService = writableMetadataService;
+     }
+ 
      public ServiceDiscovery getServiceDiscovery() {
          return serviceDiscovery;
      }
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
index ba4f958,bf982dc..108292a
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
@@@ -60,12 -61,24 +62,29 @@@ public class ServiceDiscoveryRegistryDi
      private volatile boolean enableConfigurationListen = true;
      private volatile List<URL> originalUrls = null; // initial for null
      private volatile Map<String, String> overrideQueryMap;
+     private volatile Map<String, String> consumerFirstQueryMap;
 +    private final ApplicationModel applicationModel;
  
      public ServiceDiscoveryRegistryDirectory(Class<T> serviceType, URL url) {
          super(serviceType, url);
 +        applicationModel = getApplicationModel(url.getScopeModel());
 +        consumerConfigurationListener = new ConsumerConfigurationListener(applicationModel);
++
+         Set<ProviderFirstParams> providerFirstParams = ExtensionLoader.getExtensionLoader(ProviderFirstParams.class).getSupportedExtensionInstances();
+         if (CollectionUtils.isEmpty(providerFirstParams)) {
+             consumerFirstQueryMap = queryMap;
+         } else {
+             consumerFirstQueryMap = new HashMap<>(queryMap);
+             for (ProviderFirstParams paramsFilter : providerFirstParams) {
+                 if (paramsFilter.params() == null) {
+                     break;
+                 }
+                 for (String keyToRemove : paramsFilter.params()) {
+                     consumerFirstQueryMap.remove(keyToRemove);
+                 }
+             }
+         }
++
      }
  
      @Override
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java
index 4a63368,018d665..c963b72
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java
@@@ -29,10 -29,8 +29,9 @@@ import org.apache.dubbo.metadata.report
  import org.apache.dubbo.metadata.report.MetadataReportInstance;
  import org.apache.dubbo.registry.client.RegistryClusterIdentifier;
  import org.apache.dubbo.rpc.model.ApplicationModel;
 +import org.apache.dubbo.rpc.model.ScopeModelAware;
  
  import java.util.Collections;
- import java.util.LinkedHashSet;
  import java.util.List;
  import java.util.Set;
  
@@@ -46,77 -45,63 +45,70 @@@ public class MetadataServiceNameMappin
      private static final List<String> IGNORED_SERVICE_INTERFACES = Collections.singletonList(MetadataService.class.getName());
  
      private static final int CAS_RETRY_TIMES = 6;
 +    private MetadataReportInstance metadataReportInstance;
  
      @Override
-     public void map(URL url) {
-         execute(() -> {
+     public boolean map(URL url) {
 -        if (CollectionUtils.isEmpty(ApplicationModel.getConfigManager().getMetadataConfigs())) {
 -            return false;
 -        }
 -        String serviceInterface = url.getServiceInterface();
 -        if (IGNORED_SERVICE_INTERFACES.contains(serviceInterface)) {
 -            return false;
 -        }
 -        String registryCluster = getRegistryCluster(url);
 -        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);
 -
 -        if (metadataReport.registerServiceAppMapping(serviceInterface, getName(), url)) {
 -            // MetadataReport support directly register service-app mapping
 -            return true;
 -        }
 +            if (CollectionUtils.isEmpty(applicationModel.getApplicationConfigManager().getMetadataConfigs())) {
-                 return;
++                return false;
 +            }
 +            String serviceInterface = url.getServiceInterface();
 +            if (IGNORED_SERVICE_INTERFACES.contains(serviceInterface)) {
-                 return;
++                return false;
 +            }
 +            String registryCluster = getRegistryCluster(url);
 +            MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryCluster);
  
 -        int currentRetryTimes = 1;
 -        boolean succeeded = false;
 -        String newConfigContent = getName();
 -        do {
 -            ConfigItem configItem = metadataReport.getConfigItem(serviceInterface, DEFAULT_MAPPING_GROUP);
 -            String oldConfigContent = configItem.getContent();
 -            if (StringUtils.isNotEmpty(oldConfigContent)) {
 -                boolean contains = StringUtils.isContains(oldConfigContent, getName());
 -                if (contains) {
 -                    break;
 -                }
 -                newConfigContent = oldConfigContent + COMMA_SEPARATOR + getName();
 +            String appName = applicationModel.getApplicationName();
 +            if (metadataReport.registerServiceAppMapping(serviceInterface, appName, url)) {
 +                // MetadataReport support directly register service-app mapping
-                 return;
++                return true;
              }
 -            succeeded = metadataReport.registerServiceAppMapping(serviceInterface, DEFAULT_MAPPING_GROUP, newConfigContent, configItem.getTicket());
 -        } while (!succeeded && currentRetryTimes++ <= CAS_RETRY_TIMES);
  
 -        if (!succeeded) {
 +            int currentRetryTimes = 1;
-             boolean success;
++            boolean succeeded = false;
 +            String newConfigContent = appName;
 +            do {
 +                ConfigItem configItem = metadataReport.getConfigItem(serviceInterface, DEFAULT_MAPPING_GROUP);
 +                String oldConfigContent = configItem.getContent();
 +                if (StringUtils.isNotEmpty(oldConfigContent)) {
 +                    boolean contains = StringUtils.isContains(oldConfigContent, appName);
 +                    if (contains) {
 +                        break;
 +                    }
 +                    newConfigContent = oldConfigContent + COMMA_SEPARATOR + appName;
 +                }
-                 success = metadataReport.registerServiceAppMapping(serviceInterface, DEFAULT_MAPPING_GROUP, newConfigContent, configItem.getTicket());
-             } while (!success && currentRetryTimes++ <= CAS_RETRY_TIMES);
-         });
++                succeeded = metadataReport.registerServiceAppMapping(serviceInterface, DEFAULT_MAPPING_GROUP, newConfigContent, configItem.getTicket());
++            } while (!succeeded && currentRetryTimes++ <= CAS_RETRY_TIMES);
++            if (!succeeded) {
+             throw new RuntimeException();
+         }
+ 
+         return true;
      }
  
      @Override
      public Set<String> get(URL url) {
-         Set<String> serviceNames = new LinkedHashSet<>();
-         execute(() -> {
-             String serviceInterface = url.getServiceInterface();
-             String registryCluster = getRegistryCluster(url);
-             MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryCluster);
-             Set<String> apps = metadataReport.getServiceAppMapping(serviceInterface, url);
-             serviceNames.addAll(apps);
-         });
-         return serviceNames;
+         String serviceInterface = url.getServiceInterface();
+         String registryCluster = getRegistryCluster(url);
 -        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);
++        MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryCluster);
+         return metadataReport.getServiceAppMapping(serviceInterface, url);
      }
  
      @Override
      public Set<String> getAndListen(URL url, MappingListener mappingListener) {
-         Set<String> serviceNames = new LinkedHashSet<>();
-         execute(() -> {
-             String serviceInterface = url.getServiceInterface();
-             String registryCluster = getRegistryCluster(url);
-             MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryCluster);
-             Set<String> apps = metadataReport.getServiceAppMapping(serviceInterface, mappingListener, url);
-             serviceNames.addAll(apps);
-         });
-         return serviceNames;
+         String serviceInterface = url.getServiceInterface();
+         String registryCluster = getRegistryCluster(url);
 -        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);
++        MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryCluster);
+         return metadataReport.getServiceAppMapping(serviceInterface, mappingListener, url);
      }
  
 +    @Override
 +    public void setApplicationModel(ApplicationModel applicationModel) {
 +        super.setApplicationModel(applicationModel);
 +        metadataReportInstance = applicationModel.getBeanFactory().getBean(MetadataReportInstance.class);
 +    }
 +
      protected String getRegistryCluster(URL url) {
          String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);
          if (registryCluster == null) {
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
index cc0f612,b3d6efb..ea0723c
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
@@@ -40,14 -58,12 +58,14 @@@ public class ServiceInstanceMetadataCus
  
      @Override
      public void customize(ServiceInstance serviceInstance) {
 -        ExtensionLoader<MetadataParamsFilter> loader = ExtensionLoader.getExtensionLoader(MetadataParamsFilter.class);
 +        ApplicationModel applicationModel = serviceInstance.getApplicationModel();
 +        ExtensionLoader<MetadataParamsFilter> loader = applicationModel.getExtensionLoader(MetadataParamsFilter.class);
 +        Set<MetadataParamsFilter> paramsFilters = loader.getSupportedExtensionInstances();
  
          InMemoryWritableMetadataService localMetadataService
 -                = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();
 +                = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension(applicationModel);
          // pick the first interface metadata available.
-         // FIXME, check the same key in different urls has the same value
+         // FIXME, check the same key in different urls have the same value
          Map<String, MetadataInfo> metadataInfos = localMetadataService.getMetadataInfos();
          if (CollectionUtils.isEmptyMap(metadataInfos)) {
              return;
@@@ -57,19 -73,19 +75,19 @@@
              return;
          }
          MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServices().values().iterator().next();
-         Map<String, String> allParams = new HashMap<>(serviceInfo.getUrl().getParameters());
+         URL url = serviceInfo.getUrl();
+         List<MetadataParamsFilter> paramsFilters = loader.getActivateExtension(url, "params-filter");
+         Map<String, String> allParams = new HashMap<>(url.getParameters());
  
          // load instance params users want to load.
-         // TODO, duplicate logic with that in ApplicationConfig
+         // TODO, duplicate snippet in ApplicationConfig
+         Map<String, String> extraParameters = Collections.emptyMap();
 -        Set<InfraAdapter> adapters = ExtensionLoader.getExtensionLoader(InfraAdapter.class).getSupportedExtensionInstances();
 +        Set<InfraAdapter> adapters = applicationModel.getExtensionLoader(InfraAdapter.class).getSupportedExtensionInstances();
          if (CollectionUtils.isNotEmpty(adapters)) {
              Map<String, String> inputParameters = new HashMap<>();
 -            inputParameters.put(APPLICATION_KEY, ApplicationModel.getName());
 +            inputParameters.put(APPLICATION_KEY, applicationModel.getApplicationName());
              for (InfraAdapter adapter : adapters) {
-                 Map<String, String> extraParameters = adapter.getExtraAttributes(inputParameters);
-                 if (CollectionUtils.isNotEmptyMap(extraParameters)) {
-                     extraParameters.forEach(allParams::putIfAbsent);
-                 }
+                 extraParameters = adapter.getExtraAttributes(inputParameters);
              }
          }
  
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java
index 8cafaac,5c0e8ea..ddf4bd2
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java
@@@ -285,6 -292,13 +292,13 @@@ public class ServiceInstanceMetadataUti
          });
      }
  
+     private static void reportMetadataToRemote(ServiceInstance serviceInstance) {
+         if (REMOTE_METADATA_STORAGE_TYPE.equalsIgnoreCase(getMetadataStorageType(serviceInstance))) {
 -            RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();
 -            remoteMetadataService.publishMetadata(serviceInstance.getServiceName());
++            RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService(serviceInstance.getApplicationModel());
++            remoteMetadataService.publishMetadata(serviceInstance.getApplicationModel().getApplicationName());
+         }
+     }
+ 
      /**
       * Set the default parameters via the specified {@link URL providerURL}
       *
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java
index 4026103,ddbb163..4cd2618
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java
@@@ -75,9 -74,9 +75,9 @@@ import static org.apache.dubbo.rpc.Cons
   * @see WritableMetadataService
   * @since 2.7.5
   */
 -public class InMemoryWritableMetadataService implements WritableMetadataService {
 +public class InMemoryWritableMetadataService implements WritableMetadataService, ScopeModelAware {
  
-     final Logger logger = LoggerFactory.getLogger(getClass());
+     Logger logger = LoggerFactory.getLogger(getClass());
  
      private final Lock lock = new ReentrantLock();
  
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleListener.java
index 0299761,7c76b38..2a5dbf2
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleListener.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleListener.java
@@@ -47,15 -48,25 +49,25 @@@ import java.util.concurrent.atomic.Atom
  
  import static org.apache.dubbo.common.constants.RegistryConstants.INIT;
  
+ /**
+  * Listens to {@MigrationRule} from Config Center.
+  *
+  * - Migration rule is of consumer application scope.
+  * - Listener is shared among all invokers (interfaces), it keeps the relation between interface and handler.
+  *
+  * There're two execution points:
+  * - Refer, invoker behaviour is determined with default rule.
+  * - Rule change, invoker behaviour is changed according to the newly received rule.
+  */
  @Activate
 -public class MigrationRuleListener implements RegistryProtocolListener, ConfigurationListener {
 +public class MigrationRuleListener implements RegistryProtocolListener, ConfigurationListener, ScopeModelAware {
      private static final Logger logger = LoggerFactory.getLogger(MigrationRuleListener.class);
      private static final String DUBBO_SERVICEDISCOVERY_MIGRATION = "DUBBO_SERVICEDISCOVERY_MIGRATION";
      private static final String MIGRATION_DELAY_KEY = "dubbo.application.migration.delay";
 -    private final String RULE_KEY = ApplicationModel.getName() + ".migration";
 +    private String ruleKey;
  
-     private final Map<MigrationInvoker, MigrationRuleHandler> handlers = new ConcurrentHashMap<>();
-     private final LinkedBlockingQueue<String> ruleQueue = new LinkedBlockingQueue<>();
+     protected final Map<MigrationInvoker, MigrationRuleHandler> handlers = new ConcurrentHashMap<>();
+     protected final LinkedBlockingQueue<String> ruleQueue = new LinkedBlockingQueue<>();
  
      private final AtomicBoolean executorSubmit = new AtomicBoolean(false);
      private final ExecutorService ruleManageExecutor = Executors.newFixedThreadPool(1, new NamedThreadFactory("Dubbo-Migration-Listener"));
@@@ -95,9 -98,9 +110,9 @@@
              setRawRule(INIT);
          }
  
 -        String localRawRule = ApplicationModel.getEnvironment().getLocalMigrationRule();
 +        String localRawRule = applicationModel.getApplicationEnvironment().getLocalMigrationRule();
          if (!StringUtils.isEmpty(localRawRule)) {
-             Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("DubboMigrationRuleDelayWorker", true))
+             localRuleMigrationFuture = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("DubboMigrationRuleDelayWorker", true))
                  .schedule(() -> {
                      if (this.rawRule.equals(INIT)) {
                          this.process(new ConfigChangedEvent(null, null, localRawRule));
@@@ -226,8 -229,14 +241,14 @@@
      @Override
      public void onDestroy() {
          if (configuration != null) {
 -            configuration.removeListener(RULE_KEY, this);
 +            configuration.removeListener(ruleKey, this);
          }
+         if (ruleMigrationFuture != null) {
+             ruleMigrationFuture.cancel(true);
+         }
+         if (localRuleMigrationFuture != null) {
+             localRuleMigrationFuture.cancel(true);
+         }
      }
  
      public Map<MigrationInvoker, MigrationRuleHandler> getHandlers() {
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
index 9651696,a6997b0..25543bc
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
@@@ -854,14 -817,14 +867,16 @@@ public class RegistryProtocol implement
                  logger.warn(t.getMessage(), t);
              }
              try {
-                 Map<URL, NotifyListener> overrideListeners = getProviderConfigurationListener(subscribeUrl).getOverrideListeners();
-                 NotifyListener listener = overrideListeners.remove(registerUrl);
-                 registry.unsubscribe(subscribeUrl, listener);
-                 ApplicationModel applicationModel = getApplicationModel(registerUrl.getScopeModel());
-                 if (applicationModel.getApplicationEnvironment().getConfiguration().convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true)) {
-                     applicationModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
-                         .removeListener(subscribeUrl.getServiceKey() + CONFIGURATORS_SUFFIX,
-                             serviceConfigurationListeners.remove(subscribeUrl.getServiceKey()));
+                 if (subscribeUrl != null) {
 -                    NotifyListener listener = RegistryProtocol.this.overrideListeners.remove(subscribeUrl);
++                    Map<URL, NotifyListener> overrideListeners = getProviderConfigurationListener(subscribeUrl).getOverrideListeners();
++                    NotifyListener listener = overrideListeners.remove(registerUrl);
+                     registry.unsubscribe(subscribeUrl, listener);
 -                    if (ApplicationModel.getEnvironment().getConfiguration().convert(Boolean.class, org.apache.dubbo.registry.Constants.ENABLE_CONFIGURATION_LISTEN, true)) {
 -                        ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
++                    ApplicationModel applicationModel = getApplicationModel(registerUrl.getScopeModel());
++                    if (applicationModel.getApplicationEnvironment().getConfiguration().convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true)) {
++                        applicationModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
+                             .removeListener(subscribeUrl.getServiceKey() + CONFIGURATORS_SUFFIX,
 -                                serviceConfigurationListeners.get(subscribeUrl.getServiceKey()));
++                                serviceConfigurationListeners.remove(subscribeUrl.getServiceKey()));
+                     }
                  }
              } catch (Throwable t) {
                  logger.warn(t.getMessage(), t);
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
index e8ce4f4,bd8c062..e13d29d
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
@@@ -31,8 -32,7 +32,6 @@@ import org.apache.dubbo.common.utils.Co
  import org.apache.dubbo.common.utils.StringUtils;
  import org.apache.dubbo.common.utils.UrlUtils;
  import org.apache.dubbo.registry.NotifyListener;
- import org.apache.dubbo.rpc.model.ScopeModel;
- import org.apache.dubbo.rpc.model.ScopeModelUtil;
 -import org.apache.dubbo.registry.ProviderFirstParams;
  
  import java.util.ArrayList;
  import java.util.Collection;
diff --cc dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
index 2b65cb9,7369c27..13fde8e
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
@@@ -38,9 -40,17 +42,16 @@@ public class DefaultServiceInstanceTes
      public DefaultServiceInstance instance;
  
      public static DefaultServiceInstance createInstance() {
-         DefaultServiceInstance instance = new DefaultServiceInstance("A", "127.0.0.1", 8080, ApplicationModel.defaultModel());
-         instance.getMetadata().put("dubbo.metadata-service.urls", "[ \"dubbo://192.168.0.102:20881/com.alibaba.cloud.dubbo.service.DubboMetadataService?anyhost=true&application=spring-cloud-alibaba-dubbo-provider&bind.ip=192.168.0.102&bind.port=20881&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=spring-cloud-alibaba-dubbo-provider&interface=com.alibaba.cloud.dubbo.service.DubboMetadataService&methods=getAllServiceKeys,getServiceRestMetadata,getExportedURLs,getAllExported [...]
-         instance.getMetadata().put("dubbo.metadata-service.url-params", "{\"dubbo\":{\"application\":\"dubbo-provider-demo\",\"deprecated\":\"false\",\"group\":\"dubbo-provider-demo\",\"version\":\"1.0.0\",\"timestamp\":\"1564845042651\",\"dubbo\":\"2.0.2\",\"provider.host\":\"192.168.0.102\",\"provider.port\":\"20880\"}}");
 -        DefaultServiceInstance instance = new DefaultServiceInstance("A", "127.0.0.1", 20880);
++        DefaultServiceInstance instance = new DefaultServiceInstance("A", "127.0.0.1", 20880, ApplicationModel.defaultModel());
+         Map<String, String> metadata = instance.getMetadata();
+         metadata.put(METADATA_STORAGE_TYPE_PROPERTY_NAME, "remote");
+         metadata.put(EXPORTED_SERVICES_REVISION_PROPERTY_NAME, "111");
+         metadata.put("site", "dubbo");
+ 
+         Map<String, Integer> protocolPorts = new HashMap<>();
+         protocolPorts.put("rest", 8080);
+         protocolPorts.put("dubbo", 20880);
+         setEndpoints(instance, protocolPorts);
 -
          return instance;
      }
  
diff --cc dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/MigrationRuleListenerTest.java
index c2bde4b,10e8703..406b85d
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/MigrationRuleListenerTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/MigrationRuleListenerTest.java
@@@ -25,32 -29,60 +29,61 @@@ import org.mockito.ArgumentCaptor
  import org.mockito.Mockito;
  
  public class MigrationRuleListenerTest {
+ 
+     private String localRule = "key: demo-consumer\n" +
+         "step: APPLICATION_FIRST\n" +
+         "threshold: 1.0\n" +
+         "proportion: 60\n" +
+         "delay: 60\n" +
+         "force: false\n" +
+         "interfaces:\n" +
+         "  - serviceKey: DemoService:1.0.0\n" +
+         "    threshold: 0.5\n" +
+         "    proportion: 30\n" +
+         "    delay: 30\n" +
+         "    force: true\n" +
+         "    step: APPLICATION_FIRST\n" +
+         "  - serviceKey: GreetingService:1.0.0\n" +
+         "    step: FORCE_APPLICATION";
+ 
+     private String remoteRule = "key: demo-consumer\n" +
+         "step: FORCE_APPLICATION\n" +
+         "threshold: 1.0\n" +
+         "proportion: 60\n" +
+         "delay: 60\n" +
+         "force: false\n" +
+         "interfaces:\n" +
+         "  - serviceKey: DemoService:1.0.0\n" +
+         "    threshold: 0.5\n" +
+         "    proportion: 30\n" +
+         "    delay: 30\n" +
+         "    force: true\n" +
+         "    step: FORCE_APPLICATION\n" +
+         "  - serviceKey: GreetingService:1.0.0\n" +
+         "    step: FORCE_INTERFACE";
+ 
+     private String dynamicRemoteRule = "key: demo-consumer\n" +
+         "step: APPLICATION_FIRST\n" +
+         "threshold: 1.0\n" +
+         "proportion: 60\n" +
+         "delay: 60\n" +
+         "force: false\n" +
+         "interfaces:\n";
+ 
+     /**
+      * Listener started with config center and local rule, no initial remote rule.
+      * Check local rule take effect
+      */
      @Test
      public void test() throws InterruptedException {
-         String rule = "key: demo-consumer\n" +
-                 "step: APPLICATION_FIRST\n" +
-                 "threshold: 1.0\n" +
-                 "proportion: 60\n" +
-                 "delay: 60\n" +
-                 "force: false\n" +
-                 "interfaces:\n" +
-                 "  - serviceKey: DemoService:1.0.0\n" +
-                 "    threshold: 0.5\n" +
-                 "    proportion: 30\n" +
-                 "    delay: 30\n" +
-                 "    force: true\n" +
-                 "    step: APPLICATION_FIRST\n" +
-                 "  - serviceKey: GreetingService:1.0.0\n" +
-                 "    step: FORCE_APPLICATION";
- 
          DynamicConfiguration dynamicConfiguration = Mockito.mock(DynamicConfiguration.class);
  
 -        ApplicationModel.getEnvironment().setDynamicConfiguration(dynamicConfiguration);
 -        ApplicationModel.getEnvironment().setLocalMigrationRule(localRule);
 +        ApplicationModel.reset();
 +        ApplicationModel.defaultModel().getApplicationEnvironment().setDynamicConfiguration(dynamicConfiguration);
-         ApplicationModel.defaultModel().getApplicationEnvironment().setLocalMigrationRule(rule);
++        ApplicationModel.defaultModel().getApplicationEnvironment().setLocalMigrationRule(localRule);
          ApplicationConfig applicationConfig = new ApplicationConfig();
          applicationConfig.setName("demo-consumer");
 -        ApplicationModel.getConfigManager().setApplication(applicationConfig);
 +        ApplicationModel.defaultModel().getApplicationConfigManager().setApplication(applicationConfig);
  
          URL consumerURL = Mockito.mock(URL.class);
          Mockito.when(consumerURL.getServiceKey()).thenReturn("Test");
@@@ -60,11 -92,11 +93,12 @@@
          MigrationRuleHandler<?> handler = Mockito.mock(MigrationRuleHandler.class, Mockito.withSettings().verboseLogging());
  
          MigrationRuleListener migrationRuleListener = new MigrationRuleListener();
+ 
          MigrationInvoker<?> migrationInvoker = Mockito.mock(MigrationInvoker.class);
          migrationRuleListener.getHandlers().put(migrationInvoker, handler);
 +        migrationRuleListener.setApplicationModel(ApplicationModel.defaultModel());
  
-         Thread.sleep(5000);
+         Thread.sleep(2000);
          Mockito.verify(handler, Mockito.timeout(5000)).doMigrate(Mockito.any());
  
          migrationRuleListener.onRefer(null, migrationInvoker, consumerURL, null);
diff --cc dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
index 1091eee,31a254a..c89ebee
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
@@@ -18,11 -18,10 +18,12 @@@ package org.apache.dubbo.registry.clien
  
  import org.apache.dubbo.common.URL;
  import org.apache.dubbo.metadata.ServiceNameMapping;
- import org.apache.dubbo.metadata.WritableMetadataService;
  
 +import org.apache.dubbo.rpc.model.ApplicationModel;
 +import org.apache.dubbo.rpc.model.ModuleModel;
  import org.junit.jupiter.api.Test;
+ import org.mockito.ArgumentMatchers;
+ import org.mockito.MockedStatic;
  import org.mockito.Mockito;
  
  import java.util.Collections;
@@@ -33,67 -42,71 +44,76 @@@ public class MigrationRuleTest 
  
      @Test
      public void test_parse() {
-         String rule = "key: demo-consumer\n" +
-             "step: APPLICATION_FIRST\n" +
-             "threshold: 1.0\n" +
-             "proportion: 60\n" +
-             "delay: 60\n" +
-             "force: false\n" +
-             "interfaces:\n" +
-             "  - serviceKey: DemoService:1.0.0\n" +
-             "    threshold: 0.5\n" +
-             "    proportion: 30\n" +
-             "    delay: 30\n" +
-             "    force: true\n" +
-             "    step: APPLICATION_FIRST\n" +
-             "  - serviceKey: GreetingService:1.0.0\n" +
-             "    step: FORCE_APPLICATION\n" +
-             "applications:\n" +
-             "  - serviceKey: TestApplication\n" +
-             "    threshold: 0.3\n" +
-             "    proportion: 20\n" +
-             "    delay: 10\n" +
-             "    force: false\n" +
-             "    step: FORCE_INTERFACE\n";
+         try (MockedStatic<ServiceNameMapping> mockStaticMapping = Mockito.mockStatic(ServiceNameMapping.class, withSettings().defaultAnswer(CALLS_REAL_METHODS))) {
+             mockStaticMapping.when(ServiceNameMapping::getDefaultExtension).thenReturn(mapping);
+             when(mapping.getServices(any())).thenReturn(Collections.emptySet());
  
-         MigrationRule migrationRule = MigrationRule.parse(rule);
-         assertEquals("demo-consumer", migrationRule.getKey());
-         assertEquals(MigrationStep.APPLICATION_FIRST, migrationRule.getStep());
-         assertEquals(1.0f, migrationRule.getThreshold());
-         assertEquals(60, migrationRule.getProportion());
-         assertEquals(60, migrationRule.getDelay());
-         assertEquals(false, migrationRule.getForce());
+             String rule = "key: demo-consumer\n" +
+                 "step: APPLICATION_FIRST\n" +
+                 "threshold: 1.0\n" +
+                 "proportion: 60\n" +
+                 "delay: 60\n" +
+                 "force: false\n" +
+                 "interfaces:\n" +
+                 "  - serviceKey: DemoService:1.0.0\n" +
+                 "    threshold: 0.5\n" +
+                 "    proportion: 30\n" +
+                 "    delay: 30\n" +
+                 "    force: true\n" +
+                 "    step: APPLICATION_FIRST\n" +
+                 "  - serviceKey: GreetingService:1.0.0\n" +
+                 "    step: FORCE_APPLICATION\n" +
+                 "applications:\n" +
+                 "  - serviceKey: TestApplication\n" +
+                 "    threshold: 0.3\n" +
+                 "    proportion: 20\n" +
+                 "    delay: 10\n" +
+                 "    force: false\n" +
+                 "    step: FORCE_INTERFACE\n";
+ 
+             MigrationRule migrationRule = MigrationRule.parse(rule);
+             assertEquals("demo-consumer", migrationRule.getKey());
+             assertEquals(MigrationStep.APPLICATION_FIRST, migrationRule.getStep());
+             assertEquals(1.0f, migrationRule.getThreshold());
+             assertEquals(60, migrationRule.getProportion());
+             assertEquals(60, migrationRule.getDelay());
+             assertEquals(false, migrationRule.getForce());
  
 -            URL url = Mockito.mock(URL.class);
 -            Mockito.when(url.getDisplayServiceKey()).thenReturn("DemoService:1.0.0");
 -            Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
 -            Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
 +        URL url = Mockito.mock(URL.class);
 +        ModuleModel defaultModule = ApplicationModel.defaultModel().getDefaultModule();
 +        url.setScopeModel(defaultModule);
 +        Mockito.when(url.getDisplayServiceKey()).thenReturn("DemoService:1.0.0");
++        Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
++        Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
  
-         assertEquals(migrationRule.getInterfaces().size(), 2);
+             assertEquals(migrationRule.getInterfaces().size(), 2);
  
-         assertEquals(0.5f, migrationRule.getThreshold(url));
-         assertEquals(30, migrationRule.getProportion(url));
-         assertEquals(30, migrationRule.getDelay(url));
-         assertEquals(true, migrationRule.getForce(url));
-         assertEquals(MigrationStep.APPLICATION_FIRST, migrationRule.getStep(url));
+             assertEquals(0.5f, migrationRule.getThreshold(url));
+             assertEquals(30, migrationRule.getProportion(url));
+             assertEquals(30, migrationRule.getDelay(url));
+             assertEquals(true, migrationRule.getForce(url));
+             assertEquals(MigrationStep.APPLICATION_FIRST, migrationRule.getStep(url));
  
-         Mockito.when(url.getDisplayServiceKey()).thenReturn("GreetingService:1.0.0");
-         assertEquals(1.0f, migrationRule.getThreshold(url));
-         assertEquals(60, migrationRule.getProportion(url));
-         assertEquals(60, migrationRule.getDelay(url));
-         assertEquals(false, migrationRule.getForce(url));
-         assertEquals(MigrationStep.FORCE_APPLICATION, migrationRule.getStep(url));
+             Mockito.when(url.getDisplayServiceKey()).thenReturn("GreetingService:1.0.0");
+             assertEquals(1.0f, migrationRule.getThreshold(url));
+             assertEquals(60, migrationRule.getProportion(url));
+             assertEquals(60, migrationRule.getDelay(url));
+             assertEquals(false, migrationRule.getForce(url));
+             assertEquals(MigrationStep.FORCE_APPLICATION, migrationRule.getStep(url));
  
 -            Mockito.when(url.getDisplayServiceKey()).thenReturn("GreetingService:1.0.1");
 -            Mockito.when(url.getServiceInterface()).thenReturn("GreetingService");
 -            Set<String> services =  new HashSet<>();
 -            services.add("TestApplication");
 -            when(mapping.getServices(any())).thenReturn(services);
 -            assertEquals(0.3f, migrationRule.getThreshold(url));
 -            assertEquals(20, migrationRule.getProportion(url));
 -            assertEquals(10, migrationRule.getDelay(url));
 -            assertEquals(false, migrationRule.getForce(url));
 -            assertEquals(MigrationStep.FORCE_INTERFACE, migrationRule.getStep(url));
 -        }
 +        Mockito.when(url.getDisplayServiceKey()).thenReturn("GreetingService:1.0.1");
 +        Mockito.when(url.getServiceInterface()).thenReturn("GreetingService");
 +        WritableMetadataService metadataService = WritableMetadataService.getDefaultExtension(defaultModule);
 +        metadataService.putCachedMapping(ServiceNameMapping.buildMappingKey(url), Collections.singleton("TestApplication"));
++
++        Set<String> services =  new HashSet<>();
++        services.add("TestApplication");
++        when(mapping.getServices(any())).thenReturn(services);
 +        assertEquals(0.3f, migrationRule.getThreshold(url));
 +        assertEquals(20, migrationRule.getProportion(url));
 +        assertEquals(10, migrationRule.getDelay(url));
 +        assertEquals(false, migrationRule.getForce(url));
 +        assertEquals(MigrationStep.FORCE_INTERFACE, migrationRule.getStep(url));
- 
 +        metadataService.removeCachedMapping("GreetingService");
      }
  }
diff --cc dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java
index 934ed20,e82b2b6..448ab72
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java
@@@ -23,8 -23,8 +23,9 @@@ import org.apache.dubbo.metadata.Writab
  import org.apache.dubbo.registry.NotifyListener;
  import org.apache.dubbo.registry.client.ServiceDiscoveryRegistry;
  import org.apache.dubbo.rpc.model.ApplicationModel;
 +import org.apache.dubbo.rpc.model.ModuleModel;
  
+ import org.junit.jupiter.api.AfterAll;
  import org.junit.jupiter.api.BeforeEach;
  import org.junit.jupiter.api.Test;
  
@@@ -83,15 -83,17 +84,20 @@@ public class ServiceOrientedRegistryTes
  
      @BeforeEach
      public void init() {
 +        ApplicationModel applicationModel = ApplicationModel.defaultModel();
 +        ModuleModel scopeModel = applicationModel.getDefaultModule();
 +        registryURL.setScopeModel(scopeModel);
          registry = ServiceDiscoveryRegistry.create(registryURL);
 -        metadataService = WritableMetadataService.getDefaultExtension();
 +        metadataService = WritableMetadataService.getDefaultExtension(scopeModel);
          notifyListener = new MyNotifyListener();
 -        ApplicationModel.getConfigManager().setApplication(new ApplicationConfig("Test"));
 +        applicationModel.getApplicationConfigManager().setApplication(new ApplicationConfig("Test"));
      }
  
+     @AfterAll
+     public static void clearUp() {
+         ApplicationModel.reset();
+     }
+ 
      @Test
      public void testSupports() {
          assertTrue(ServiceDiscoveryRegistry.supports(registryURL));
diff --cc dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
index be0c253,67f4c89..0048ca7
--- a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
+++ b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
@@@ -104,8 -110,8 +110,8 @@@ public class NacosServiceDiscovery exte
      @Override
      public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {
          return ThrowableFunction.execute(namingService, service ->
-                 service.selectInstances(serviceName, true)
-                         .stream().map((i)->NacosNamingServiceUtils.toServiceInstance(registryURL, i))
 -                service.selectInstances(serviceName, Constants.DEFAULT_GROUP, true)
 -                        .stream().map(NacosNamingServiceUtils::toServiceInstance)
++            service.selectInstances(serviceName, Constants.DEFAULT_GROUP, true)
++                .stream().map((i)->NacosNamingServiceUtils.toServiceInstance(registryURL, i))
                          .collect(Collectors.toList())
          );
      }
diff --cc dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
index 993e02a,d9e137c..d7fd458
--- a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
+++ b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
@@@ -76,12 -84,12 +85,12 @@@ public abstract class CuratorFrameworkU
      }
  
  
 -    public static List<ServiceInstance> build(Collection<org.apache.curator.x.discovery.ServiceInstance<ZookeeperInstance>>
 -                                                  instances) {
 -        return instances.stream().map(CuratorFrameworkUtils::build).collect(Collectors.toList());
 +    public static List<ServiceInstance> build(URL registryUrl, Collection<org.apache.curator.x.discovery.ServiceInstance<ZookeeperInstance>>
-                                                       instances) {
++        instances) {
 +        return instances.stream().map((i)->build(registryUrl, i)).collect(Collectors.toList());
      }
  
 -    public static ServiceInstance build(org.apache.curator.x.discovery.ServiceInstance<ZookeeperInstance> instance) {
 +    public static ServiceInstance build(URL registryUrl, org.apache.curator.x.discovery.ServiceInstance<ZookeeperInstance> instance) {
          String name = instance.getName();
          String host = instance.getAddress();
          int port = instance.getPort();
diff --cc dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcResult.java
index 1c6a00b,05b84cb..d93d345
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcResult.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcResult.java
@@@ -118,14 -118,16 +118,17 @@@ public class DecodeableRpcResult extend
      public void decode() throws Exception {
          if (!hasDecoded && channel != null && inputStream != null) {
              try {
-                 if (ConfigurationUtils.getSystemConfiguration(channel.getUrl().getScopeModel()).getBoolean(SERIALIZATION_SECURITY_CHECK_KEY, true)) {
-                     Object serializationType_obj = invocation.get(SERIALIZATION_ID_KEY);
-                     if (serializationType_obj != null) {
-                         if ((byte) serializationType_obj != serializationType) {
-                             throw new IOException("Unexpected serialization id:" + serializationType + " received from network, please check if the peer send the right id.");
+                 if (invocation != null) {
 -                    if (ConfigurationUtils.getSystemConfiguration().getBoolean(SERIALIZATION_SECURITY_CHECK_KEY, true)) {
++                    if (ConfigurationUtils.getSystemConfiguration(channel.getUrl().getScopeModel()).getBoolean(SERIALIZATION_SECURITY_CHECK_KEY, true)) {
+                         Object serializationTypeObj = invocation.get(SERIALIZATION_ID_KEY);
+                         if (serializationTypeObj != null) {
+                             if ((byte) serializationTypeObj != serializationType) {
+                                 throw new IOException("Unexpected serialization id:" + serializationType + " received from network, please check if the peer send the right id.");
+                             }
                          }
                      }
                  }
++
                  decode(channel, inputStream);
              } catch (Throwable e) {
                  if (log.isWarnEnabled()) {

[dubbo] 04/04: Add Scope Model check

Posted by al...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0-multi-instances
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit 185a1d182cc8bb58bc15400de4ed250edbb1fd00
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Wed Sep 1 01:05:15 2021 +0800

    Add Scope Model check
---
 .../src/main/java/org/apache/dubbo/config/ServiceConfig.java   |  2 +-
 .../java/org/apache/dubbo/metadata/ServiceNameMapping.java     |  6 +++++-
 .../dubbo/registry/client/migration/model/MigrationRule.java   | 10 +++++-----
 3 files changed, 11 insertions(+), 7 deletions(-)

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 ec49581..d3f9e7d 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
@@ -253,7 +253,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         List<URL> exportedURLs = this.getExportedUrls();
         exportedURLs.forEach(url -> {
             if (url.getParameters().containsKey(SERVICE_NAME_MAPPING_KEY)) {
-                ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension();
+                ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension(getScopeModel());
                 try {
                     boolean succeeded = serviceNameMapping.map(url);
                     if (succeeded) {
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 fe5a933..96dca1a 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
@@ -56,7 +56,11 @@ public interface ServiceNameMapping {
     }
 
     static ServiceNameMapping getDefaultExtension(ScopeModel scopeModel) {
-        return scopeModel.getDefaultExtension(ServiceNameMapping.class);
+        if (scopeModel != null) {
+            return scopeModel.getDefaultExtension(ServiceNameMapping.class);
+        } else {
+            return getExtensionLoader(ServiceNameMapping.class).getDefaultExtension();
+        }
     }
 
     static String buildMappingKey(URL url) {
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/MigrationRule.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/MigrationRule.java
index 247f159..27a51fc 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/MigrationRule.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/MigrationRule.java
@@ -151,7 +151,7 @@ public class MigrationRule {
         }
 
         if (applications != null) {
-            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension();
+            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension(consumerURL.getScopeModel());
             Set<String> services = serviceNameMapping.getServices(consumerURL);
             if (CollectionUtils.isNotEmpty(services)) {
                 for (String service : services) {
@@ -192,7 +192,7 @@ public class MigrationRule {
         }
 
         if (applications != null) {
-            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension();
+            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension(consumerURL.getScopeModel());
             Set<String> services = serviceNameMapping.getServices(consumerURL);
             if (CollectionUtils.isNotEmpty(services)) {
                 for (String service : services) {
@@ -232,7 +232,7 @@ public class MigrationRule {
         }
 
         if (applications != null) {
-            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension();
+            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension(consumerURL.getScopeModel());
             Set<String> services = serviceNameMapping.getServices(consumerURL);
             if (CollectionUtils.isNotEmpty(services)) {
                 for (String service : services) {
@@ -268,7 +268,7 @@ public class MigrationRule {
         }
 
         if (applications != null) {
-            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension();
+            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension(consumerURL.getScopeModel());
             Set<String> services = serviceNameMapping.getServices(consumerURL);
             if (CollectionUtils.isNotEmpty(services)) {
                 for (String service : services) {
@@ -308,7 +308,7 @@ public class MigrationRule {
         }
 
         if (applications != null) {
-            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension();
+            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension(consumerURL.getScopeModel());
             Set<String> services = serviceNameMapping.getServices(consumerURL);
             if (CollectionUtils.isNotEmpty(services)) {
                 for (String service : services) {

[dubbo] 03/04: Fix ut

Posted by al...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0-multi-instances
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit 99e238ad0cd58cb0acaa94aa532d6bc83b1dd1fb
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Wed Sep 1 01:00:35 2021 +0800

    Fix ut
---
 .../dubbo/config/AbstractInterfaceConfig.java      |  29 +++
 .../org/apache/dubbo/config/ApplicationConfig.java |  10 +-
 .../apache/dubbo/config/ReferenceConfigBase.java   |   9 +
 .../org/apache/dubbo/config/ServiceConfigBase.java |   9 +
 .../apache/dubbo/rpc/model/ApplicationModel.java   |   4 +
 dubbo-config/dubbo-config-api/pom.xml              |   5 +
 .../org/apache/dubbo/config/ReferenceConfig.java   |   1 -
 .../dubbo/config/bootstrap/DubboBootstrap.java     |   2 +-
 .../apache/dubbo/config/ReferenceConfigTest.java   | 206 +++++++--------------
 .../bootstrap/DubboBootstrapMultiInstanceTest.java |  20 +-
 .../dubbo/config/bootstrap/DubboBootstrapTest.java |   3 +-
 ...egistryCenterExportProviderIntegrationTest.java |  10 +-
 ...egistryCenterExportProviderIntegrationTest.java |  10 +-
 .../spring/issues/issue7003/Issue7003Test.java     |   2 +-
 .../consumer/PropertyConfigurerTest.java           |   2 +-
 .../consumer2/PropertySourcesConfigurerTest.java   |   2 +-
 .../consumer3/PropertySourcesInJavaConfigTest.java |   7 +-
 .../javaconfig/JavaConfigReferenceBeanTest.java    |   3 -
 .../apache/dubbo/metadata/ServiceNameMapping.java  |   5 +
 .../registry/client/DefaultServiceInstance.java    |   1 -
 .../registry/client/ServiceDiscoveryRegistry.java  |   2 +-
 .../ServiceInstanceMetadataCustomizer.java         |   2 -
 .../registry/integration/RegistryProtocol.java     |  10 +-
 .../registry/support/AbstractRegistryFactory.java  |   2 +-
 .../support/CacheableFailbackRegistry.java         |   3 +
 .../client/DefaultServiceInstanceTest.java         |   2 +-
 .../registry/client/InstanceAddressURLTest.java    |   3 +-
 .../client/ServiceDiscoveryRegistryTest.java       |   3 +-
 .../metadata/MetadataServiceNameMappingTest.java   |   4 +-
 .../ProtocolPortsMetadataCustomizerTest.java       |   4 +-
 .../ServiceInstanceMetadataCustomizerTest.java     |   4 +-
 .../client/migration/model/MigrationRuleTest.java  |  42 +++--
 .../zookeeper/util/CuratorFrameworkUtils.java      |   2 +-
 33 files changed, 213 insertions(+), 210 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
index 3607df4..6acdfa7 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
@@ -28,6 +28,7 @@ import org.apache.dubbo.common.utils.ConfigUtils;
 import org.apache.dubbo.common.utils.ReflectUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.support.Parameter;
+import org.apache.dubbo.rpc.model.ScopeModel;
 import org.apache.dubbo.rpc.model.ServiceMetadata;
 
 import java.lang.reflect.Method;
@@ -196,6 +197,34 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
         return urls;
     }
 
+    @Override
+    public void setScopeModel(ScopeModel scopeModel) {
+        super.setScopeModel(scopeModel);
+//        ApplicationModel applicationModel = ScopeModelUtil.getApplicationModel(scopeModel);
+//        if (this.configCenter != null && this.configCenter.getScopeModel() != applicationModel) {
+//            this.configCenter.setScopeModel(applicationModel);
+//        }
+//        if (this.metadataReportConfig != null && this.metadataReportConfig.getScopeModel() != applicationModel) {
+//            this.metadataReportConfig.setScopeModel(applicationModel);
+//        }
+//        if (this.metrics != null && this.metrics.getScopeModel() != applicationModel) {
+//            this.metrics.setScopeModel(applicationModel);
+//        }
+//        if (this.monitor != null && this.monitor.getScopeModel() != applicationModel) {
+//            this.monitor.setScopeModel(applicationModel);
+//        }
+//        if (this.metadataReportConfig != null && this.metadataReportConfig.getScopeModel() != applicationModel) {
+//            this.metadataReportConfig.setScopeModel(applicationModel);
+//        }
+//        if (CollectionUtils.isNotEmpty(this.registries)) {
+//            this.registries.forEach(registryConfig -> {
+//                if (registryConfig.getScopeModel() != applicationModel) {
+//                    registryConfig.setScopeModel(applicationModel);
+//                }
+//            });
+//        }
+    }
+
     /**
      * Check whether the registry config is exists, and then conversion it to {@link RegistryConfig}
      */
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/ApplicationConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
index c5aebc6..d990ddb 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
@@ -33,17 +33,17 @@ import java.util.Map;
 import java.util.Set;
 
 import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_PROTOCOL_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_VERSION_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;
 import static org.apache.dubbo.common.constants.CommonConstants.DUMP_DIRECTORY;
 import static org.apache.dubbo.common.constants.CommonConstants.HOST_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.LIVENESS_PROBE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_LOCAL_FILE_CACHE_ENABLED;
-import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_VERSION_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_PROTOCOL_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.METADATA_SERVICE_PORT_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.LIVENESS_PROBE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.READINESS_PROBE_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_LOCAL_FILE_CACHE_ENABLED;
+import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.STARTUP_PROBE;
 import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;
 import static org.apache.dubbo.common.constants.QosConstants.QOS_ENABLE;
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java b/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
index 09abf83..525ccbc 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.common.utils.RegexProperties;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.support.Parameter;
+import org.apache.dubbo.rpc.model.ScopeModel;
 import org.apache.dubbo.rpc.model.ServiceMetadata;
 import org.apache.dubbo.rpc.service.GenericService;
 import org.apache.dubbo.rpc.support.ProtocolUtils;
@@ -200,6 +201,14 @@ public abstract class ReferenceConfigBase<T> extends AbstractReferenceConfig {
     }
 
     @Override
+    public void setScopeModel(ScopeModel scopeModel) {
+        super.setScopeModel(scopeModel);
+        if (this.consumer != null && this.consumer.getScopeModel() != scopeModel) {
+            this.consumer.setScopeModel(scopeModel);
+        }
+    }
+
+    @Override
     public String getInterface() {
         return interfaceName;
     }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java b/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
index 8e99615..6d61914 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.annotation.Service;
 import org.apache.dubbo.config.support.Parameter;
+import org.apache.dubbo.rpc.model.ScopeModel;
 import org.apache.dubbo.rpc.model.ServiceMetadata;
 import org.apache.dubbo.rpc.service.GenericService;
 import org.apache.dubbo.rpc.support.ProtocolUtils;
@@ -104,6 +105,14 @@ public abstract class ServiceConfigBase<T> extends AbstractServiceConfig {
         return protocols;
     }
 
+    @Override
+    public void setScopeModel(ScopeModel scopeModel) {
+        super.setScopeModel(scopeModel);
+        if (this.provider != null && this.provider.getScopeModel() != scopeModel) {
+            this.provider.setScopeModel(scopeModel);
+        }
+    }
+
     @Deprecated
     private static List<ProviderConfig> convertProtocolToProvider(List<ProtocolConfig> protocols) {
         if (CollectionUtils.isEmpty(protocols)) {
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
index da9591e..cd814ea 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
@@ -101,6 +101,10 @@ public class ApplicationModel extends ScopeModel {
         // TODO destroy application resources
     }
 
+    public boolean isInit() {
+        return initFlag.get();
+    }
+
     public FrameworkModel getFrameworkModel() {
         return frameworkModel;
     }
diff --git a/dubbo-config/dubbo-config-api/pom.xml b/dubbo-config/dubbo-config-api/pom.xml
index ad4220b..b8ea09d 100644
--- a/dubbo-config/dubbo-config-api/pom.xml
+++ b/dubbo-config/dubbo-config-api/pom.xml
@@ -52,6 +52,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-api</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-rpc-injvm</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
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 2f2e4cc..fa022a0 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
@@ -44,7 +44,6 @@ import org.apache.dubbo.rpc.model.AsyncMethodInfo;
 import org.apache.dubbo.rpc.model.ConsumerModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
 import org.apache.dubbo.rpc.model.ServiceRepository;
-import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;
 import org.apache.dubbo.rpc.service.GenericService;
 import org.apache.dubbo.rpc.support.ProtocolUtils;
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
index ec51a07..47b8029 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
@@ -72,6 +72,7 @@ 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.AbstractRegistryFactory;
 import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.model.ApplicationModel;
@@ -114,7 +115,6 @@ 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.metadata.WritableMetadataService.getDefaultExtension;
 import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setMetadataStorageType;
 import static org.apache.dubbo.registry.support.AbstractRegistryFactory.getServiceDiscoveries;
 import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
index 84a9807..f8214ef 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
@@ -18,9 +18,6 @@ package org.apache.dubbo.config;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.Version;
-import org.apache.dubbo.common.config.CompositeConfiguration;
-import org.apache.dubbo.common.config.Configuration;
-import org.apache.dubbo.common.config.Environment;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.common.utils.ConfigUtils;
 import org.apache.dubbo.common.utils.NetUtils;
@@ -30,87 +27,76 @@ import org.apache.dubbo.config.annotation.Method;
 import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.api.DemoService;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
-import org.apache.dubbo.config.context.ConfigManager;
 import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
-
-import org.apache.dubbo.metadata.report.MetadataReport;
-import org.apache.dubbo.metadata.report.MetadataReportInstance;
 import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.ProxyFactory;
 import org.apache.dubbo.rpc.listener.ListenerInvokerWrapper;
 import org.apache.dubbo.rpc.model.ApplicationModel;
-
-import org.apache.curator.test.TestingServer;
-import org.apache.dubbo.rpc.model.ConsumerModel;
+import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ServiceMetadata;
-import org.apache.dubbo.rpc.model.ServiceRepository;
 import org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker;
 import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;
+
+import org.apache.curator.test.TestingServer;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
-import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.HashMap;
-import java.util.Collections;
-import java.util.Optional;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
-
-import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_VERSION_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.BROADCAST_CLUSTER;
 import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;
-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;
-import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_VERSION_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.METRICS_PROTOCOL;
-import static org.apache.dubbo.common.constants.CommonConstants.METRICS_PORT;
-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_VERSION_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.DUMP_DIRECTORY;
-import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_LOCAL_FILE_CACHE_ENABLED;
-import static org.apache.dubbo.common.constants.CommonConstants.METADATA_SERVICE_PORT_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.LIVENESS_PROBE_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.METADATA_SERVICE_PORT_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.METRICS_PORT;
+import static org.apache.dubbo.common.constants.CommonConstants.METRICS_PROTOCOL;
+import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.READINESS_PROBE_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.STARTUP_PROBE;
-import static org.apache.dubbo.common.constants.CommonConstants.URL_MERGE_PROCESSOR_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.REFER_THREAD_NUM_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.REFER_BACKGROUND_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.REFER_ASYNC_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.REFER_BACKGROUND_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.REFER_THREAD_NUM_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_LOCAL_FILE_CACHE_ENABLED;
+import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.STARTUP_PROBE;
+import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.URL_MERGE_PROCESSOR_KEY;
+import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;
 import static org.apache.dubbo.common.constants.QosConstants.QOS_ENABLE;
 import static org.apache.dubbo.common.constants.QosConstants.QOS_HOST;
 import static org.apache.dubbo.common.constants.QosConstants.QOS_PORT;
-import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;
 import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PUBLISH_INSTANCE_KEY;
 import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PUBLISH_INTERFACE_KEY;
-import static org.apache.dubbo.registry.Constants.ENABLE_CONFIGURATION_LISTEN;
 import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;
-import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE;
-import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;
 import static org.apache.dubbo.rpc.Constants.DEFAULT_STUB_EVENT;
 import static org.apache.dubbo.rpc.Constants.LOCAL_KEY;
+import static org.apache.dubbo.rpc.Constants.LOCAL_PROTOCOL;
 import static org.apache.dubbo.rpc.Constants.SCOPE_KEY;
 import static org.apache.dubbo.rpc.Constants.SCOPE_LOCAL;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE;
 
 public class ReferenceConfigTest {
     private TestingServer zkServer;
@@ -144,24 +130,6 @@ public class ReferenceConfigTest {
     @Test
     public void testAppendConfig() {
 
-        ReferenceConfig<DemoService> referenceConfig = new ReferenceConfig<>();
-        referenceConfig.setClient("netty");
-        referenceConfig.setGeneric(Boolean.FALSE.toString());
-        referenceConfig.setProtocol("dubbo");
-        referenceConfig.setInit(true);
-        referenceConfig.setLazy(false);
-        referenceConfig.setInjvm(false);
-        referenceConfig.setReconnect("reconnect");
-        referenceConfig.setSticky(false);
-        referenceConfig.setStub(DEFAULT_STUB_EVENT);
-        referenceConfig.setRouter("default");
-        referenceConfig.setReferAsync(true);
-
-        DubboBootstrap.getInstance()
-            .application("application1")
-            .initialize();
-        referenceConfig.setBootstrap(DubboBootstrap.getInstance());
-
         ApplicationConfig applicationConfig = new ApplicationConfig();
         applicationConfig.setName("application1");
         applicationConfig.setVersion("v1");
@@ -193,6 +161,19 @@ public class ReferenceConfigTest {
         applicationConfig.setReadinessProbe("readinessProb");
         applicationConfig.setStartupProbe("startupProbe");
 
+        ReferenceConfig<DemoService> referenceConfig = new ReferenceConfig<>();
+        referenceConfig.setClient("netty");
+        referenceConfig.setGeneric(Boolean.FALSE.toString());
+        referenceConfig.setProtocol("dubbo");
+        referenceConfig.setInit(true);
+        referenceConfig.setLazy(false);
+        referenceConfig.setInjvm(false);
+        referenceConfig.setReconnect("reconnect");
+        referenceConfig.setSticky(false);
+        referenceConfig.setStub(DEFAULT_STUB_EVENT);
+        referenceConfig.setRouter("default");
+        referenceConfig.setReferAsync(true);
+
         MonitorConfig monitorConfig = new MonitorConfig();
         applicationConfig.setMonitor(monitorConfig);
 
@@ -220,7 +201,7 @@ public class ReferenceConfigTest {
         referenceConfig.setConsumer(consumerConfig);
 
         MethodConfig methodConfig = new MethodConfig();
-        methodConfig.setName("method1");
+        methodConfig.setName("sayName");
         methodConfig.setStat(1);
         methodConfig.setRetries(0);
         methodConfig.setExecutes(10);
@@ -231,41 +212,8 @@ public class ReferenceConfigTest {
         methodConfig.setServiceId(DemoService.class.getName());
         methodConfig.setParentPrefix("demo");
 
-
         referenceConfig.setMethods(Collections.singletonList(methodConfig));
 
-        ConfigManager configManager = mock(ConfigManager.class);
-        Environment environment = mock(Environment.class);
-        CompositeConfiguration compositeConfiguration = mock(CompositeConfiguration.class);
-        Configuration dynamicGlobalConfiguration = mock(Configuration.class);
-        ServiceRepository serviceRepository = mock(ServiceRepository.class);
-        ConsumerModel consumerModel = mock(ConsumerModel.class);
-
-        when(configManager.getApplicationOrElseThrow()).thenReturn(applicationConfig);
-        when(configManager.getMetrics()).thenReturn(Optional.of(metricsConfig));
-        when(configManager.getModule()).thenReturn(Optional.of(moduleConfig));
-
-        MockedStatic<ApplicationModel> applicationModelMockedStatic = Mockito.mockStatic(ApplicationModel.class);
-        applicationModelMockedStatic.when(ApplicationModel::getConfigManager).thenReturn(configManager);
-        applicationModelMockedStatic.when(ApplicationModel::getEnvironment).thenReturn(environment);
-        applicationModelMockedStatic.when(ApplicationModel::getServiceRepository).thenReturn(serviceRepository);
-        when(environment.getConfiguration()).thenReturn(compositeConfiguration);
-        when(environment.getDynamicGlobalConfiguration()).thenReturn(dynamicGlobalConfiguration);
-        when(compositeConfiguration.convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true))
-            .thenReturn(true);
-
-        MockedStatic<MetadataReportInstance> metadataReportInstanceMockedStatic =
-            Mockito.mockStatic(MetadataReportInstance.class);
-
-        MetadataReport metadataReport = mock(MetadataReport.class);
-        metadataReportInstanceMockedStatic.when(() -> MetadataReportInstance.getMetadataReport("default"))
-            .thenReturn(metadataReport);
-
-
-        when(serviceRepository.lookupReferredService("org.apache.dubbo.config.api.DemoService"))
-            .thenReturn(consumerModel);
-
-        referenceConfig.refreshed.set(true);
         referenceConfig.setInterface(DemoService.class);
         referenceConfig.getInterfaceClass();
         referenceConfig.setCheck(false);
@@ -277,6 +225,14 @@ public class ReferenceConfigTest {
 
         referenceConfig.setRegistry(registry);
 
+        DubboBootstrap dubboBootstrap = DubboBootstrap.newInstance(FrameworkModel.defaultModel());
+        dubboBootstrap.application(applicationConfig)
+            .reference(referenceConfig)
+            .registry(registry)
+            .metrics(metricsConfig)
+            .module(moduleConfig)
+            .initialize();
+
         referenceConfig.init();
 
         ServiceMetadata serviceMetadata = referenceConfig.getServiceMetadata();
@@ -400,20 +356,20 @@ public class ReferenceConfigTest {
         // verify additional method config
         Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("name"));
         Assertions.assertEquals(methodConfig.getStat().toString(),
-            serviceMetadata.getAttachments().get("method1.stat"));
+            serviceMetadata.getAttachments().get("sayName.stat"));
         Assertions.assertEquals(methodConfig.getRetries().toString(),
-            serviceMetadata.getAttachments().get("method1.retries"));
-        Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("method1.reliable"));
+            serviceMetadata.getAttachments().get("sayName.retries"));
+        Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("sayName.reliable"));
         Assertions.assertEquals(methodConfig.getExecutes().toString(),
-            serviceMetadata.getAttachments().get("method1.executes"));
+            serviceMetadata.getAttachments().get("sayName.executes"));
         Assertions.assertEquals(methodConfig.getDeprecated().toString(),
-            serviceMetadata.getAttachments().get("method1.deprecated"));
-        Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("method1.stick"));
+            serviceMetadata.getAttachments().get("sayName.deprecated"));
+        Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("sayName.stick"));
         Assertions.assertEquals(methodConfig.isReturn().toString(),
-            serviceMetadata.getAttachments().get("method1.return"));
-        Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("method1.service"));
-        Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("method1.service.id"));
-        Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("method1.parent.prefix"));
+            serviceMetadata.getAttachments().get("sayName.return"));
+        Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("sayName.service"));
+        Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("sayName.service.id"));
+        Assertions.assertFalse(serviceMetadata.getAttachments().containsKey("sayName.parent.prefix"));
 
         // verify additional revision and methods parameter
         Assertions.assertEquals(Version.getVersion(referenceConfig.getInterfaceClass(), referenceConfig.getVersion()),
@@ -422,8 +378,7 @@ public class ReferenceConfigTest {
         Assertions.assertEquals(DemoService.class.getMethods().length,
             StringUtils.split((String) serviceMetadata.getAttachments().get(METHODS_KEY), ',').length);
 
-        applicationModelMockedStatic.closeOnDemand();
-        metadataReportInstanceMockedStatic.closeOnDemand();
+        dubboBootstrap.stop();
     }
 
     @Test
@@ -494,11 +449,6 @@ public class ReferenceConfigTest {
         ReferenceConfig<DemoService> referenceConfig = new ReferenceConfig<>();
         referenceConfig.setScope(LOCAL_KEY);
 
-        DubboBootstrap.getInstance()
-            .application("application1")
-            .initialize();
-        referenceConfig.setBootstrap(DubboBootstrap.getInstance());
-
         ApplicationConfig applicationConfig = new ApplicationConfig();
         applicationConfig.setName("application1");
         Map<String, String> parameters = new HashMap<>();
@@ -506,40 +456,15 @@ public class ReferenceConfigTest {
         parameters.put("key2", "value2");
         applicationConfig.setParameters(parameters);
 
-        ConfigManager configManager = mock(ConfigManager.class);
-        Environment environment = mock(Environment.class);
-        CompositeConfiguration compositeConfiguration = mock(CompositeConfiguration.class);
-        Configuration dynamicGlobalConfiguration = mock(Configuration.class);
-        ServiceRepository serviceRepository = mock(ServiceRepository.class);
-        ConsumerModel consumerModel = mock(ConsumerModel.class);
-
-        when(configManager.getApplicationOrElseThrow()).thenReturn(applicationConfig);
-
-        MockedStatic<ApplicationModel> applicationModelMockedStatic = Mockito.mockStatic(ApplicationModel.class);
-        applicationModelMockedStatic.when(ApplicationModel::getConfigManager).thenReturn(configManager);
-        applicationModelMockedStatic.when(ApplicationModel::getEnvironment).thenReturn(environment);
-        applicationModelMockedStatic.when(ApplicationModel::getServiceRepository).thenReturn(serviceRepository);
-        when(environment.getConfiguration()).thenReturn(compositeConfiguration);
-        when(environment.getDynamicGlobalConfiguration()).thenReturn(dynamicGlobalConfiguration);
-        when(compositeConfiguration.convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true))
-            .thenReturn(true);
-
-        MockedStatic<MetadataReportInstance> metadataReportInstanceMockedStatic =
-            Mockito.mockStatic(MetadataReportInstance.class);
-
-        MetadataReport metadataReport = mock(MetadataReport.class);
-        metadataReportInstanceMockedStatic.when(() -> MetadataReportInstance.getMetadataReport("default"))
-            .thenReturn(metadataReport);
-
-
-        when(serviceRepository.lookupReferredService("org.apache.dubbo.config.api.DemoService"))
-            .thenReturn(consumerModel);
-
-        referenceConfig.refreshed.set(true);
         referenceConfig.setInterface(DemoService.class);
         referenceConfig.getInterfaceClass();
         referenceConfig.setCheck(false);
 
+        DubboBootstrap dubboBootstrap = DubboBootstrap.newInstance(FrameworkModel.defaultModel());
+        dubboBootstrap.application(applicationConfig)
+            .reference(referenceConfig)
+            .initialize();
+
         referenceConfig.init();
         Assertions.assertTrue(referenceConfig.getInvoker() instanceof ListenerInvokerWrapper);
         Assertions.assertTrue(((ListenerInvokerWrapper<?>) referenceConfig.getInvoker()).getInvoker() instanceof InjvmInvoker);
@@ -548,8 +473,7 @@ public class ReferenceConfigTest {
         Assertions.assertEquals("value1", url.getParameter("key1"));
         Assertions.assertEquals("value2", url.getParameter("key2"));
 
-        applicationModelMockedStatic.closeOnDemand();
-        metadataReportInstanceMockedStatic.closeOnDemand();
+        dubboBootstrap.stop();
     }
 
     @Test
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java
index e7fb4fe..19fe85f 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java
@@ -20,11 +20,13 @@ import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.ServiceConfig;
 import org.apache.dubbo.config.SysProps;
 import org.apache.dubbo.config.api.DemoService;
 import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
-import org.apache.dubbo.registrycenter.DefaultSingleRegistryCenter;
+import org.apache.dubbo.registrycenter.RegistryCenter;
+import org.apache.dubbo.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 
@@ -36,12 +38,20 @@ import org.junit.jupiter.api.Test;
 
 public class DubboBootstrapMultiInstanceTest {
 
-    private static DefaultSingleRegistryCenter registryCenter;
+    private static ZookeeperSingleRegistryCenter registryCenter;
+
+    private static RegistryConfig registryConfig;
 
     @BeforeAll
     public static void setup() {
-        registryCenter = new DefaultSingleRegistryCenter(NetUtils.getAvailablePort());
+        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()));
+
     }
 
     @AfterAll
@@ -126,7 +136,7 @@ public class DubboBootstrapMultiInstanceTest {
         if (!dubboBootstrap.getConfigManager().getApplication().isPresent()) {
             dubboBootstrap.application("consumer-app");
         }
-        dubboBootstrap.registry(registryCenter.getRegistryConfig())
+        dubboBootstrap.registry(registryConfig)
             .reference(referenceConfig);
         return dubboBootstrap;
     }
@@ -150,7 +160,7 @@ public class DubboBootstrapMultiInstanceTest {
         if (!dubboBootstrap.getConfigManager().getApplication().isPresent()) {
             dubboBootstrap.application("provider-app");
         }
-        dubboBootstrap.registry(registryCenter.getRegistryConfig())
+        dubboBootstrap.registry(registryConfig)
             .protocol(protocol1)
             .service(serviceConfig);
         return dubboBootstrap;
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 f873f41..68c92f3 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
@@ -37,7 +37,6 @@ import org.apache.dubbo.metadata.MetadataService;
 import org.apache.dubbo.metadata.WritableMetadataService;
 import org.apache.dubbo.monitor.MonitorService;
 import org.apache.dubbo.registry.RegistryService;
-import org.apache.dubbo.registry.client.metadata.MetadataUtils;
 import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol;
@@ -343,7 +342,7 @@ public class DubboBootstrapTest {
         serviceConfig.setVersion(MetadataService.VERSION);
         assertThat(exporters, hasEntry(is(serviceConfig.getUniqueServiceName() + ":" + availablePort), anything()));
 
-        WritableMetadataService metadataService = MetadataUtils.getLocalMetadataService();
+        WritableMetadataService metadataService = WritableMetadataService.getDefaultExtension(ApplicationModel.defaultModel());
         MetadataInfo metadataInfo = metadataService.getDefaultMetadataInfo();
         Assertions.assertNotNull(metadataInfo);
         if (shouldReport) {
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java
index 9eb749c..322d6da 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderIntegrationTest.java
@@ -19,11 +19,11 @@ package org.apache.dubbo.integration.multiple.exportprovider;
 import org.apache.dubbo.common.config.configcenter.ConfigItem;
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.extension.ExtensionLoader;
-import org.apache.dubbo.config.RegistryConfig;
-import org.apache.dubbo.config.ServiceConfig;
-import org.apache.dubbo.config.ReferenceConfig;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ProtocolConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+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.integration.IntegrationTest;
@@ -34,6 +34,8 @@ import org.apache.dubbo.registrycenter.RegistryCenter;
 import org.apache.dubbo.registrycenter.ZookeeperMultipleRegistryCenter;
 import org.apache.dubbo.rpc.ExporterListener;
 import org.apache.dubbo.rpc.Filter;
+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;
@@ -218,7 +220,7 @@ public class MultipleRegistryCenterExportProviderIntegrationTest implements Inte
         // registryKey: the registryKey is the default cluster, CommonConstants.DEFAULT_KEY
         // key: The exported interface's name
         // group: the group is "mapping", ServiceNameMapping.DEFAULT_MAPPING_GROUP
-        ConfigItem configItem = MetadataReportInstance.getMetadataReport(CommonConstants.DEFAULT_KEY)
+        ConfigItem configItem = ApplicationModel.defaultModel().getBeanFactory().getBean(MetadataReportInstance.class).getMetadataReport(CommonConstants.DEFAULT_KEY)
             .getConfigItem(serviceConfig.getInterface()
                 , ServiceNameMapping.DEFAULT_MAPPING_GROUP);
         // Check if the exported service (provider) is registered
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java
index 05378e7..ec806b9 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/exportprovider/SingleRegistryCenterExportProviderIntegrationTest.java
@@ -19,11 +19,11 @@ package org.apache.dubbo.integration.single.exportprovider;
 import org.apache.dubbo.common.config.configcenter.ConfigItem;
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.extension.ExtensionLoader;
-import org.apache.dubbo.config.RegistryConfig;
-import org.apache.dubbo.config.ServiceConfig;
-import org.apache.dubbo.config.ReferenceConfig;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ProtocolConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+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.integration.IntegrationTest;
@@ -34,6 +34,8 @@ import org.apache.dubbo.registrycenter.RegistryCenter;
 import org.apache.dubbo.registrycenter.ZookeeperMultipleRegistryCenter;
 import org.apache.dubbo.rpc.ExporterListener;
 import org.apache.dubbo.rpc.Filter;
+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;
@@ -216,7 +218,7 @@ public class SingleRegistryCenterExportProviderIntegrationTest implements Integr
         // registryKey: the registryKey is the default cluster, CommonConstants.DEFAULT_KEY
         // key: The exported interface's name
         // group: the group is "mapping", ServiceNameMapping.DEFAULT_MAPPING_GROUP
-        ConfigItem configItem = MetadataReportInstance.getMetadataReport(CommonConstants.DEFAULT_KEY)
+        ConfigItem configItem = ApplicationModel.defaultModel().getBeanFactory().getBean(MetadataReportInstance.class).getMetadataReport(CommonConstants.DEFAULT_KEY)
             .getConfigItem(serviceConfig.getInterface()
                 , ServiceNameMapping.DEFAULT_MAPPING_GROUP);
         // Check if the exported service (provider) is registered
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 e5714d4..75d6b7a 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
@@ -22,8 +22,8 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 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.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import org.junit.jupiter.api.AfterAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java
index 79d9ab5..099f8a7 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java
@@ -20,8 +20,8 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import org.junit.jupiter.api.AfterAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java
index e3939e4..2cb92ff 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java
@@ -21,8 +21,8 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.config.spring.propertyconfigurer.consumer.DemoBeanFactoryPostProcessor;
-import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import org.junit.jupiter.api.AfterAll;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java
index be83282..b5b1a2d 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java
@@ -21,11 +21,14 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.config.spring.propertyconfigurer.consumer.DemoBeanFactoryPostProcessor;
-import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
-import org.junit.jupiter.api.*;
+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.springframework.context.annotation.AnnotationConfigApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
index 73ca355..cd65bb4 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
@@ -27,16 +27,13 @@ import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.config.spring.extension.SpringExtensionInjector;
 import org.apache.dubbo.config.spring.impl.HelloServiceImpl;
 import org.apache.dubbo.config.spring.reference.ReferenceBeanBuilder;
-import org.apache.dubbo.config.spring.registrycenter.ZooKeeperServer;
 import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
 import org.apache.dubbo.config.spring.registrycenter.ZookeeperMultipleRegistryCenter;
 import org.apache.dubbo.rpc.service.GenericException;
 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.Test;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
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 6ecca68..fe5a933 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
@@ -19,6 +19,7 @@ package org.apache.dubbo.metadata;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.SPI;
 import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.rpc.model.ScopeModel;
 
 import java.util.Arrays;
 import java.util.HashSet;
@@ -54,6 +55,10 @@ public interface ServiceNameMapping {
         return getExtensionLoader(ServiceNameMapping.class).getDefaultExtension();
     }
 
+    static ServiceNameMapping getDefaultExtension(ScopeModel scopeModel) {
+        return scopeModel.getDefaultExtension(ServiceNameMapping.class);
+    }
+
     static String buildMappingKey(URL url) {
         return buildGroup(url.getServiceInterface());
     }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
index bfdc191..483c862 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
@@ -29,7 +29,6 @@ import java.util.Objects;
 import java.util.SortedMap;
 import java.util.TreeMap;
 
-import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.SCOPE_MODEL;
 import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.ENDPOINTS;
 import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.EXPORTED_SERVICES_REVISION_PROPERTY_NAME;
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
index 1eaa2dd..996962f 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
@@ -210,7 +210,7 @@ public class ServiceDiscoveryRegistry implements Registry {
 
         Set<String> subscribedServices = Collections.emptySet();
         try {
-            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension();
+            ServiceNameMapping serviceNameMapping = ServiceNameMapping.getDefaultExtension(registryURL.getScopeModel());
             subscribedServices = serviceNameMapping.getAndListenServices(registryURL, url, new DefaultMappingListener(url, subscribedServices, listener));
         } catch (Exception e) {
             logger.warn("Cannot find app mapping for service " + url.getServiceInterface() + ", will not migrate.", e);
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
index ea0723c..e238ea7 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
@@ -31,7 +31,6 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -76,7 +75,6 @@ public class ServiceInstanceMetadataCustomizer implements ServiceInstanceCustomi
         }
         MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServices().values().iterator().next();
         URL url = serviceInfo.getUrl();
-        List<MetadataParamsFilter> paramsFilters = loader.getActivateExtension(url, "params-filter");
         Map<String, String> allParams = new HashMap<>(url.getParameters());
 
         // load instance params users want to load.
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
index 25543bc..e687ff7 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
@@ -598,10 +598,12 @@ public class RegistryProtocol implements Protocol, ScopeModelAware {
         }
 
         for (ApplicationModel applicationModel : frameworkModel.getApplicationModels()) {
-            if (applicationModel.getApplicationEnvironment().getConfiguration().convert(Boolean.class, org.apache.dubbo.registry.Constants.ENABLE_CONFIGURATION_LISTEN, true)) {
-                applicationModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
-                    .removeListener(applicationModel.getApplicationName() + CONFIGURATORS_SUFFIX,
-                        getProviderConfigurationListener(applicationModel));
+            if (applicationModel.isInit()) {
+                if (applicationModel.getApplicationEnvironment().getConfiguration().convert(Boolean.class, org.apache.dubbo.registry.Constants.ENABLE_CONFIGURATION_LISTEN, true)) {
+                    applicationModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
+                        .removeListener(applicationModel.getApplicationName() + CONFIGURATORS_SUFFIX,
+                            getProviderConfigurationListener(applicationModel));
+                }
             }
         }
 
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java
index 169b51e..89710e1 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistryFactory.java
@@ -37,9 +37,9 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
+import static org.apache.dubbo.common.constants.CommonConstants.CHECK_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.CHECK_KEY;
 import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;
 import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;
 
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
index e13d29d..c356cea 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
@@ -32,6 +32,9 @@ import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.common.utils.UrlUtils;
 import org.apache.dubbo.registry.NotifyListener;
+import org.apache.dubbo.registry.ProviderFirstParams;
+import org.apache.dubbo.rpc.model.ScopeModel;
+import org.apache.dubbo.rpc.model.ScopeModelUtil;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
index 13fde8e..8f073b4 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
@@ -94,7 +94,7 @@ public class DefaultServiceInstanceTest {
         assertEquals("value", allParams2.get("key"));
 
         // test equals
-        DefaultServiceInstance instance2 = new DefaultServiceInstance("A", "127.0.0.1", 20880);
+        DefaultServiceInstance instance2 = new DefaultServiceInstance("A", "127.0.0.1", 20880, ApplicationModel.defaultModel());
         instance2.setMetadata(new HashMap<>(instance.getMetadata()));
         instance2.getMetadata().put(EXPORTED_SERVICES_REVISION_PROPERTY_NAME, "222");
         // assert instances with different revision and extend params are equal
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/InstanceAddressURLTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/InstanceAddressURLTest.java
index 9ce1f03..6b3a0da 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/InstanceAddressURLTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/InstanceAddressURLTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.metadata.MetadataInfo;
 import org.apache.dubbo.registry.ProviderFirstParams;
 import org.apache.dubbo.rpc.RpcServiceContext;
+import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -64,7 +65,7 @@ public class InstanceAddressURLTest {
         "&version=1.0.0&timeout=9000&a.timeout=8888&dubbo.tag=consumer&protocol=dubbo");
 
     private DefaultServiceInstance createInstance() {
-        DefaultServiceInstance instance = new DefaultServiceInstance("demo-provider", "127.0.0.1", 8080);
+        DefaultServiceInstance instance = new DefaultServiceInstance("demo-provider", "127.0.0.1", 8080, ApplicationModel.defaultModel());
         Map<String, String> metadata = instance.getMetadata();
         metadata.put("key1", "value1");
         metadata.put("key2", "value2");
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryTest.java
index 2f5e047..31e7b37 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.metadata.WritableMetadataService;
 import org.apache.dubbo.registry.NotifyListener;
 import org.apache.dubbo.registry.client.event.listener.MockServiceInstancesChangedListener;
 import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;
+import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
@@ -97,7 +98,7 @@ public class ServiceDiscoveryRegistryTest {
         when(serviceDiscovery.createListener(any())).thenReturn(instanceListener);
         when(serviceDiscovery.getInstances(any())).thenReturn(Collections.emptyList());
 
-        spiedMetadataService  = spy(WritableMetadataService.getDefaultExtension());
+        spiedMetadataService  = spy(WritableMetadataService.getDefaultExtension(ApplicationModel.defaultModel()));
         serviceDiscoveryRegistry = new ServiceDiscoveryRegistry(registryURL, serviceDiscovery, spiedMetadataService);
     }
 
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMappingTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMappingTest.java
index 41b96e9..f710e56 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMappingTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMappingTest.java
@@ -71,7 +71,7 @@ public class MetadataServiceNameMappingTest {
 
             try (MockedStatic<MetadataReportInstance> mockedMetadataHolder = Mockito.mockStatic(MetadataReportInstance.class)) {
                 when(configManager.getMetadataConfigs()).thenReturn(Arrays.asList(new MetadataReportConfig()));
-                mockedMetadataHolder.when(() -> MetadataReportInstance.getMetadataReport(any())).thenReturn(metadataReport);
+                mockedMetadataHolder.when(() -> ApplicationModel.defaultModel().getBeanFactory().getBean(MetadataReportInstance.class).getMetadataReport(any())).thenReturn(metadataReport);
                 when(metadataReport.registerServiceAppMapping(any(), any(), any())).thenReturn(true);
 
                 // metadata report directly
@@ -116,7 +116,7 @@ public class MetadataServiceNameMappingTest {
         Set<String> set = new HashSet<>();
         set.add("app1");
         try (MockedStatic<MetadataReportInstance> mockedMetadataHolder = Mockito.mockStatic(MetadataReportInstance.class)) {
-            mockedMetadataHolder.when(() -> MetadataReportInstance.getMetadataReport(any())).thenReturn(metadataReport);
+            mockedMetadataHolder.when(() -> ApplicationModel.defaultModel().getBeanFactory().getBean(MetadataReportInstance.class).getMetadataReport(any())).thenReturn(metadataReport);
             when(metadataReport.getServiceAppMapping(any(), any())).thenReturn(set);
 
             Set<String> result = mapping.get(url);
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizerTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizerTest.java
index 1346a46..a402b96 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizerTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizerTest.java
@@ -53,7 +53,7 @@ public class ProtocolPortsMetadataCustomizerTest {
     private InMemoryWritableMetadataService metadataService;
 
     public static DefaultServiceInstance createInstance() {
-        return new DefaultServiceInstance("A", "127.0.0.1", 20880);
+        return new DefaultServiceInstance("A", "127.0.0.1", 20880, ApplicationModel.defaultModel());
     }
 
     @BeforeAll
@@ -86,7 +86,7 @@ public class ProtocolPortsMetadataCustomizerTest {
     public void test() {
         ProtocolPortsMetadataCustomizer customizer = new ProtocolPortsMetadataCustomizer();
         try (MockedStatic<WritableMetadataService> mockMetadataService = Mockito.mockStatic(WritableMetadataService.class)) {
-            mockMetadataService.when(() -> WritableMetadataService.getDefaultExtension()).thenReturn(metadataService);
+            mockMetadataService.when(() -> WritableMetadataService.getDefaultExtension(ApplicationModel.defaultModel())).thenReturn(metadataService);
             customizer.customize(instance);
             String endpoints = instance.getMetadata().get(ENDPOINTS);
             assertNotNull(endpoints);
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizerTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizerTest.java
index 8094a59..08e7c72 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizerTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizerTest.java
@@ -48,7 +48,7 @@ public class ServiceInstanceMetadataCustomizerTest {
     private InMemoryWritableMetadataService metadataService;
 
     public static DefaultServiceInstance createInstance() {
-        return new DefaultServiceInstance("A", "127.0.0.1", 20880);
+        return new DefaultServiceInstance("A", "127.0.0.1", 20880, ApplicationModel.defaultModel());
     }
 
     @BeforeAll
@@ -81,7 +81,7 @@ public class ServiceInstanceMetadataCustomizerTest {
         ServiceInstanceMetadataCustomizer customizer = new ServiceInstanceMetadataCustomizer();
         try (MockedStatic<ConfigurationUtils> mockedUtils = Mockito.mockStatic(ConfigurationUtils.class)) {
             try (MockedStatic<WritableMetadataService> mockMetadataService = Mockito.mockStatic(WritableMetadataService.class)) {
-                mockMetadataService.when(() -> WritableMetadataService.getDefaultExtension()).thenReturn(metadataService);
+                mockMetadataService.when(() -> WritableMetadataService.getDefaultExtension(ApplicationModel.defaultModel())).thenReturn(metadataService);
                 mockedUtils.when(() -> ConfigurationUtils.getProperty(DUBBO_LABELS)).thenReturn("k1=v1;k2=v2");
 //            mockedUtils.when(() -> ConfigurationUtils.getProperty(DUBBO_ENV_KEYS)).thenReturn("ENV_KEY1;ENV_KEY1");
 //            mockedUtils.when(() -> ConfigurationUtils.getProperty(ENV_KEY1)).thenReturn("");
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
index c89ebee..2ea3be6 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
@@ -18,9 +18,10 @@ package org.apache.dubbo.registry.client.migration.model;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.metadata.ServiceNameMapping;
-
+import org.apache.dubbo.metadata.WritableMetadataService;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
+
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentMatchers;
 import org.mockito.MockedStatic;
@@ -79,12 +80,12 @@ public class MigrationRuleTest {
             assertEquals(60, migrationRule.getDelay());
             assertEquals(false, migrationRule.getForce());
 
-        URL url = Mockito.mock(URL.class);
-        ModuleModel defaultModule = ApplicationModel.defaultModel().getDefaultModule();
-        url.setScopeModel(defaultModule);
-        Mockito.when(url.getDisplayServiceKey()).thenReturn("DemoService:1.0.0");
-        Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
-        Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
+            URL url = Mockito.mock(URL.class);
+            ModuleModel defaultModule = ApplicationModel.defaultModel().getDefaultModule();
+            url.setScopeModel(defaultModule);
+            Mockito.when(url.getDisplayServiceKey()).thenReturn("DemoService:1.0.0");
+            Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
+            Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
 
             assertEquals(migrationRule.getInterfaces().size(), 2);
 
@@ -101,19 +102,20 @@ public class MigrationRuleTest {
             assertEquals(false, migrationRule.getForce(url));
             assertEquals(MigrationStep.FORCE_APPLICATION, migrationRule.getStep(url));
 
-        Mockito.when(url.getDisplayServiceKey()).thenReturn("GreetingService:1.0.1");
-        Mockito.when(url.getServiceInterface()).thenReturn("GreetingService");
-        WritableMetadataService metadataService = WritableMetadataService.getDefaultExtension(defaultModule);
-        metadataService.putCachedMapping(ServiceNameMapping.buildMappingKey(url), Collections.singleton("TestApplication"));
+            Mockito.when(url.getDisplayServiceKey()).thenReturn("GreetingService:1.0.1");
+            Mockito.when(url.getServiceInterface()).thenReturn("GreetingService");
+            WritableMetadataService metadataService = WritableMetadataService.getDefaultExtension(defaultModule);
+            metadataService.putCachedMapping(ServiceNameMapping.buildMappingKey(url), Collections.singleton("TestApplication"));
 
-        Set<String> services =  new HashSet<>();
-        services.add("TestApplication");
-        when(mapping.getServices(any())).thenReturn(services);
-        assertEquals(0.3f, migrationRule.getThreshold(url));
-        assertEquals(20, migrationRule.getProportion(url));
-        assertEquals(10, migrationRule.getDelay(url));
-        assertEquals(false, migrationRule.getForce(url));
-        assertEquals(MigrationStep.FORCE_INTERFACE, migrationRule.getStep(url));
-        metadataService.removeCachedMapping("GreetingService");
+            Set<String> services = new HashSet<>();
+            services.add("TestApplication");
+            when(mapping.getServices(any())).thenReturn(services);
+            assertEquals(0.3f, migrationRule.getThreshold(url));
+            assertEquals(20, migrationRule.getProportion(url));
+            assertEquals(10, migrationRule.getDelay(url));
+            assertEquals(false, migrationRule.getForce(url));
+            assertEquals(MigrationStep.FORCE_INTERFACE, migrationRule.getStep(url));
+            metadataService.removeCachedMapping("GreetingService");
+        }
     }
 }
diff --git a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
index d7fd458..97e471f 100644
--- a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
+++ b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
@@ -16,7 +16,6 @@
  */
 package org.apache.dubbo.registry.zookeeper.util;
 
-import org.apache.curator.framework.imps.CuratorFrameworkState;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.registry.client.DefaultServiceInstance;
 import org.apache.dubbo.registry.client.ServiceInstance;
@@ -26,6 +25,7 @@ import org.apache.dubbo.rpc.model.ScopeModelUtil;
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.imps.CuratorFrameworkState;
 import org.apache.curator.retry.ExponentialBackoffRetry;
 import org.apache.curator.x.discovery.ServiceDiscovery;
 import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;