You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2021/12/07 04:20:48 UTC

[dubbo] 02/04: Merge branch '3.0' into 3.0-metadata-refactor-merged

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

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

commit 084113ad2a0322aee74a68f6d56c99a70a5d3e1f
Merge: 1448ebe 8a7c360
Author: ken.lj <ke...@gmail.com>
AuthorDate: Mon Dec 6 16:47:56 2021 +0800

    Merge branch '3.0' into 3.0-metadata-refactor-merged
    
    # Conflicts:
    #	dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
    #	dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
    #	dubbo-common/src/test/java/org/apache/dubbo/common/status/reporter/MockFrameworkStatusReporter.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java
    #	dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapTest.java
    #	dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest.java
    #	dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java
    #	dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/metadata/MetadataServiceExporterTest.java
    #	dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.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/client/metadata/store/InMemoryWritableMetadataService.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java
    #	dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListenerTest.java
    #	dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceHostPortCustomizerTest.java
    #	dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtilsTest.java
    #	dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
    #	dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtilsTest.java
    #	dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringXmlConfigTest.java
    #	dubbo-test/dubbo-test-spring/src/main/resources/spring/dubbo-demo.xml

 .gitignore                                         |   3 +
 dubbo-cluster/pom.xml                              |   4 -
 .../org/apache/dubbo/rpc/cluster/Constants.java    |   4 -
 .../org/apache/dubbo/rpc/cluster/Directory.java    |  29 ++
 .../java/org/apache/dubbo/rpc/cluster/Router.java  |  23 +-
 .../org/apache/dubbo/rpc/cluster/RouterChain.java  | 278 ++++++------
 .../rpc/cluster/directory/AbstractDirectory.java   | 280 +++++++++++-
 .../rpc/cluster/directory/StaticDirectory.java     |  38 +-
 .../cluster/filter/DefaultFilterChainBuilder.java  |   7 +-
 .../dubbo/rpc/cluster/router/RouterResult.java     |  55 +++
 .../rpc/cluster/router/RouterSnapshotNode.java     | 117 +++++
 ...ditionRouter.java => ConditionStateRouter.java} |  54 ++-
 ...ctory.java => ConditionStateRouterFactory.java} |  13 +-
 .../config/{AppRouter.java => AppStateRouter.java} |   4 +-
 ...uterFactory.java => AppStateRouterFactory.java} |  14 +-
 ...nableRouter.java => ListenableStateRouter.java} |  39 +-
 .../router/condition/config/ServiceRouter.java     |   2 +-
 ...Factory.java => ServiceStateRouterFactory.java} |  10 +-
 ...terFactory.java => FileStateRouterFactory.java} |  18 +-
 .../cluster/router/mesh/route/MeshRuleRouter.java  |  12 +-
 .../cluster/router/mock/MockInvokersSelector.java  |  79 ++--
 ...terFactory.java => MockStateRouterFactory.java} |  10 +-
 .../{ScriptRouter.java => ScriptStateRouter.java}  |  36 +-
 ...rFactory.java => ScriptStateRouterFactory.java} |  10 +-
 .../cluster/router/state/AbstractStateRouter.java  |  61 +--
 .../dubbo/rpc/cluster/router/state/BitList.java    | 484 +++++++++++++++------
 .../router/state/CacheableStateRouterFactory.java  |  12 +-
 .../rpc/cluster/router/state/RouterCache.java      |  49 ---
 .../rpc/cluster/router/state/StateRouter.java      |  54 +--
 .../cluster/router/state/StateRouterFactory.java   |   3 +-
 .../{AddrCache.java => StateRouterResult.java}     |  48 +-
 .../cluster/router/tag/TagDynamicStateRouter.java  | 260 -----------
 .../tag/{TagRouter.java => TagStateRouter.java}    |  67 +--
 ...uterFactory.java => TagStateRouterFactory.java} |   9 +-
 .../cluster/router/tag/TagStaticStateRouter.java   | 142 ------
 .../cluster/support/AbstractClusterInvoker.java    | 137 ++++--
 .../rpc/cluster/support/AvailableCluster.java      |   8 +-
 .../support/wrapper/MockClusterInvoker.java        |   2 +
 .../org.apache.dubbo.rpc.cluster.RouterFactory     |   6 -
 ...bbo.rpc.cluster.router.state.StateRouterFactory |   8 +-
 .../apache/dubbo/rpc/cluster/RouterChainTest.java  |   7 +-
 .../rpc/cluster/directory/StaticDirectoryTest.java |  25 +-
 .../loadbalance/ConsistentHashLoadBalanceTest.java |   8 +-
 .../router/condition/ConditionRouterTest.java      | 253 ++++++-----
 .../cluster/router/file/FileRouterEngineTest.java  |  18 +-
 .../router/mesh/route/MeshRuleRouterTest.java      |  19 +-
 .../router/mock/MockInvokersSelectorTest.java      |  11 +-
 ...tRouterTest.java => ScriptStateRouterTest.java} |  59 +--
 .../rpc/cluster/router/state/BitListTest.java      | 479 +++++++++++++++++++-
 .../support/AbstractClusterInvokerTest.java        |  11 +-
 .../support/ConnectivityValidationTest.java        | 323 ++++++++++++++
 .../support/FailoverClusterInvokerTest.java        |  10 +-
 .../org.apache.dubbo.rpc.cluster.RouterFactory     |   1 -
 ...bbo.rpc.cluster.router.state.StateRouterFactory |   1 +
 .../apache/dubbo/common/BaseServiceMetadata.java   |   4 +-
 .../src/main/java/org/apache/dubbo/common/URL.java | 112 +++--
 .../common/beans/ScopeBeanExtensionInjector.java   |   1 +
 .../common/beans/factory/ScopeBeanFactory.java     |   4 +-
 .../beans/support/InstantiationStrategy.java       |   2 +-
 .../common/config/CompositeConfiguration.java      |   4 +-
 .../apache/dubbo/common/config/Environment.java    |   9 +-
 .../config/OrderedPropertiesConfiguration.java     |  10 +-
 .../dubbo/common/constants/CommonConstants.java    |  17 +-
 .../dubbo/common/deploy/AbstractDeployer.java      |  12 +-
 .../org/apache/dubbo/common/deploy/Deployer.java   |   1 +
 .../dubbo/common/extension/ExtensionDirector.java  |   9 +-
 .../dubbo/common/extension/ExtensionLoader.java    |  38 +-
 .../dubbo/common/extension/LoadingStrategy.java    |   4 +-
 .../extension/inject/SpiExtensionInjector.java     |   1 +
 .../extension/support/ActivateComparator.java      |  10 +-
 .../org/apache/dubbo/common/io/StreamUtils.java    |   4 +-
 .../common/io/UnsafeByteArrayOutputStream.java     |  16 +-
 .../apache/dubbo/common/io/UnsafeStringWriter.java |   4 +-
 .../dubbo/common/lang/ShutdownHookCallbacks.java   |   2 +-
 .../common/resource/GlobalResourcesRepository.java |  22 +-
 .../reporter/FrameworkStatusReportService.java     |  12 +-
 .../dubbo/common/threadlocal/InternalRunnable.java |   2 +-
 .../manager/DefaultExecutorRepository.java         |  32 +-
 .../threadpool/manager/ExecutorRepository.java     |   7 +
 .../threadpool/serial/SerializingExecutor.java     |   2 +-
 .../dubbo/common/timer/HashedWheelTimer.java       |   4 +-
 .../common/url/component/ServiceAddressURL.java    |   6 +
 .../common/url/component/ServiceConfigURL.java     |  14 +-
 .../dubbo/common/url/component/URLAddress.java     |   2 +-
 .../common/utils/ClassLoaderResourceLoader.java    |  18 +-
 .../org/apache/dubbo/common/utils/ConfigUtils.java |  10 +-
 .../org/apache/dubbo/common/utils/MD5Utils.java    |  19 +-
 .../dubbo/config/AbstractInterfaceConfig.java      |   7 +
 .../apache/dubbo/config/AbstractMethodConfig.java  |   4 +
 .../dubbo/config/AbstractReferenceConfig.java      |   8 +
 .../apache/dubbo/config/AbstractServiceConfig.java |   8 +
 .../org/apache/dubbo/config/ApplicationConfig.java |   4 +
 .../apache/dubbo/config/ConfigCenterConfig.java    |   5 +
 .../org/apache/dubbo/config/ConsumerConfig.java    |   9 +
 .../apache/dubbo/config/MetadataReportConfig.java  |  10 +
 .../java/org/apache/dubbo/config/MethodConfig.java |   5 +
 .../org/apache/dubbo/config/MetricsConfig.java     |   6 +-
 .../java/org/apache/dubbo/config/ModuleConfig.java |   9 +
 .../org/apache/dubbo/config/MonitorConfig.java     |  10 +
 .../org/apache/dubbo/config/ProtocolConfig.java    |  57 +--
 .../org/apache/dubbo/config/ProviderConfig.java    |  74 +---
 .../apache/dubbo/config/ReferenceConfigBase.java   |  15 +
 .../org/apache/dubbo/config/RegistryConfig.java    |  18 +-
 .../org/apache/dubbo/config/ServiceConfigBase.java |  16 +-
 .../java/org/apache/dubbo/config/SslConfig.java    |   8 +
 .../dubbo/config/annotation/DubboReference.java    |   4 +-
 .../dubbo/config/annotation/DubboService.java      |   2 +-
 .../config/context/AbstractConfigManager.java      |  17 +-
 .../apache/dubbo/config/context/ConfigManager.java |   2 +-
 .../dubbo/config/context/ModuleConfigManager.java  | 126 +++++-
 .../apache/dubbo/rpc/model/ApplicationModel.java   |   5 +-
 .../org/apache/dubbo/rpc/model/FrameworkModel.java |  62 +--
 .../rpc/model/FrameworkServiceRepository.java      |  13 +-
 .../apache/dubbo/rpc/model/MethodDescriptor.java   |   3 -
 .../org/apache/dubbo/rpc/model/ScopeModel.java     |   4 +
 .../model/ScopeModelAwareExtensionProcessor.java   |   2 +-
 .../apache/dubbo/rpc/model/ServiceMetadata.java    |   2 +-
 .../common/CommonScopeModelInitializerTest.java    |  62 +++
 .../test/java/org/apache/dubbo/common/URLTest.java |  76 +++-
 .../common/config/CompositeConfigurationTest.java  |  21 +-
 ...rationTest.java => ConfigurationCacheTest.java} |  18 +-
 .../dubbo/common/config/EnvironmentTest.java       |  63 ++-
 ...ava => OrderedPropertiesConfigurationTest.java} |   5 +-
 .../common/config/PropertiesConfigurationTest.java |  26 +-
 .../file/FileSystemDynamicConfigurationTest.java   |   5 +-
 .../common/extension/ExtensionLoaderTest.java      |  22 +-
 .../impl/{Ext5Impl1.java => Ext6Impl1.java}        |   4 +-
 .../impl/{Ext5Impl2.java => Ext6Impl2.java}        |   4 +-
 .../impl/{Ext5Wrapper1.java => Ext6Wrapper1.java}  |   4 +-
 .../impl/{Ext5Wrapper2.java => Ext6Wrapper2.java}  |   4 +-
 .../inject/AdaptiveExtensionInjectorTest.java      |  58 +++
 .../dubbo/common/io/UnsafeStringWriterTest.java    |   4 +-
 .../resource/GlobalResourcesRepositoryTest.java    |  77 ++++
 .../reporter/FrameworkStatusReportServiceTest.java | 106 +++++
 .../threadlocal/InternalThreadLocalTest.java       |   6 +
 .../dubbo/common/utils/AnnotationUtilsTest.java    |  74 ++--
 .../utils/ClassLoaderResourceLoaderTest.java       |  58 +++
 .../apache/dubbo/common/utils/ConfigUtilsTest.java |  10 +
 .../apache/dubbo/common/utils/MD5UtilsTest.java    |  95 ++++
 .../context/ConfigConfigurationAdapterTest.java}   |  25 +-
 .../dubbo/config/context/ConfigManagerTest.java    | 104 ++++-
 .../dubbo/rpc/model/ApplicationModelTest.java      | 146 +++++++
 .../apache/dubbo/rpc/model/FrameworkModelTest.java | 106 +++++
 .../rpc/model/FrameworkServiceRepositoryTest.java  | 113 +++++
 .../apache/dubbo/rpc/model/ModuleModelTest.java    |  89 ++++
 .../rpc/model/ModuleServiceRepositoryTest.java     | 113 +++++
 .../ScopeModelAwareExtensionProcessorTest.java     |  78 ++++
 .../org/apache/dubbo/rpc/model/ScopeModelTest.java |   9 +-
 .../apache/dubbo/rpc/model/ScopeModelUtilTest.java | 114 +++++
 .../dubbo/rpc/model/ServiceRepositoryTest.java     |  90 ++++
 .../support/DemoService.java}                      |   8 +-
 .../support/DemoServiceImpl.java}                  |  11 +-
 .../dubbo/rpc/support/MockScopeModelAware.java     |  72 +++
 .../support/MockScopeModelDestroyListener.java}    |  26 +-
 ...che.dubbo.common.extension.ext6_wrap.WrappedExt |   8 +-
 ....common.status.reporter.FrameworkStatusReporter |   1 +
 .../src/test/resources/dubbo-migration.yaml        |   6 +-
 .../main/java/com/alibaba/dubbo/common/URL.java    |   5 +-
 dubbo-config/dubbo-config-api/pom.xml              |  12 -
 .../org/apache/dubbo/config/ReferenceConfig.java   |  21 +-
 .../org/apache/dubbo/config/ServiceConfig.java     |  28 +-
 .../config/deploy/DefaultApplicationDeployer.java  | 177 +++++---
 .../dubbo/config/deploy/DefaultModuleDeployer.java |  63 ++-
 .../invoker/DelegateProviderMetaDataInvoker.java   |   3 +-
 .../dubbo/config/utils/SimpleReferenceCache.java   |  13 +-
 .../dubbo/config/AbstractReferenceConfigTest.java  |  19 +-
 .../dubbo/config/ConfigCenterConfigTest.java       |  13 +-
 .../config/ConfigScopeModelInitializerTest.java}   |  37 +-
 .../apache/dubbo/config/ReferenceConfigTest.java   |  19 +-
 .../apache/dubbo/config/RegistryConfigTest.java    |   7 +-
 .../dubbo/config/bootstrap/DubboBootstrapTest.java |  30 +-
 .../bootstrap/DubboServiceConsumerBootstrap.java   |   5 +-
 .../bootstrap/DubboServiceProviderBootstrap.java   |   7 +-
 .../DubboServiceProviderMinimumBootstrap.java      |   3 +-
 .../dubbo/config/bootstrap/MultiInstanceTest.java  |  44 +-
 .../ZookeeperDubboServiceConsumerBootstrap.java    |   3 +-
 .../DubboInterfaceConsumerBootstrap.java           |   3 +-
 .../AbstractRegistryCenterExporterListener.java    |   2 +-
 .../AbstractRegistryCenterServiceListener.java     |   2 +-
 .../dubbo/{ => config}/integration/Constants.java  |   2 +-
 .../{ => config}/integration/IntegrationTest.java  |   2 +-
 .../integration/multiple/AbstractStorage.java      |   2 +-
 .../{ => config}/integration/multiple/Storage.java |   2 +-
 ...gistryCenterExportMetadataExporterListener.java |   4 +-
 ...egistryCenterExportMetadataIntegrationTest.java |  25 +-
 ...ultipleRegistryCenterExportMetadataService.java |   2 +-
 ...pleRegistryCenterExportMetadataServiceImpl.java |   2 +-
 ...egistryCenterExportMetadataServiceListener.java |   4 +-
 ...gistryCenterExportProviderExporterListener.java |   4 +-
 ...MultipleRegistryCenterExportProviderFilter.java |   2 +-
 ...egistryCenterExportProviderIntegrationTest.java |  27 +-
 ...nterExportProviderRegistryProtocolListener.java |   2 +-
 ...ultipleRegistryCenterExportProviderService.java |   2 +-
 ...pleRegistryCenterExportProviderServiceImpl.java |   2 +-
 ...egistryCenterExportProviderServiceListener.java |   4 +-
 ...ultipleRegistryCenterInjvmExporterListener.java |   4 +-
 .../injvm/MultipleRegistryCenterInjvmFilter.java   |   2 +-
 ...MultipleRegistryCenterInjvmIntegrationTest.java |  29 +-
 .../injvm/MultipleRegistryCenterInjvmService.java  |   2 +-
 .../MultipleRegistryCenterInjvmServiceImpl.java    |   2 +-
 ...MultipleRegistryCenterInjvmServiceListener.java |   4 +-
 .../integration/multiple/package-info.java         |   2 +-
 ...terServiceDiscoveryRegistryIntegrationTest.java |  41 +-
 ...ceDiscoveryRegistryRegistryServiceListener.java |   4 +-
 ...istryCenterServiceDiscoveryRegistryService.java |   2 +-
 ...yCenterServiceDiscoveryRegistryServiceImpl.java |   2 +-
 .../ServiceDiscoveryRegistryInfoWrapper.java       |   2 +-
 .../ServiceDiscoveryRegistryStorage.java           |   4 +-
 ...RegistryCenterDubboProtocolIntegrationTest.java |  22 +-
 ...ingleRegistryCenterExportedServiceListener.java |   4 +-
 .../SingleRegistryCenterIntegrationService.java    |   2 +-
 ...SingleRegistryCenterIntegrationServiceImpl.java |   2 +-
 ...gistryCenterExportMetadataExporterListener.java |   4 +-
 ...egistryCenterExportMetadataIntegrationTest.java |  23 +-
 .../SingleRegistryCenterExportMetadataService.java |   2 +-
 ...gleRegistryCenterExportMetadataServiceImpl.java |   2 +-
 ...egistryCenterExportMetadataServiceListener.java |   4 +-
 ...gistryCenterExportProviderExporterListener.java |   4 +-
 .../SingleRegistryCenterExportProviderFilter.java  |   2 +-
 ...egistryCenterExportProviderIntegrationTest.java |  24 +-
 ...nterExportProviderRegistryProtocolListener.java |   4 +-
 .../SingleRegistryCenterExportProviderService.java |   2 +-
 ...gleRegistryCenterExportProviderServiceImpl.java |   2 +-
 ...egistryCenterExportProviderServiceListener.java |   4 +-
 .../SingleRegistryCenterInjvmExporterListener.java |   4 +-
 .../injvm/SingleRegistryCenterInjvmFilter.java     |   2 +-
 .../SingleRegistryCenterInjvmIntegrationTest.java  |  23 +-
 .../injvm/SingleRegistryCenterInjvmService.java    |   2 +-
 .../SingleRegistryCenterInjvmServiceImpl.java      |   2 +-
 .../SingleRegistryCenterInjvmServiceListener.java  |   4 +-
 .../integration/single/package-info.java           |   2 +-
 .../metadata/MetadataServiceExporterTest.java      | 252 +++++++++++
 .../registrycenter/AbstractRegistryCenter.java     | 107 -----
 .../dubbo/registrycenter/RegistryCenter.java       |  70 ---
 .../ZookeeperMultipleRegistryCenter.java           |  45 --
 .../registrycenter/ZookeeperRegistryCenter.java    | 142 ------
 .../org.apache.dubbo.config.ServiceListener        |  14 +-
 ...g.apache.dubbo.registry.RegistryServiceListener |   2 +-
 ...o.registry.integration.RegistryProtocolListener |   4 +-
 .../services/org.apache.dubbo.rpc.ExporterListener |  12 +-
 .../META-INF/services/org.apache.dubbo.rpc.Filter  |   8 +-
 dubbo-config/dubbo-config-spring/pom.xml           |  22 -
 .../dubbo/config/spring/ConfigCenterBean.java      |   9 +
 .../apache/dubbo/config/spring/ServiceBean.java    |  11 +
 .../config/spring/SpringScopeModelInitializer.java |   3 +-
 .../annotation/ServiceAnnotationPostProcessor.java |  10 +-
 .../spring/context/DubboConfigBeanInitializer.java |  12 +-
 .../config/spring/reference/ReferenceCreator.java  | 139 ++----
 .../org/apache/dubbo/config/spring/ConfigTest.java |  15 -
 .../dubbo/config/spring/JavaConfigBeanTest.java    |  19 +-
 .../annotation/MethodConfigCallbackTest.java       |   9 +-
 .../factory/annotation/ReferenceCreatorTest.java   |  40 +-
 .../XmlReferenceBeanConditionalTest.java           |   7 -
 ...nfigAnnotationReferenceBeanConditionalTest.java |   7 -
 .../JavaConfigRawReferenceBeanConditionalTest.java |   7 -
 .../JavaConfigReferenceBeanConditionalTest4.java   |   7 -
 .../configprops/SpringBootConfigPropsTest.java     |  64 ++-
 .../SpringBootMultipleConfigPropsTest.java         |  17 +-
 .../importxml/SpringBootImportDubboXmlTest.java    |   7 -
 .../annotation/DubboConfigConfigurationTest.java   |  24 +-
 .../context/annotation/EnableDubboConfigTest.java  |   7 -
 .../customize/DubboSpringInitCustomizerTest.java   |  11 +-
 .../spring/issues/issue6000/Issue6000Test.java     |   7 -
 .../spring/issues/issue6252/Issue6252Test.java     |   7 -
 .../spring/issues/issue7003/Issue7003Test.java     |   7 -
 .../issue9172/MultipleConsumerAndProviderTest.java | 105 +++++
 .../issues/issue9207/ConfigCenterBeanTest.java     | 108 +++++
 .../consumer/PropertyConfigurerTest.java           |   7 -
 .../propertyconfigurer/consumer/app.properties     |   2 +-
 .../propertyconfigurer/consumer/dubbo-consumer.xml |   2 +-
 .../consumer2/PropertySourcesConfigurerTest.java   |   7 -
 .../propertyconfigurer/consumer2/app.properties    |   2 +-
 .../consumer2/dubbo-consumer.xml                   |   2 +-
 .../consumer3/PropertySourcesInJavaConfigTest.java |  16 -
 .../propertyconfigurer/consumer3/app.properties    |   2 +-
 .../consumer3/dubbo-consumer.xml                   |   2 +-
 .../propertyconfigurer/provider/app.properties     |   6 +-
 .../reference/DubboConfigBeanInitializerTest.java  |   8 +-
 .../config/spring/reference/ReferenceKeyTest.java  |  18 -
 .../javaconfig/JavaConfigReferenceBeanTest.java    |  19 -
 .../reference/javaconfig/consumer.properties       |   2 +-
 .../spring/reference/localcall/LocalCallTest.java  |   8 -
 .../spring/reference/localcall/LocalCallTest2.java |   7 -
 .../reference/localcall/local-call-provider.xml    |   2 +-
 .../LocalCallMultipleReferenceAnnotationsTest.java |  12 -
 .../localcallam/local-call-config.properties       |   2 +-
 .../registrycenter/AbstractRegistryCenter.java     | 107 -----
 .../spring/registrycenter/RegistryCenter.java      |  75 ----
 .../ZookeeperMultipleRegistryCenter.java           |  43 --
 .../registrycenter/ZookeeperRegistryCenter.java    | 147 -------
 .../ZookeeperSingleRegistryCenter.java             |  44 --
 .../config/spring/schema/GenericServiceTest.java   |   7 -
 .../schema/GenericServiceWithoutInterfaceTest.java |   7 -
 .../META-INF/issues/issue6000/config.properties    |   2 +-
 .../META-INF/issues/issue6252/config.properties    |   4 +-
 .../META-INF/issues/issue7003/config.properties    |   2 +-
 .../META-INF/issues/issue9172/consumer.properties  |  30 ++
 .../META-INF/issues/issue9172/provider.properties  |  24 +
 .../dubbo-properties-in-configcenter.properties    |   6 +-
 .../zookeeper-dubbb-consumer.properties            |   2 +-
 .../zookeeper-dubbb-provider.properties            |   2 +-
 .../zookeeper-dubbo-consumer.xml                   |   4 +-
 .../dubbo-generic-consumer-without-interface.xml   |   2 +-
 .../META-INF/spring/dubbo-generic-consumer.xml     |   2 +-
 .../support/apollo/ApolloDynamicConfiguration.java |  66 +--
 .../support/nacos/NacosDynamicConfiguration.java   |   4 +-
 .../dubbo-configcenter-zookeeper/pom.xml           |   5 -
 .../ZookeeperDynamicConfigurationTest.java         |  98 ++---
 .../resources/spring/dubbo-consumer.properties     |   1 +
 .../resources/spring/dubbo-provider.properties     |   2 +-
 .../apache/dubbo/demo/consumer/Application.java    |  13 +-
 .../apache/dubbo/demo/provider/Application.java    |   3 +
 .../dubbo/demo/consumer/GenericApplication.java    |   2 +
 .../dubbo/demo/graalvm/consumer/Application.java   |  17 +-
 .../dubbo/demo/graalvm/provider/Application.java   |  15 +-
 .../dubbo-demo-spring-boot-consumer}/pom.xml       |  90 ++--
 .../demo/consumer/ConsumerApplication.java         |  47 ++
 .../src/main/resources/application.yml             |  29 ++
 .../src/main/resources/log4j.properties            |   0
 .../dubbo-demo-spring-boot-interface}/pom.xml      |  20 +-
 .../apache/dubbo/springboot/demo/DemoService.java  |  13 +-
 .../dubbo-demo-spring-boot-provider}/pom.xml       |  91 ++--
 .../springboot/demo/provider/DemoServiceImpl.java  |  21 +-
 .../demo/provider/ProviderApplication.java}        |  20 +-
 .../src/main/resources/application.yml             |  29 ++
 .../src/main/resources/log4j.properties            |   0
 .../dubbo-demo-spring-boot}/pom.xml                |  28 +-
 .../apache/dubbo/demo/consumer/ApiConsumer.java    |  12 +-
 .../dubbo/demo/consumer/ApiWrapperConsumer.java    |   9 +-
 .../apache/dubbo/demo/provider/ApiProvider.java    |  10 +-
 .../dubbo/demo/provider/ApiWrapperProvider.java    |  10 +-
 .../src/main/resources/spring/dubbo-consumer.xml   |   4 +
 .../demo/provider/chain/ChainServiceImpl.java      |  33 --
 .../src/main/resources/dubbo.properties            |   1 -
 .../main/resources/spring/dubbo-provider-chain.xml |  35 --
 dubbo-demo/pom.xml                                 |   1 +
 dubbo-dependencies-bom/pom.xml                     |  20 +-
 dubbo-distribution/dubbo-all/pom.xml               |   4 -
 dubbo-metadata/dubbo-metadata-api/pom.xml          |   6 -
 .../org/apache/dubbo/metadata/MetadataInfo.java    |   4 +
 .../apache/dubbo/metadata/RevisionResolver.java    |   4 +-
 .../dubbo/metadata/rest/SpringRestService.java     |  10 +-
 .../dubbo/metadata/rest/SpringRestService.java     |  10 +-
 .../metadata/store/nacos/NacosMetadataReport.java  |  14 +-
 dubbo-metadata/dubbo-metadata-report-redis/pom.xml |   5 -
 .../dubbo-metadata-report-zookeeper/pom.xml        |   5 -
 .../zookeeper/ZookeeperMetadataReportTest.java     |  21 +-
 .../java/org/apache/dubbo/monitor/Constants.java   |  36 +-
 .../org/apache/dubbo/monitor/MonitorService.java   |  38 --
 .../dubbo/monitor/support/MonitorFilter.java       |  43 +-
 .../dubbo/monitor/support/MonitorFilterTest.java   |  39 +-
 .../apache/dubbo/monitor/dubbo/DubboMonitor.java   | 141 +++---
 .../apache/dubbo/monitor/dubbo/MetricsFilter.java  |   6 +-
 .../org/apache/dubbo/monitor/dubbo/Statistics.java |  23 +-
 .../apache/dubbo/monitor/dubbo/StatisticsItem.java | 132 ++++++
 .../dubbo/monitor/dubbo/DubboMonitorTest.java      | 106 +++--
 .../dubbo/monitor/dubbo/MetricsFilterTest.java     |   8 +-
 .../apache/dubbo/monitor/dubbo/StatisticsTest.java |  54 ++-
 .../META-INF/native-image/reflect-config.json      |   8 +-
 .../router/state/StateRouterFactory$Adaptive.java  |   6 +-
 .../dubbo/qos/command/CommandContextFactory.java   |   6 +-
 .../qos/command/decoder/HttpCommandDecoder.java    |   6 +-
 .../apache/dubbo/qos/command/impl/BaseOffline.java |   5 +-
 .../dubbo/qos/command/impl/ChangeTelnet.java       |   3 +-
 .../apache/dubbo/qos/command/impl/CountTelnet.java |   4 +-
 .../org/apache/dubbo/qos/command/impl/Help.java    |  14 +-
 .../dubbo/qos/command/impl/InvokeTelnet.java       |  13 +-
 .../org/apache/dubbo/qos/command/impl/Live.java    |  23 +-
 .../apache/dubbo/qos/command/impl/OfflineApp.java  |   3 -
 .../org/apache/dubbo/qos/command/impl/Online.java  |  12 +-
 .../apache/dubbo/qos/command/impl/OnlineApp.java   |   2 +-
 .../apache/dubbo/qos/command/impl/PortTelnet.java  |   2 +-
 .../apache/dubbo/qos/command/impl/PwdTelnet.java   |   3 +-
 .../dubbo/qos/command/impl/SelectTelnet.java       |   3 +-
 .../dubbo/qos/command/util/CommandHelper.java      |   2 +-
 .../dubbo/qos/legacy/ChangeTelnetHandler.java      |   3 +-
 .../dubbo/qos/legacy/TraceTelnetHandler.java       |   6 +-
 .../org/apache/dubbo/qos/probe/LivenessProbe.java  |   2 +-
 .../org/apache/dubbo/qos/probe/ReadinessProbe.java |   2 +-
 .../org/apache/dubbo/qos/probe/StartupProbe.java   |   2 +-
 .../qos/server/handler/HttpProcessHandler.java     |   4 +-
 .../command/decoder/HttpCommandDecoderTest.java    |  10 +-
 .../dubbo/qos/command/impl/InvokeTelnetTest.java   |  10 +-
 .../apache/dubbo/qos/command/impl/LiveTest.java    |  52 +++
 .../org/apache/dubbo/qos/command/impl/LsTest.java  | 177 ++++----
 .../dubbo/qos/command/impl/MockLivenessProbe.java  |  24 +-
 .../apache/dubbo/qos/command/impl/OfflineTest.java | 170 +++++---
 .../apache/dubbo/qos/command/impl/OnlineTest.java  | 162 ++++---
 .../qos/command/impl/PublishMetadataTest.java      |  78 ++++
 .../apache/dubbo/qos/command/impl/ReadyTest.java   |  78 ++++
 .../apache/dubbo/qos/command/impl/StartupTest.java |  75 ++++
 .../dubbo/qos/legacy/service/DemoServiceImpl.java  |   4 +-
 .../qos/server/handler/HttpProcessHandlerTest.java |  16 +-
 .../org.apache.dubbo.qos.probe.LivenessProbe       |   1 +
 .../dubbo/registry/ListenerRegistryWrapper.java    |   4 +-
 .../registry/client/DefaultServiceInstance.java    |  76 +++-
 .../dubbo/registry/client/InstanceAddressURL.java  |   6 +-
 .../client/ServiceDiscoveryRegistryDirectory.java  |  47 +-
 .../dubbo/registry/client/ServiceInstance.java     |  10 +-
 .../listener/ServiceInstancesChangedListener.java  |   7 +-
 .../registry/client/metadata/MetadataUtils.java    |   4 +-
 .../StandardMetadataServiceURLBuilder.java         |  10 +-
 .../DefaultMigrationAddressComparator.java         |  20 +-
 .../client/migration/MigrationInvoker.java         |   2 +-
 .../integration/AbstractConfiguratorListener.java  |  27 +-
 .../registry/integration/DynamicDirectory.java     |  30 +-
 .../registry/integration/RegistryDirectory.java    |  89 ++--
 .../support/CacheableFailbackRegistry.java         |   2 +-
 .../client/DefaultServiceInstanceTest.java         |   2 +-
 .../client/metadata/MetadataUtilsTest.java         |  31 +-
 .../StandardMetadataServiceURLBuilderTest.java     |   9 +-
 .../registry/support/FailbackRegistryTest.java     |  38 +-
 dubbo-registry/dubbo-registry-multiple/pom.xml     |   5 -
 .../multiple/MultipleRegistry2S2RTest.java         |  61 +--
 .../apache/dubbo/registry/nacos/NacosRegistry.java |  45 +-
 dubbo-registry/dubbo-registry-zookeeper/pom.xml    |   5 -
 .../registry/zookeeper/ZookeeperRegistryTest.java  |  24 +-
 .../zookeeper/ZookeeperServiceDiscoveryTest.java   |  14 +-
 .../zookeeper/util/CuratorFrameworkUtilsTest.java  |  16 +-
 .../org/apache/dubbo/remoting/api/SslContexts.java |  50 ++-
 .../exchange/PortUnificationExchanger.java         |   5 +-
 .../remoting/exchange/codec/ExchangeCodec.java     |   2 -
 .../telnet/support/command/ClearTelnetHandler.java |   3 +-
 .../telnet/support/command/ExitTelnetHandler.java  |   2 +-
 .../telnet/support/command/HelpTelnetHandler.java  |  66 +--
 .../dubbo/remoting/transport/AbstractClient.java   |  28 +-
 .../dubbo/remoting/http/jetty/JettyHttpServer.java |   9 +-
 .../remoting/http/jetty/JettyLoggerAdapter.java    | 157 +++++++
 .../http/jetty/JettyLoggerAdapterTest.java         | 127 ++++++
 .../src/test/resources/log4j.xml                   |  41 ++
 .../dubbo-remoting-zookeeper-curator5/pom.xml      |   6 -
 .../curator5/Curator5ZookeeperClient.java          |  12 +-
 .../curator5/Curator5ZookeeperClientTest.java      |  27 +-
 .../curator5/Curator5ZookeeperTransporterTest.java |  21 +-
 .../support/AbstractZookeeperTransporterTest.java  | 134 ++----
 dubbo-remoting/dubbo-remoting-zookeeper/pom.xml    |   5 -
 .../zookeeper/curator/CuratorZookeeperClient.java  |  12 +-
 .../curator/CuratorZookeeperClientTest.java        |  27 +-
 .../curator/CuratorZookeeperTransporterTest.java   |  22 +-
 .../support/AbstractZookeeperTransporterTest.java  | 137 +++---
 .../org/apache/dubbo/rpc/RpcContextAttachment.java |   4 +-
 .../java/org/apache/dubbo/rpc/RpcInvocation.java   |  20 +-
 .../org/apache/dubbo/rpc/filter/ContextFilter.java |   2 +-
 .../apache/dubbo/rpc/CancellationContextTest.java  |  61 +++
 .../dubbo/rpc/protocol/grpc/GrpcOptionsUtils.java  |  48 +-
 .../dubbo/rpc/protocol/grpc/GrpcProtocolTest.java  |   8 +-
 .../dubbo/rpc/protocol/injvm/InjvmInvoker.java     |   6 +-
 .../rpc/protocol/tri/AbstractClientStream.java     |   6 +-
 .../dubbo/rpc/protocol/tri/AbstractStream.java     |   5 +-
 .../tri/ClientOutboundTransportObserver.java       |  36 +-
 .../apache/dubbo/rpc/protocol/tri/Compressor.java  |   3 +
 .../apache/dubbo/rpc/protocol/tri/GrpcStatus.java  |   2 +-
 .../protocol/tri/OutboundTransportObserver.java    |  16 +-
 .../tri/ServerOutboundTransportObserver.java       |  51 +--
 .../rpc/protocol/tri/SingleProtobufUtils.java      |  17 +-
 .../dubbo/rpc/protocol/tri/TransportState.java     |   3 +-
 .../protocol/tri/TripleClientRequestHandler.java   |   5 +-
 .../protocol/tri/TripleCommandOutBoundHandler.java |  29 +-
 .../dubbo/rpc/protocol/tri/TripleHeaderEnum.java   |   3 -
 .../tri/TripleHttp2FrameServerHandler.java         |  25 +-
 .../rpc/protocol/tri/TripleHttp2Protocol.java      |   1 +
 .../dubbo/rpc/protocol/tri/TripleProtocol.java     |   3 -
 .../dubbo/rpc/protocol/tri/UnaryClientStream.java  |   2 +-
 .../dubbo/rpc/protocol/tri/UnaryServerStream.java  |   2 +-
 .../apache/dubbo/rpc/protocol/tri/WriteQueue.java  |  87 ++++
 .../protocol/tri/command/CancelQueueCommand.java   |  34 +-
 .../rpc/protocol/tri/command/DataQueueCommand.java |  99 +++++
 .../protocol/tri/command/FlushQueueCommand.java    |  15 +-
 .../protocol/tri/command/HeaderQueueCommand.java   |  81 ++++
 .../rpc/protocol/tri/command/QueuedCommand.java    |  69 +++
 .../protocol/tri/command/TextDataQueueCommand.java |  46 ++
 .../protocol/tri/service/TriBuiltinService.java    |   2 +-
 .../rpc/protocol/tri/service/TriHealthImpl.java    |   2 +-
 .../dubbo/rpc/protocol/tri/AbstractStreamTest.java | 118 +++++
 .../dubbo/rpc/protocol/tri/ClientStreamTest.java   | 367 ++++++++++++++++
 .../rpc/protocol/tri/GrpcDataDecoderTest.java      | 101 +++++
 .../dubbo/rpc/protocol/tri/ServerStreamTest.java   | 291 +++++++++++++
 .../rpc/protocol/tri/SingleProtobufUtilsTest.java  |  77 ++++
 .../dubbo/rpc/protocol/tri/TransportStateTest.java |   2 +-
 .../tri/TripleHttp2ClientResponseHandlerTest.java  | 107 +++++
 .../dubbo/rpc/protocol/tri/TripleProtocolTest.java |  52 ++-
 .../dubbo/rpc/protocol/tri/WriteQueueTest.java     | 113 +++++
 .../tri/service/TriBuiltinServiceTest.java         |  43 ++
 .../protocol/tri/service/TriHealthImplTest.java    | 129 ++++++
 .../dubbo/rpc/protocol/tri/support/IGreeter.java   |   4 +
 .../rpc/protocol/tri/support/IGreeterImpl.java     |  15 +-
 .../tri/support/MockAbstractStreamImpl.java        |  34 +-
 .../{IGreeterImpl.java => MockStreamObserver.java} |  44 +-
 .../dubbo/DefaultHessian2FactoryInitializer.java   |   2 +-
 .../dubbo/WhitelistHessian2FactoryInitializer.java |   2 +-
 .../DubboListenerAutoConfiguration.java            |   7 -
 .../src/main/resources/META-INF/spring.factories   |   2 +
 dubbo-test/dubbo-test-check/pom.xml                |  37 +-
 ...bstractRegistryCenterTestExecutionListener.java | 100 +++++
 .../dubbo/test/check/RegistryCenterFinished.java   |  28 +-
 .../dubbo/test/check/RegistryCenterStarted.java    |  50 +++
 .../test/check/exception/DubboTestException.java   |  43 ++
 .../dubbo/test/check/registrycenter/Config.java    |  67 +++
 .../dubbo/test/check/registrycenter/Context.java   |   6 +-
 .../registrycenter/GlobalRegistryCenter.java}      |  35 +-
 .../test/check/registrycenter/Initializer.java     |  14 +-
 .../dubbo/test/check/registrycenter/Processor.java |  22 +-
 .../test/check/registrycenter/RegistryCenter.java  |  31 +-
 .../registrycenter/ZookeeperRegistryCenter.java    | 239 ++++++++++
 .../registrycenter/config/ZookeeperConfig.java     | 175 ++++++++
 .../config/ZookeeperRegistryCenterConfig.java      |  84 ++++
 .../registrycenter/context/ZookeeperContext.java   |  92 ++++
 .../context/ZookeeperWindowsContext.java           | 110 +++++
 .../initializer/ConfigZookeeperInitializer.java    | 143 ++++++
 .../initializer/DownloadZookeeperInitializer.java  | 177 ++++++++
 .../initializer/UnpackZookeeperInitializer.java    | 114 +++++
 .../initializer/ZookeeperInitializer.java          |  51 +++
 .../processor/FindPidWindowsProcessor.java         | 119 +++++
 .../processor/KillProcessWindowsProcessor.java     |  61 +++
 .../processor/ResetZookeeperProcessor.java         |  55 +++
 .../processor/StartZookeeperUnixProcessor.java     |  68 +++
 .../processor/StartZookeeperWindowsProcessor.java  |  81 ++++
 .../processor/StopZookeeperUnixProcessor.java      |  66 +++
 .../processor/StopZookeeperWindowsProcessor.java   |  52 +++
 .../processor/ZookeeperUnixProcessor.java          | 109 +++++
 .../processor/ZookeeperWindowsProcessor.java       |  41 ++
 ...g.junit.platform.launcher.TestExecutionListener |   4 +
 dubbo-test/dubbo-test-common/pom.xml               |  12 -
 .../dubbo/test/common/EmbeddedZooKeeper.java       | 248 -----------
 .../apache/dubbo/test/common/ZooKeeperServer.java  |  57 ---
 .../registrycenter/AbstractRegistryCenter.java     | 107 -----
 .../test/common/registrycenter/RegistryCenter.java |  70 ---
 .../ZookeeperMultipleRegistryCenter.java           |  43 --
 .../registrycenter/ZookeeperRegistryCenter.java    | 142 ------
 .../test/spring/SpringAnnotationBeanTest.java      |   7 -
 .../test/spring/SpringJavaConfigBeanTest.java      |  10 +-
 .../dubbo/test/spring/SpringXmlConfigTest.java     |   6 -
 .../src/main/resources/demo-app.properties         |   6 +-
 .../src/main/resources/spring/dubbo-demo.xml       |   6 +-
 534 files changed, 12634 insertions(+), 5970 deletions(-)

diff --cc dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
index d4e4774,887591b..154a993
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
@@@ -18,10 -18,11 +18,11 @@@ package org.apache.dubbo.common.config
  
  import org.apache.dubbo.common.logger.Logger;
  import org.apache.dubbo.common.logger.LoggerFactory;
+ import org.apache.dubbo.common.utils.ArrayUtils;
  
  import java.util.Arrays;
 -import java.util.LinkedList;
  import java.util.List;
 +import java.util.concurrent.CopyOnWriteArrayList;
  
  /**
   * This is an abstraction specially customized for the sequence Dubbo retrieves properties.
diff --cc dubbo-common/src/main/java/org/apache/dubbo/common/deploy/AbstractDeployer.java
index e01b46ac,ba53201..704f0ea
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/AbstractDeployer.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/deploy/AbstractDeployer.java
@@@ -37,9 -37,11 +37,11 @@@ public abstract class AbstractDeployer<
  
      private volatile DeployState state = PENDING;
  
+     private volatile Throwable lastError;
+ 
      protected AtomicBoolean initialized = new AtomicBoolean(false);
  
 -    private List<DeployListener<E>> listeners = new ArrayList<>();
 +    protected List<DeployListener<E>> listeners = new ArrayList<>();
  
      private E scopeModel;
  
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index 4a1a8df,0a07fc3..880fce3
--- 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
@@@ -739,12 -727,10 +748,11 @@@ public class ServiceConfig<T> extends S
       * @param name
       * @return
       */
 -    private Integer findConfigedPorts(ProtocolConfig protocolConfig,
 -                                      String name,
 -                                      Map<String, String> map) {
 +    private static synchronized Integer findConfiguredPort(ProtocolConfig protocolConfig,
 +                                                           ProviderConfig provider,
 +                                                           ExtensionLoader<Protocol> extensionLoader,
-                                                            String name,
-                                                            Map<String, String> map) {
-         Integer portToBind = null;
++                                                           String name,Map<String, String> map) {
+         Integer portToBind;
  
          // parse bind port from environment
          String port = getValueFromConfig(protocolConfig, DUBBO_PORT_TO_BIND);
@@@ -769,20 -755,20 +777,20 @@@
              }
          }
  
-         // registry port, not used as binding port by default
+         // save bind port, used as url's key later
+         map.put(BIND_PORT_KEY, String.valueOf(portToBind));
+ 
+         // registry port, not used as bind port by default
          String portToRegistryStr = getValueFromConfig(protocolConfig, DUBBO_PORT_TO_REGISTRY);
          Integer portToRegistry = parsePort(portToRegistryStr);
-         if (portToRegistry != null) {
-             portToBind = portToRegistry;
+         if (portToRegistry == null) {
+             portToRegistry = portToBind;
          }
  
-         // save binding port, will be used as key in url later
-         map.put(BIND_PORT_KEY, String.valueOf(portToBind));
- 
-         return portToBind;
+         return portToRegistry;
      }
  
 -    private Integer parsePort(String configPort) {
 +    private static Integer parsePort(String configPort) {
          Integer port = null;
          if (configPort != null && configPort.length() > 0) {
              try {
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
index 7645b6c,3688d67..b8ffa6f
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
@@@ -548,29 -581,30 +553,30 @@@ public class DefaultApplicationDeploye
          startModules();
  
          // prepare application instance
 -        prepareApplicationInstance();
 +//        prepareApplicationInstance();
  
-         executorRepository.getSharedExecutor().submit(() -> {
-             try {
-                 while (isStarting()) {
-                     // notify when any module state changed
-                     synchronized (stateLock) {
-                         try {
-                             stateLock.wait(500);
-                         } catch (InterruptedException e) {
-                             // ignore
-                         }
-                     }
- 
-                     // if has new module, do start again
-                     if (hasPendingModule()) {
-                         startModules();
-                     }
-                 }
-             } catch (Exception e) {
-                 logger.warn("waiting for application startup occurred an exception", e);
-             }
-         });
+         // Ignore checking new module after start
+ //        executorRepository.getSharedExecutor().submit(() -> {
+ //            try {
+ //                while (isStarting()) {
+ //                    // notify when any module state changed
+ //                    synchronized (stateLock) {
+ //                        try {
+ //                            stateLock.wait(500);
+ //                        } catch (InterruptedException e) {
+ //                            // ignore
+ //                        }
+ //                    }
+ //
+ //                    // if has new module, do start again
+ //                    if (hasPendingModule()) {
+ //                        startModules();
+ //                    }
+ //                }
+ //            } catch (Throwable e) {
+ //                onFailed(getIdentifier() + " check start occurred an exception", e);
+ //            }
+ //        });
      }
  
      private void startModules() {
@@@ -910,15 -1035,12 +938,12 @@@
              }
              // refresh metadata
              try {
 -                if (serviceInstance != null) {
 -                    ServiceInstanceMetadataUtils.refreshMetadataAndInstance(serviceInstance);
 +                if (registered) {
 +                    ServiceInstanceMetadataUtils.refreshMetadataAndInstance(applicationModel);
                  }
              } catch (Exception e) {
 -                logger.error("refresh metadata failed: " + e.getMessage(), e);
 +                logger.error("refresh meta and instance failed: " + e.getMessage(), e);
              }
-             // shutdown export/refer executor after started
-             executorRepository.shutdownServiceExportExecutor();
-             executorRepository.shutdownServiceReferExecutor();
          } finally {
              // complete future
              completeStartFuture(true);
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
index de27724,173b343..30d2892
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
@@@ -127,41 -127,50 +127,50 @@@ public class DefaultModuleDeployer exte
              throw new IllegalStateException(getIdentifier() + " is stopping or stopped, can not start again");
          }
  
-         if (isStarting() || isStarted()) {
-             return startFuture;
-         }
+         try {
+             if (isStarting() || isStarted()) {
+                 return startFuture;
+             }
  
-         onModuleStarting();
+             onModuleStarting();
  
-         // initialize
-         applicationDeployer.initialize();
-         initialize();
+             // initialize
+             applicationDeployer.initialize();
+             initialize();
  
-         // export services
-         exportServices();
+             // export services
+             exportServices();
  
 -            // prepare application instance
 -            // exclude internal module to avoid wait itself
 -            if (moduleModel != moduleModel.getApplicationModel().getInternalModule()) {
 -                applicationDeployer.prepareApplicationInstance();
 -            }
 +        // prepare application instance
 +        // exclude internal module to avoid wait itself
 +        if (moduleModel != moduleModel.getApplicationModel().getInternalModule()) {
 +            applicationDeployer.prepareInternalModule();
 +        }
  
-         // refer services
-         referServices();
- 
-         executorRepository.getSharedExecutor().submit(() -> {
-             try {
-                 // wait for export finish
-                 waitExportFinish();
-                 // wait for refer finish
-                 waitReferFinish();
-             } catch (Throwable e) {
-                 logger.warn("wait for export/refer services occurred an exception", e);
-             } finally {
+             // refer services
+             referServices();
+ 
+             // if no async export/refer services, just set started
+             if (asyncExportingFutures.isEmpty() && asyncReferringFutures.isEmpty()) {
                  onModuleStarted();
+             } else {
+                 executorRepository.getSharedExecutor().submit(() -> {
+                     try {
+                         // wait for export finish
+                         waitExportFinish();
+                         // wait for refer finish
+                         waitReferFinish();
+                     } catch (Throwable e) {
+                         logger.warn("wait for export/refer services occurred an exception", e);
+                     } finally {
+                         onModuleStarted();
+                     }
+                 });
              }
-         });
- 
+         } catch (Throwable e) {
+             onModuleFailed(getIdentifier() + " start failed: " + e.toString(), e);
+             throw e;
+         }
          return startFuture;
      }
  
diff --cc dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapTest.java
index e989cc8,15707bd..201991f
--- 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
@@@ -288,7 -275,7 +274,7 @@@ public class DubboBootstrapTest 
              .service(service)
              .start();
  
--        assertMetadataService(bootstrap, availablePort, true);
++        assertMetadataService(bootstrap, availablePort, false);
      }
  
      @Test
diff --cc dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
index 50ae00f,519f75a..f84a9b8
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
@@@ -21,8 -21,10 +21,8 @@@ import org.apache.dubbo.common.extensio
  import org.apache.dubbo.registry.Registry;
  import org.apache.dubbo.registry.RegistryServiceListener;
  import org.apache.dubbo.registry.client.ServiceDiscoveryRegistry;
 -import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;
  
- import static org.apache.dubbo.integration.Constants.MULTIPLE_CONFIG_CENTER_SERVICE_DISCOVERY_REGISTRY;
+ import static org.apache.dubbo.config.integration.Constants.MULTIPLE_CONFIG_CENTER_SERVICE_DISCOVERY_REGISTRY;
  
  
  @Activate(value = MULTIPLE_CONFIG_CENTER_SERVICE_DISCOVERY_REGISTRY)
diff --cc dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java
index f513003,a5f35f8..be60e4e
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/servicediscoveryregistry/ServiceDiscoveryRegistryInfoWrapper.java
@@@ -14,10 -14,10 +14,10 @@@
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
- package org.apache.dubbo.integration.multiple.servicediscoveryregistry;
+ package org.apache.dubbo.config.integration.multiple.servicediscoveryregistry;
  
 +import org.apache.dubbo.config.metadata.MetadataServiceDelegation;
  import org.apache.dubbo.registry.client.ServiceDiscoveryRegistry;
 -import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;
  
  /**
   * The instance to wrap {@link org.apache.dubbo.registry.client.ServiceDiscoveryRegistry}
diff --cc dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java
index fb76315,5b4b8dd..5f9f3f6
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/single/SingleRegistryCenterDubboProtocolIntegrationTest.java
@@@ -38,11 -36,10 +37,10 @@@ import org.apache.dubbo.registry.client
  import org.apache.dubbo.registry.client.migration.MigrationInvoker;
  import org.apache.dubbo.registry.support.RegistryManager;
  import org.apache.dubbo.registry.zookeeper.ZookeeperServiceDiscovery;
- import org.apache.dubbo.registrycenter.RegistryCenter;
- import org.apache.dubbo.registrycenter.ZookeeperSingleRegistryCenter;
  import org.apache.dubbo.rpc.cluster.Directory;
  import org.apache.dubbo.rpc.model.ApplicationModel;
+ import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
 +
  import org.junit.jupiter.api.AfterEach;
  import org.junit.jupiter.api.Assertions;
  import org.junit.jupiter.api.BeforeEach;
diff --cc dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml
index e8c9521,a89803c..d04700d
--- a/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml
+++ b/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml
@@@ -26,8 -26,12 +26,12 @@@
  
      <dubbo:metadata-report address="zookeeper://127.0.0.1:2181"/>
  
 -    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
 +    <dubbo:registry id="demo1" address="zookeeper://127.0.0.1:2181?registry-type=service"/>
  
+     <dubbo:protocol name="dubbo" port="-1"/>
+     <dubbo:protocol name="rest" port="-1"/>
+     <dubbo:protocol name="tri" port="-1"/>
+ 
      <dubbo:reference id="demoService" check="false"
                       interface="org.apache.dubbo.demo.DemoService"/>
  
diff --cc dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
index 5221ed2,3c3a614..38f103e
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java
@@@ -85,42 -76,36 +85,46 @@@ public class MetadataInfo implements Se
          this.revision = revision;
          this.services = services == null ? new ConcurrentHashMap<>() : services;
          this.extendParams = new ConcurrentHashMap<>();
 +        this.instanceParams = new ConcurrentHashMap<>();
      }
  
 -    public void addService(ServiceInfo serviceInfo) {
 -        if (serviceInfo == null) {
 -            return;
 -        }
 +    public synchronized void addService(URL url) {
 +        // fixme, pass in application mode context during initialization of MetadataInfo.
 +        this.loader = url.getOrDefaultApplicationModel().getExtensionLoader(MetadataParamsFilter.class);
 +        List<MetadataParamsFilter> filters = loader.getActivateExtension(url, "params-filter");
 +        // generate service level metadata
 +        ServiceInfo serviceInfo = new ServiceInfo(url, filters);
          this.services.put(serviceInfo.getMatchKey(), serviceInfo);
 -        markChanged();
 -    }
 +        // extract common instance level params
 +        extractInstanceParams(url, filters);
  
 -    public void removeService(ServiceInfo serviceInfo) {
 -        if (serviceInfo == null) {
 -            return;
 +        if (exportedServiceURLs == null) {
 +            exportedServiceURLs = new ConcurrentSkipListMap<>();
          }
 -        this.services.remove(serviceInfo.getMatchKey());
 -        markChanged();
 +        addURL(exportedServiceURLs, url);
 +        updated.compareAndSet(false, true);
      }
  
 -    public void removeService(String key) {
 -        if (key == null) {
 +    public synchronized void removeService(URL url) {
 +        if (url == null) {
              return;
          }
 -        this.services.remove(key);
 -        markChanged();
 +        this.services.remove(url.getProtocolServiceKey());
 +        if (exportedServiceURLs != null) {
 +            removeURL(exportedServiceURLs, url);
 +        }
 +
 +        updated.compareAndSet(false, true);
 +    }
 +
 +    public String getRevision() {
 +        return revision;
      }
  
+     public String getRevision() {
+         return revision;
+     }
+ 
      /**
       * Reported status and metadata modification must be synchronized if used in multiple threads.
       */
diff --cc dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
index 3a7f116,23e866a..e22fa59
--- a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
@@@ -34,13 -39,8 +39,7 @@@ import org.apache.dubbo.metadata.report
  import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
  import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
  import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 -import org.apache.dubbo.rpc.RpcException;
  
- import com.alibaba.nacos.api.NacosFactory;
- import com.alibaba.nacos.api.PropertyKeyConst;
- import com.alibaba.nacos.api.config.listener.AbstractSharedListener;
- import com.alibaba.nacos.api.exception.NacosException;
- import com.google.gson.Gson;
- 
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.Collections;
diff --cc dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
index 9c07dbb,86732aa..28873d7
--- a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
+++ b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
@@@ -30,12 -29,9 +31,10 @@@ import org.apache.dubbo.metadata.report
  import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
  import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
  import org.apache.dubbo.rpc.model.ApplicationModel;
 +
- import com.google.gson.Gson;
- import org.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.BeforeAll;
  import org.junit.jupiter.api.Test;
  
  import java.util.Arrays;
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java
index a191826,f7f5aaa..cdfbf78
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java
@@@ -130,16 -140,23 +130,19 @@@ public class ServiceInstancesChangedLis
              String revision = entry.getKey();
              List<ServiceInstance> subInstances = entry.getValue();
              ServiceInstance instance = selectInstance(subInstances);
 -            MetadataInfo metadata = getRemoteMetadata(revision, localServiceToRevisions, instance);
 +            MetadataInfo metadata = serviceDiscovery.getRemoteMetadata(revision, instance);
 +            parseMetadata(revision, metadata, localServiceToRevisions);
              // update metadata into each instance, in case new instance created.
              for (ServiceInstance tmpInstance : subInstances) {
-                 ((DefaultServiceInstance) tmpInstance).setServiceMetadata(metadata);
+                 MetadataInfo originMetadata = ((DefaultServiceInstance) tmpInstance).getServiceMetadata();
+                 if (originMetadata == null || !Objects.equals(originMetadata.getRevision(), metadata.getRevision())) {
+                     ((DefaultServiceInstance) tmpInstance).setServiceMetadata(metadata);
+                 }
              }
 -//            ((DefaultServiceInstance) instance).setServiceMetadata(metadata);
 -            newRevisionToMetadata.putIfAbsent(revision, metadata);
 -        }
 -
 -        if (logger.isDebugEnabled()) {
 -            logger.debug(newRevisionToMetadata.size() + " unique revisions: " + newRevisionToMetadata.keySet());
          }
  
 -        if (hasEmptyMetadata(newRevisionToMetadata)) {// retry every 10 seconds
 +        if (hasEmptyMetadata(revisionToInstances)) {// retry every 10 seconds
 +            hasEmptyMetadata = true;
              if (retryPermission.tryAcquire()) {
                  if (retryFuture != null && !retryFuture.isDone()) {
                      // cancel last retryFuture because only one retryFuture will be canceled at destroy().
diff --cc dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilderTest.java
index 052e123,d69a6dd..b297f1c
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilderTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilderTest.java
@@@ -64,9 -65,10 +66,10 @@@ public class StandardMetadataServiceURL
          assertEquals(url.getGroup(), "test");
          assertEquals(url.getSide(), "consumer");
          assertEquals(url.getVersion(), "1.0.0");
 -        assertEquals(url.getParameters().get("getAndListenInstanceMetadata.1.callback"), "true");
 +//        assertEquals(url.getParameters().get("getAndListenInstanceMetadata.1.callback"), "true");
          assertEquals(url.getParameters().get("reconnect"), "false");
          assertEquals(url.getParameters().get("timeout"), "5000");
+         assertEquals(url.getApplicationModel(), ApplicationModel.defaultModel());
  
          // test generateWithMetadata
          urls = builder.build(serviceInstance);
diff --cc dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
index dd7c4c5,aa54bd9..784d5ac
--- a/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
+++ b/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
@@@ -23,9 -24,10 +23,10 @@@ import org.apache.dubbo.registry.client
  import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;
  import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;
  import org.apache.dubbo.rpc.model.ApplicationModel;
 -import org.apache.dubbo.rpc.model.ScopeModelUtil;
  
 +import org.apache.curator.test.TestingServer;
  import org.junit.jupiter.api.AfterEach;
+ import org.junit.jupiter.api.BeforeAll;
  import org.junit.jupiter.api.BeforeEach;
  import org.junit.jupiter.api.Test;
  import org.mockito.internal.util.collections.Sets;
@@@ -59,15 -67,10 +64,11 @@@ public class ZookeeperServiceDiscoveryT
  
      @BeforeEach
      public void init() throws Exception {
-         zkServerPort = getAvailablePort();
-         zkServer = new TestingServer(zkServerPort, true);
-         zkServer.start();
- 
 -        this.registryUrl = URL.valueOf(zookeeperConnectionAddress1);
 -        registryUrl.setScopeModel(ApplicationModel.defaultModel());
 -        this.discovery = new ZookeeperServiceDiscovery();
 -        this.discovery.initialize(registryUrl);
 +        this.registryUrl = URL.valueOf("zookeeper://127.0.0.1:" + zkServerPort);
 +        ApplicationModel applicationModel = ApplicationModel.defaultModel();
 +        applicationModel.getApplicationConfigManager().setApplication(new ApplicationConfig(SERVICE_NAME));
 +        registryUrl.setScopeModel(applicationModel);
 +        this.discovery = new ZookeeperServiceDiscovery(applicationModel, registryUrl);
      }
  
      @AfterEach
diff --cc dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtilsTest.java
index 11bfa06,71ad98f..1eec916
--- a/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtilsTest.java
+++ b/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtilsTest.java
@@@ -45,28 -38,17 +43,20 @@@ import static org.apache.dubbo.registry
   * {@link CuratorFrameworkUtils} Test
   */
  class CuratorFrameworkUtilsTest {
-     private static TestingServer zkServer;
      private static URL registryUrl;
+     private static String zookeeperConnectionAddress1;
 +    private static MetadataReport metadataReport;
  
      @BeforeAll
      public static void init() throws Exception {
-         int zkServerPort = getAvailablePort();
-         zkServer = new TestingServer(zkServerPort, true);
-         zkServer.start();
+         zookeeperConnectionAddress1 = System.getProperty("zookeeper.connection.address.1");
  
-         registryUrl = URL.valueOf("zookeeper://127.0.0.1:" + zkServerPort);
+         registryUrl = URL.valueOf(zookeeperConnectionAddress1);
          registryUrl.setScopeModel(ApplicationModel.defaultModel());
 +
 +        metadataReport = Mockito.mock(MetadataReport.class);
      }
  
-     @AfterAll
-     public static void tearDown() throws Exception {
-         zkServer.stop();
-     }
- 
- 
      @Test
      void testBuildCuratorFramework() throws Exception {
          CuratorFramework curatorFramework = CuratorFrameworkUtils.buildCuratorFramework(registryUrl);
diff --cc dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringXmlConfigTest.java
index 484940a,5530de7..7171b5d
--- a/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringXmlConfigTest.java
+++ b/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringXmlConfigTest.java
@@@ -21,10 -21,7 +21,8 @@@ import org.apache.dubbo.test.common.Sys
  import org.apache.dubbo.test.common.api.DemoService;
  import org.apache.dubbo.test.common.api.GreetingService;
  import org.apache.dubbo.test.common.api.RestDemoService;
- import org.apache.dubbo.test.common.registrycenter.RegistryCenter;
- import org.apache.dubbo.test.common.registrycenter.ZookeeperSingleRegistryCenter;
  import org.apache.dubbo.test.spring.context.MockSpringInitCustomizer;
 +
  import org.junit.jupiter.api.AfterAll;
  import org.junit.jupiter.api.Assertions;
  import org.junit.jupiter.api.BeforeAll;
@@@ -35,25 -32,14 +33,21 @@@ import static org.apache.dubbo.common.c
  
  public class SpringXmlConfigTest {
  
-     private static RegistryCenter registryCenter;
 +    private static ClassPathXmlApplicationContext providerContext;
 +
      @BeforeAll
      public static void beforeAll() {
-         registryCenter = new ZookeeperSingleRegistryCenter();
-         registryCenter.startup();
          DubboBootstrap.reset();
      }
  
      @AfterAll
      public static void afterAll(){
          DubboBootstrap.reset();
-         registryCenter.shutdown();
 +        providerContext.close();
 +    }
 +
 +    private void startProvider() {
 +        providerContext = new ClassPathXmlApplicationContext("/spring/dubbo-demo-provider.xml");
      }
  
      @Test