You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2020/05/14 08:00:22 UTC

[servicecomb-java-chassis] branch master updated (60dc750 -> 0a67e0a)

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

liubao pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git.


    from 60dc750  [SCB-1861] fix bug when delete all config
     new 174ff60  [SCB-1876] part-1: first move definitions to core
     new 437a63c  [SCB-1876] part-2: extract interface Registration and Discovery
     new bdd390f  [SCB-1876] part-3: fix all reference and compilation errors
     new dc9276a  [SCB-1876] part-4: remove unnecessary comments
     new 80bece2  [SCB-1876] part-5: add registration and discovery implementation
     new d626e36  [SCB-1876] part-6: move api to a separate folder as config and fix ut problems
     new 5145610  [SCB-1876] part-7: fix get versions may be different in windows and linux
     new a32d4aa  [SCB-1876] part-8: fix demo error, add registry dependency
     new 0a67e0a  [SCB-1876] part-9: fix local registry tests error

The 9 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:
 common/common-rest/pom.xml                         |   6 +-
 .../common/rest/AbstractRestInvocation.java        |   2 -
 .../common/rest/locator/ServicePathManager.java    |   6 +-
 .../common/rest/TestAbstractRestInvocation.java    |  30 +--
 .../common/rest/TestRestEngineSchemaListener.java  |   2 +-
 .../common/rest/TestRestProducerInvocation.java    |  12 +-
 .../rest/definition/TestRestOperationMeta.java     |   2 +-
 .../common/rest/locator/TestMicroservicePaths.java |   2 +-
 .../rest/locator/TestServicePathManager.java       |  22 +-
 core/pom.xml                                       |  10 +-
 .../servicecomb/core/CseApplicationListener.java   |   9 +-
 .../org/apache/servicecomb/core/SCBEngine.java     |  54 ++---
 .../servicecomb/core/bootstrap/SCBBootstrap.java   |  33 +--
 .../core/bootstrap/SCBEngineForTest.java           |   3 +-
 .../core/bootstrap/SpringBootstrap.java            |  27 ---
 .../core/bootup/ServiceInformationCollector.java   |  16 +-
 .../core/definition/ServiceRegistryListener.java   |   8 +-
 .../core/endpoint/AbstractEndpointsCache.java      | 119 ----------
 .../servicecomb/core/endpoint/EndpointsCache.java  |  35 ---
 .../core/invocation/InvocationFactory.java         |   4 +-
 .../consumer/MicroserviceReferenceConfig.java      |   4 +-
 .../provider/producer/ProducerBootListener.java    |  26 +--
 .../provider/producer/ProducerProviderManager.java |  10 +-
 .../core/transport/AbstractTransport.java          |  41 +---
 .../core/transport/TransportManager.java           |   8 +-
 .../resources/META-INF/spring/scb-core-bean.xml    |   2 -
 .../core/TestCseApplicationListener.java           |  18 +-
 .../org/apache/servicecomb/core/TestTransport.java |  49 +----
 .../core/filter/TestEndpointDiscoveryFilter.java   |   2 +-
 .../handler/impl/TestSimpleLoadBalanceHandler.java |  15 +-
 .../core/transport/TestAbstractTransport.java      |  39 +---
 .../core/transport/TestTransportManager.java       |   4 +-
 coverage-reports/pom.xml                           |   4 +
 .../servicecomb/demo/edge/consumer/Consumer.java   |   9 +-
 .../demo/edge/model/ResultWithInstance.java        |   8 +-
 demo/demo-edge/pom.xml                             |   4 +
 .../jaxrs/client/MultiErrorCodeServiceClient.java  |   7 +-
 demo/demo-multiple/pom.xml                         |   4 +
 .../integration/PojoReferenceIntegrationTest.java  |   4 +-
 .../demo-register-url-prefix-server/pom.xml        |   4 +
 demo/demo-schema/pom.xml                           |   5 +-
 .../servicecomb/demo/CodeFirstRestTemplate.java    |   4 +-
 demo/demo-spring-boot-provider/pom.xml             |   4 +
 demo/demo-spring-boot-transport/pom.xml            |   4 +
 .../client/CodeFirstRestTemplateSpringmvc.java     |   4 +-
 .../springmvc/client/ConsumerTestsAfterBootup.java |   4 +-
 .../demo/springmvc/client/TestResponse.java        |   6 +-
 .../springmvc/server/ProducerTestsAfterBootup.java |   4 +-
 dependencies/bom/pom.xml                           |   5 +
 .../apache/servicecomb/deployment/Deployment.java  |  27 ---
 distribution/pom.xml                               |   4 +
 .../edge/core/CommonHttpEdgeDispatcher.java        |   4 +-
 .../common/utils/ClassLoaderScopeContext.java      |  42 ++--
 .../common/net/TestURIEndpointObject.java          |   5 +
 .../foundation-registry}/pom.xml                   |  17 +-
 .../servicecomb/serviceregistry/Discovery.java     |  31 ++-
 .../serviceregistry/DiscoveryManager.java          | 128 +++++++++++
 .../servicecomb/serviceregistry/LifeCycle.java     |   8 +-
 .../servicecomb/serviceregistry/Registration.java  |  32 +--
 .../serviceregistry/RegistrationManager.java       | 203 +++++++++++++++++
 .../serviceregistry/api/MicroserviceKey.java       |   0
 .../serviceregistry/api/PropertyExtended.java      |   0
 .../servicecomb/serviceregistry/api/Versions.java  |   0
 .../serviceregistry/api/registry/BasePath.java     |   0
 .../api/registry/DataCenterInfo.java               |   0
 .../serviceregistry/api/registry/Framework.java    |   0
 .../api/registry/FrameworkVersions.java            |   0
 .../serviceregistry/api/registry/HealthCheck.java  |   0
 .../api/registry/HealthCheckMode.java              |   0
 .../serviceregistry/api/registry/Microservice.java |   4 +-
 .../api/registry/MicroserviceInstance.java         |   0
 .../api/registry/MicroserviceInstanceStatus.java   |   0
 .../api/registry/MicroserviceStatus.java           |   0
 .../serviceregistry/api/registry/WatchAction.java  |   0
 .../api/response/FindInstancesResponse.java        |  11 +-
 .../response/MicroserviceInstanceChangedEvent.java |   0
 .../serviceregistry/cache/CacheEndpoint.java       |   0
 .../serviceregistry/cache/InstanceCache.java       |   0
 .../cache/InstanceCacheManager.java                |   0
 .../cache/InstanceCacheManagerNew.java             |   0
 .../cache/MicroserviceInstanceCache.java           |   7 +-
 .../client/http/MicroserviceInstances.java         |  39 +++-
 .../config/AbstractPropertiesLoader.java           |   0
 .../config/ConfigurePropertyUtils.java             |   6 +-
 .../config/InstancePropertiesLoader.java           |   0
 .../config/ServiceRegistryCommonConfig.java        |  16 +-
 .../serviceregistry/consumer/AppManager.java       |   0
 .../consumer/MicroserviceInstancePing.java         |   0
 .../consumer/MicroserviceManager.java              |   0
 .../consumer/MicroserviceVersion.java              |   4 +-
 .../consumer/MicroserviceVersionRule.java          |   0
 .../consumer/MicroserviceVersionRuleData.java      |   0
 .../consumer/MicroserviceVersions.java             |  15 +-
 .../consumer/SimpleMicroserviceInstancePing.java   |   0
 .../consumer/StaticMicroserviceVersions.java       |   6 +-
 .../definition/DefinitionConst.java                |  14 ++
 .../definition/MicroserviceDefinition.java         |   0
 .../definition/MicroserviceNameParser.java         |   4 +-
 .../discovery/AbstractDiscoveryFilter.java         |   0
 .../discovery/AbstractEndpointDiscoveryFilter.java |   0
 .../discovery/DiscoveryContext.java                |   0
 .../serviceregistry/discovery/DiscoveryFilter.java |   0
 .../serviceregistry/discovery/DiscoveryTree.java   |   4 +-
 .../discovery/DiscoveryTreeNode.java               |   0
 .../discovery/InstanceStatusDiscoveryFilter.java   |   0
 .../event/CreateMicroserviceEvent.java             |   0
 .../event/CreateMicroserviceVersionEvent.java      |   0
 .../event/DestroyMicroserviceEvent.java            |   0
 .../event/DestroyMicroserviceVersionEvent.java     |   0
 .../event/MicroserviceInstanceRegisteredEvent.java |   8 +-
 .../serviceregistry/swagger/SwaggerLoader.java     |  15 +-
 .../serviceregistry/task/event/ExceptionEvent.java |   0
 .../task/event/HeartbeatFailEvent.java             |   0
 .../task/event/HeartbeatSuccEvent.java             |   0
 .../serviceregistry/task/event/RecoveryEvent.java  |   0
 .../task/event/SafeModeChangeEvent.java            |   0
 .../serviceregistry/task/event/ShutdownEvent.java  |   0
 .../serviceregistry/version/Version.java           |   0
 .../serviceregistry/version/VersionRule.java       |   0
 .../version/VersionRuleFixedParser.java            |   0
 .../version/VersionRuleLatestParser.java           |   0
 .../serviceregistry/version/VersionRuleParser.java |   0
 .../version/VersionRuleRangeParser.java            |   0
 .../version/VersionRuleStartFromParser.java        |   0
 .../serviceregistry/version/VersionRuleUtils.java  |   0
 .../serviceregistry/version/VersionUtils.java      |   0
 foundations/pom.xml                                |   1 +
 handlers/handler-loadbalance/pom.xml               |   6 +-
 .../filter/ZoneAwareDiscoveryFilter.java           |   4 +-
 .../loadbalance/TestLoadBalanceHandler2.java       |  20 +-
 .../loadbalance/TestLoadbalanceHandler.java        |  27 +--
 .../filter/TestServerDiscoveryFilter.java          |   2 +-
 handlers/handler-publickey-auth/pom.xml            |   5 +
 .../org/apache/servicecomb/AuthHandlerBoot.java    |   6 +-
 .../consumer/RSAConsumerTokenManager.java          |   6 +-
 .../provider/RSAProviderTokenManager.java          |  10 +-
 .../authentication/TestAuthHandlerBoot.java        |  23 +-
 .../TestRSAProviderTokenManager.java               |  28 ++-
 .../router/custom/MicroserviceCache.java           |   5 +-
 huawei-cloud/servicestage/pom.xml                  |   4 +
 inspector/pom.xml                                  |   6 +-
 .../inspector/internal/InspectorBootListener.java  |   4 +-
 .../inspector/internal/InspectorImpl.java          |  12 +-
 .../internal/TestInspectorBootListener.java        |   9 +-
 .../inspector/internal/TestInspectorImpl.java      |  23 +-
 .../org/apache/servicecomb/it/CommandReceiver.java |   5 +-
 .../java/org/apache/servicecomb/it/ITUtils.java    |   6 +-
 .../servicecomb/it/deploy/MicroserviceDeploy.java  |   7 +-
 .../it/extend/engine/GateRestTemplate.java         |   7 +-
 .../it/extend/engine/ITSCBAsyncRestTemplate.java   |  10 +-
 .../it/extend/engine/ITSCBRestTemplate.java        |   7 +-
 .../servicecomb/it/edge/PreLoadBootListener.java   |   8 +-
 .../it/schema/ReactiveWithIntfSchema.java          |  13 +-
 .../demo/jaxrs/tests/JaxrsIntegrationTestBase.java |   5 -
 integration-tests/pom.xml                          |   5 +-
 metrics/metrics-core/pom.xml                       |   6 +-
 .../metrics/core/TestMetricsBootListener.java      |   6 +-
 .../metrics/prometheus/PrometheusPublisher.java    |   4 +-
 .../prometheus/TestPrometheusPublisher.java        |   6 +-
 providers/provider-pojo/pom.xml                    |   5 +
 .../servicecomb/provider/pojo/TestInvoker.java     | 245 ++-------------------
 .../pojo/reference/PojoReferenceMetaTest.java      |   2 +-
 .../pojo/reference/TestRpcReferenceProcessor.java  |   2 +-
 providers/provider-springmvc/pom.xml               |  10 +
 .../reference/TestCseClientHttpRequest.java        |   8 +-
 .../async/CseAsyncClientHttpRequestTest.java       |  11 +-
 service-registry/pom.xml                           |   6 +
 .../servicecomb/serviceregistry/Features.java      |  30 ---
 .../servicecomb/serviceregistry/RegistryUtils.java | 160 +++-----------
 .../serviceregistry/ServiceCenterDiscovery.java    |  90 ++++++++
 .../serviceregistry/ServiceCenterRegistration.java | 104 +++++++++
 .../serviceregistry/ServiceRegistry.java           |   2 -
 .../servicecomb/serviceregistry/api/Const.java     |   5 -
 .../config/ServiceRegistryConfig.java              |  11 -
 .../config/ServiceRegistryConfigBuilder.java       |   9 -
 .../diagnosis/instance/InstanceCacheCheckTask.java |  12 +-
 .../registry/AbstractServiceRegistry.java          |  20 +-
 .../cache/RefreshableMicroserviceCache.java        |   4 +-
 .../task/MicroserviceInstanceRegisterTask.java     |   8 +-
 ...rg.apache.servicecomb.serviceregistry.Discovery |   2 +-
 ...apache.servicecomb.serviceregistry.Registration |   2 +-
 .../serviceregistry/MockMicroserviceVersions.java  |  16 +-
 .../servicecomb/serviceregistry/TestConsumers.java |  23 +-
 .../servicecomb/serviceregistry/TestRegistry.java  |  44 ++--
 .../serviceregistry/TestRegistryBase.java          |  29 +--
 .../api/registry/TestFrameworkVersions.java        |   4 +-
 .../api/registry/TestServiceCombVersion.java       |   4 +-
 .../cache/TestInstanceCacheManagerNew.java         |   9 +
 .../cache/TestMicroserviceInstanceCache.java       |  23 +-
 .../config/TestConfigurePropertyUtils.java         |  10 +-
 .../consumer/TestMicroserviceVersionRuleFixed.java |   9 +
 .../TestMicroserviceVersionRuleLatest.java         |   9 +
 .../instance/TestInstanceCacheCheckTask.java       |   5 -
 .../instance/TestInstanceCacheCheckerMock.java     |  22 +-
 .../TestInstanceCacheCheckerWithoutMock.java       |  20 +-
 .../discovery/TestDiscoveryTree.java               |  22 +-
 .../registry/EmptyMockServiceRegistry.java         |   6 -
 .../serviceregistry/swagger/TestSwaggerLoader.java |  36 +--
 .../task/TestMicroserviceInstanceRegisterTask.java |  34 ++-
 .../transport/highway/TestHighwayCodec.java        |   6 -
 .../rest/client/http/RestClientInvocation.java     |   4 +-
 .../rest/client/http/TestRestClientInvocation.java |  12 +-
 .../transport-rest/transport-rest-servlet/pom.xml  |   6 +-
 .../rest/servlet/ServletRestTransport.java         |   8 +-
 .../transport/rest/servlet/ServletUtils.java       |   6 +-
 .../transport/rest/servlet/TestRestServlet.java    |   2 +-
 .../rest/servlet/TestServletRestDispatcher.java    |   2 +-
 .../rest/servlet/TestServletRestTransport.java     |  25 +--
 .../transport/rest/servlet/TestServletUtils.java   |  17 +-
 .../transport-rest/transport-rest-vertx/pom.xml    |   6 +-
 .../rest/vertx/TestRestServerVerticle.java         |   2 +-
 .../rest/vertx/TestVertxRestDispatcher.java        |   2 +-
 212 files changed, 1402 insertions(+), 1423 deletions(-)
 delete mode 100644 core/src/main/java/org/apache/servicecomb/core/bootstrap/SpringBootstrap.java
 delete mode 100644 core/src/main/java/org/apache/servicecomb/core/endpoint/AbstractEndpointsCache.java
 delete mode 100644 core/src/main/java/org/apache/servicecomb/core/endpoint/EndpointsCache.java
 copy deployment/src/main/java/org/apache/servicecomb/deployment/Deployment.java => foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/ClassLoaderScopeContext.java (53%)
 copy {dynamic-config/config-apollo => foundations/foundation-registry}/pom.xml (82%)
 copy service-registry/src/main/java/org/apache/servicecomb/serviceregistry/adapter/EnvAdapter.java => foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java (50%)
 create mode 100644 foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
 copy dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ConnSuccEvent.java => foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java (86%)
 copy service-registry/src/main/java/org/apache/servicecomb/serviceregistry/adapter/EnvAdapter.java => foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java (58%)
 create mode 100644 foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/MicroserviceKey.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/PropertyExtended.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/Versions.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/BasePath.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/DataCenterInfo.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Framework.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/FrameworkVersions.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheck.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheckMode.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java (97%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstance.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstanceStatus.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceStatus.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/WatchAction.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java (86%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/api/response/MicroserviceInstanceChangedEvent.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/cache/CacheEndpoint.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCache.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManagerNew.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java (90%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java (61%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/config/AbstractPropertiesLoader.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java (91%)
 copy {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/config/InstancePropertiesLoader.java (100%)
 rename service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/InstancePropertiesLoader.java => foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryCommonConfig.java (67%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceInstancePing.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceManager.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java (96%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRuleData.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java (96%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/consumer/SimpleMicroserviceInstancePing.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java (94%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java (77%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceDefinition.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java (94%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractDiscoveryFilter.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryContext.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryFilter.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java (98%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/discovery/InstanceStatusDiscoveryFilter.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceEvent.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceVersionEvent.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceEvent.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceVersionEvent.java (100%)
 copy service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatFailEvent.java => foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java (83%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java (92%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ExceptionEvent.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatFailEvent.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatSuccEvent.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/task/event/RecoveryEvent.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/task/event/SafeModeChangeEvent.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ShutdownEvent.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/version/Version.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRule.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleFixedParser.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleLatestParser.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleParser.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleRangeParser.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleStartFromParser.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleUtils.java (100%)
 rename {service-registry => foundations/foundation-registry}/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionUtils.java (100%)
 delete mode 100644 service-registry/src/main/java/org/apache/servicecomb/serviceregistry/Features.java
 create mode 100644 service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterDiscovery.java
 create mode 100644 service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterRegistration.java
 copy common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener => service-registry/src/main/resources/META-INF/services/org.apache.servicecomb.serviceregistry.Discovery (92%)
 copy common/common-access-log/src/main/resources/META-INF/services/org.apache.servicecomb.core.BootListener => service-registry/src/main/resources/META-INF/services/org.apache.servicecomb.serviceregistry.Registration (92%)


[servicecomb-java-chassis] 08/09: [SCB-1876] part-8: fix demo error, add registry dependency

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit a32d4aad8d6cf3f6c25c59f5148cb82bdab27413
Author: liubao <bi...@qq.com>
AuthorDate: Wed May 13 19:28:43 2020 +0800

    [SCB-1876] part-8: fix demo error, add registry dependency
---
 demo/demo-edge/pom.xml                                                | 4 ++++
 demo/demo-multiple/pom.xml                                            | 4 ++++
 demo/demo-register-url-prefix/demo-register-url-prefix-server/pom.xml | 4 ++++
 demo/demo-spring-boot-provider/pom.xml                                | 4 ++++
 demo/demo-spring-boot-transport/pom.xml                               | 4 ++++
 5 files changed, 20 insertions(+)

diff --git a/demo/demo-edge/pom.xml b/demo/demo-edge/pom.xml
index 28b8aad..dfd1415 100644
--- a/demo/demo-edge/pom.xml
+++ b/demo/demo-edge/pom.xml
@@ -30,6 +30,10 @@
 
   <dependencies>
     <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+    </dependency>
+    <dependency>
       <groupId>log4j</groupId>
       <artifactId>log4j</artifactId>
     </dependency>
diff --git a/demo/demo-multiple/pom.xml b/demo/demo-multiple/pom.xml
index 171d2f1..6d6769d 100644
--- a/demo/demo-multiple/pom.xml
+++ b/demo/demo-multiple/pom.xml
@@ -58,6 +58,10 @@
         <artifactId>b-client</artifactId>
         <version>${project.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.servicecomb</groupId>
+        <artifactId>service-registry</artifactId>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 
diff --git a/demo/demo-register-url-prefix/demo-register-url-prefix-server/pom.xml b/demo/demo-register-url-prefix/demo-register-url-prefix-server/pom.xml
index b34accb..1dafa7b 100644
--- a/demo/demo-register-url-prefix/demo-register-url-prefix-server/pom.xml
+++ b/demo/demo-register-url-prefix/demo-register-url-prefix-server/pom.xml
@@ -33,6 +33,10 @@
   </properties>
   <dependencies>
     <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-commons</artifactId>
     </dependency>
diff --git a/demo/demo-spring-boot-provider/pom.xml b/demo/demo-spring-boot-provider/pom.xml
index 2a2a7c6..ab2061d 100644
--- a/demo/demo-spring-boot-provider/pom.xml
+++ b/demo/demo-spring-boot-provider/pom.xml
@@ -37,6 +37,10 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
       <artifactId>java-chassis-spring-boot-starter-standalone</artifactId>
     </dependency>
   </dependencies>
diff --git a/demo/demo-spring-boot-transport/pom.xml b/demo/demo-spring-boot-transport/pom.xml
index 5ab6219..3e8034f 100644
--- a/demo/demo-spring-boot-transport/pom.xml
+++ b/demo/demo-spring-boot-transport/pom.xml
@@ -39,6 +39,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
       <artifactId>foundation-test-scaffolding</artifactId>
       <scope>compile</scope>
     </dependency>


[servicecomb-java-chassis] 01/09: [SCB-1876] part-1: first move definitions to core

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 174ff603fce1b4b1c1c0e87c907a4febabf8b609
Author: liubao <bi...@qq.com>
AuthorDate: Tue Apr 28 11:59:32 2020 +0800

    [SCB-1876] part-1: first move definitions to core
---
 core/pom.xml                                       |  4 ---
 .../org/apache/servicecomb/core/SCBEngine.java     | 32 ++++++++++++++++++++++
 .../serviceregistry/api/MicroserviceKey.java       |  0
 .../serviceregistry/api/PropertyExtended.java      |  0
 .../servicecomb/serviceregistry/api/Versions.java  |  0
 .../serviceregistry/api/registry/BasePath.java     |  0
 .../api/registry/DataCenterInfo.java               |  0
 .../serviceregistry/api/registry/Framework.java    |  0
 .../api/registry/FrameworkVersions.java            |  0
 .../serviceregistry/api/registry/HealthCheck.java  |  0
 .../api/registry/HealthCheckMode.java              |  0
 .../serviceregistry/api/registry/Microservice.java |  4 +--
 .../api/registry/MicroserviceInstance.java         |  0
 .../api/registry/MicroserviceInstanceStatus.java   |  0
 .../api/registry/MicroserviceStatus.java           |  0
 .../serviceregistry/api/registry/WatchAction.java  |  0
 .../api/response/FindInstancesResponse.java        |  0
 .../response/MicroserviceInstanceChangedEvent.java |  0
 .../serviceregistry/cache/CacheEndpoint.java       |  0
 .../serviceregistry/cache/InstanceCache.java       |  0
 .../client/http/MicroserviceInstances.java         |  0
 .../config/AbstractPropertiesLoader.java           |  0
 .../config/ConfigurePropertyUtils.java             |  6 ++--
 .../config/InstancePropertiesLoader.java           |  0
 .../serviceregistry/consumer/AppManager.java       |  0
 .../consumer/MicroserviceInstancePing.java         |  0
 .../consumer/MicroserviceManager.java              |  0
 .../consumer/MicroserviceVersion.java              |  0
 .../consumer/MicroserviceVersionRule.java          |  0
 .../consumer/MicroserviceVersionRuleData.java      |  0
 .../consumer/MicroserviceVersions.java             |  2 +-
 .../consumer/SimpleMicroserviceInstancePing.java   |  0
 .../consumer/StaticMicroserviceVersions.java       |  0
 .../definition/DefinitionConst.java                |  4 +++
 .../discovery/AbstractDiscoveryFilter.java         |  0
 .../discovery/AbstractEndpointDiscoveryFilter.java |  0
 .../discovery/DiscoveryContext.java                |  0
 .../serviceregistry/discovery/DiscoveryFilter.java |  0
 .../serviceregistry/discovery/DiscoveryTree.java   |  0
 .../discovery/DiscoveryTreeNode.java               |  0
 .../discovery/InstanceStatusDiscoveryFilter.java   |  0
 .../event/CreateMicroserviceEvent.java             |  0
 .../event/CreateMicroserviceVersionEvent.java      |  0
 .../event/DestroyMicroserviceEvent.java            |  0
 .../event/DestroyMicroserviceVersionEvent.java     |  0
 .../serviceregistry/task/event/ExceptionEvent.java |  0
 .../task/event/HeartbeatFailEvent.java             |  0
 .../task/event/HeartbeatSuccEvent.java             |  0
 .../serviceregistry/task/event/RecoveryEvent.java  |  0
 .../task/event/SafeModeChangeEvent.java            |  0
 .../serviceregistry/task/event/ShutdownEvent.java  |  0
 .../serviceregistry/version/Version.java           |  0
 .../serviceregistry/version/VersionRule.java       |  0
 .../version/VersionRuleFixedParser.java            |  0
 .../version/VersionRuleLatestParser.java           |  0
 .../serviceregistry/version/VersionRuleParser.java |  0
 .../version/VersionRuleRangeParser.java            |  0
 .../version/VersionRuleStartFromParser.java        |  0
 .../serviceregistry/version/VersionRuleUtils.java  |  0
 .../serviceregistry/version/VersionUtils.java      |  0
 .../apache/servicecomb/deployment/Deployment.java  | 27 ------------------
 huawei-cloud/servicestage/pom.xml                  |  2 +-
 service-registry/pom.xml                           |  6 ++++
 .../servicecomb/serviceregistry/api/Const.java     |  3 +-
 64 files changed, 50 insertions(+), 40 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index 5f386c0..c1dcef8 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -30,10 +30,6 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
-      <artifactId>service-registry</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.servicecomb</groupId>
       <artifactId>swagger-invocation-core</artifactId>
     </dependency>
     <dependency>
diff --git a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
index 3f2a2fc..0c13f85 100644
--- a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
+++ b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
@@ -19,7 +19,9 @@ package org.apache.servicecomb.core;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicLong;
@@ -68,6 +70,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.util.StringUtils;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.eventbus.AllowConcurrentEvents;
 import com.google.common.eventbus.EventBus;
 import com.google.common.eventbus.Subscribe;
@@ -87,6 +90,21 @@ public class SCBEngine {
 
   private static final Object initializationLock = new Object();
 
+  /*
+ * class loader scope property is used when users run java-chassis in an class loader separated environment.
+ *
+ * For examples, deploy two war's to web container, or deploy two bundles in an OSGI container.
+ *
+ * Now java chassis not testing this feature carefully, but we will support users doing so.
+ *
+ * users who using this feature can feed back your problems in issues.
+ *
+ * NOTICE: this context is better put into module `core`, however now `core` depends on `service-registry`.
+ *
+ * Maybe it's better to refactor project that `service-registry` depends on `core`.
+ */
+  private static final Map<String, String> CLASS_LOADER_SCOPE_CONTEXT = new HashMap<>();
+
   private volatile static SCBEngine INSTANCE;
 
   private ConsumerHandlerManager consumerHandlerManager = new ConsumerHandlerManager();
@@ -173,6 +191,20 @@ public class SCBEngine {
     return RegistryUtils.getSwaggerLoader();
   }
 
+
+  public static void setClassLoaderScopeProperty(String key, String value) {
+    CLASS_LOADER_SCOPE_CONTEXT.put(key, value);
+  }
+
+  public static String getClassLoaderScopeProperty(String key) {
+    return CLASS_LOADER_SCOPE_CONTEXT.get(key);
+  }
+
+  @VisibleForTesting
+  public static void clearClassLoaderScopeProperty() {
+    CLASS_LOADER_SCOPE_CONTEXT.clear();
+  }
+
   public ConsumerHandlerManager getConsumerHandlerManager() {
     return consumerHandlerManager;
   }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/MicroserviceKey.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/MicroserviceKey.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/MicroserviceKey.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/MicroserviceKey.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/PropertyExtended.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/PropertyExtended.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/PropertyExtended.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/PropertyExtended.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Versions.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/Versions.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Versions.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/Versions.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/BasePath.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/BasePath.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/BasePath.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/BasePath.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/DataCenterInfo.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/DataCenterInfo.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/DataCenterInfo.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/DataCenterInfo.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Framework.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Framework.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Framework.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Framework.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/FrameworkVersions.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/FrameworkVersions.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/FrameworkVersions.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/FrameworkVersions.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheck.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheck.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheck.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheck.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheckMode.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheckMode.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheckMode.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheckMode.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java
similarity index 97%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java
index c25c330..17f7d4d 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java
@@ -22,7 +22,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@@ -196,7 +196,7 @@ public class Microservice {
 
   public static String generateAbsoluteMicroserviceName(String appId, String microserviceName) {
     StringBuilder sb = new StringBuilder(appId.length() + microserviceName.length() + 1);
-    sb.append(appId).append(Const.APP_SERVICE_SEPARATOR).append(microserviceName);
+    sb.append(appId).append(DefinitionConst.APP_SERVICE_SEPARATOR).append(microserviceName);
     return sb.toString();
   }
 
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstance.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstance.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstance.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstance.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstanceStatus.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstanceStatus.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstanceStatus.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstanceStatus.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceStatus.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceStatus.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceStatus.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceStatus.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/WatchAction.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/WatchAction.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/WatchAction.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/WatchAction.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/response/MicroserviceInstanceChangedEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/MicroserviceInstanceChangedEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/response/MicroserviceInstanceChangedEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/MicroserviceInstanceChangedEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/CacheEndpoint.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/CacheEndpoint.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/CacheEndpoint.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/cache/CacheEndpoint.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCache.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCache.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCache.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCache.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/AbstractPropertiesLoader.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/config/AbstractPropertiesLoader.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/AbstractPropertiesLoader.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/config/AbstractPropertiesLoader.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java
similarity index 93%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java
index 4cbb918..464419a 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java
@@ -25,9 +25,9 @@ import java.util.Map;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.lang.StringUtils;
-import org.apache.servicecomb.deployment.Deployment;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.serviceregistry.api.registry.BasePath;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 
 import com.netflix.config.DynamicPropertyFactory;
 
@@ -73,7 +73,7 @@ public final class ConfigurePropertyUtils {
   }
 
   private static String buildPath(String path) {
-    String prefix = Deployment.getClassLoaderScopeProperty(Const.URL_PREFIX);
+    String prefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     if (StringUtils.isNotEmpty(prefix)) {
       if (!path.startsWith(prefix)) {
         path = prefix + path;
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/InstancePropertiesLoader.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/config/InstancePropertiesLoader.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/InstancePropertiesLoader.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/config/InstancePropertiesLoader.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceInstancePing.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceInstancePing.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceInstancePing.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceInstancePing.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceManager.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceManager.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceManager.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRuleData.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRuleData.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRuleData.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRuleData.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
similarity index 98%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
index 5dc1cec..dd34169 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
@@ -315,7 +315,7 @@ public class MicroserviceVersions {
     return (appId.equals(changedEvent.getKey().getAppId()) &&
         microserviceName.equals(changedEvent.getKey().getServiceName())) ||
         microserviceName.equals(
-            changedEvent.getKey().getAppId() + Const.APP_SERVICE_SEPARATOR + changedEvent.getKey().getServiceName());
+            changedEvent.getKey().getAppId() + DefinitionConst.APP_SERVICE_SEPARATOR + changedEvent.getKey().getServiceName());
   }
 
   public void destroy() {
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/SimpleMicroserviceInstancePing.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/SimpleMicroserviceInstancePing.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/SimpleMicroserviceInstancePing.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/SimpleMicroserviceInstancePing.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
similarity index 95%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
index 64f8bd7..53a61aa 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
@@ -40,4 +40,8 @@ public interface DefinitionConst {
   String VERSION_RULE_LATEST = "latest";
 
   String VERSION_RULE_ALL = "0.0.0.0+";
+
+  String APP_SERVICE_SEPARATOR = ":";
+
+  String URL_PREFIX = "urlPrefix";
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractDiscoveryFilter.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractDiscoveryFilter.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractDiscoveryFilter.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractDiscoveryFilter.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryContext.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryContext.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryContext.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryContext.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryFilter.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryFilter.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryFilter.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryFilter.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/InstanceStatusDiscoveryFilter.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/InstanceStatusDiscoveryFilter.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/InstanceStatusDiscoveryFilter.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/InstanceStatusDiscoveryFilter.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceVersionEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceVersionEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceVersionEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceVersionEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceVersionEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceVersionEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceVersionEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceVersionEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ExceptionEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ExceptionEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ExceptionEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ExceptionEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatFailEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatFailEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatFailEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatFailEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatSuccEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatSuccEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatSuccEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatSuccEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/RecoveryEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/RecoveryEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/RecoveryEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/RecoveryEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/SafeModeChangeEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/SafeModeChangeEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/SafeModeChangeEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/SafeModeChangeEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ShutdownEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ShutdownEvent.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ShutdownEvent.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ShutdownEvent.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/Version.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/version/Version.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/Version.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/version/Version.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRule.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRule.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRule.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRule.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleFixedParser.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleFixedParser.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleFixedParser.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleFixedParser.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleLatestParser.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleLatestParser.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleLatestParser.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleLatestParser.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleParser.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleParser.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleParser.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleParser.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleRangeParser.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleRangeParser.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleRangeParser.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleRangeParser.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleStartFromParser.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleStartFromParser.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleStartFromParser.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleStartFromParser.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleUtils.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleUtils.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleUtils.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleUtils.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionUtils.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionUtils.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionUtils.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionUtils.java
diff --git a/deployment/src/main/java/org/apache/servicecomb/deployment/Deployment.java b/deployment/src/main/java/org/apache/servicecomb/deployment/Deployment.java
index 06c075e..dec140f 100644
--- a/deployment/src/main/java/org/apache/servicecomb/deployment/Deployment.java
+++ b/deployment/src/main/java/org/apache/servicecomb/deployment/Deployment.java
@@ -26,21 +26,6 @@ import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import com.google.common.annotations.VisibleForTesting;
 
 public class Deployment {
-  /*
-   * class loader scope property is used when users run java-chassis in an class loader separated environment.
-   *
-   * For examples, deploy two war's to web container, or deploy two bundles in an OSGI container.
-   *
-   * Now java chassis not testing this feature carefully, but we will support users doing so.
-   *
-   * users who using this feature can feed back your problems in issues.
-   *
-   * NOTICE: this context is better put into module `core`, however now `core` depends on `service-registry`.
-   *
-   * Maybe it's better to refactor project that `service-registry` depends on `core`.
-   */
-  private static final Map<String, String> CLASS_LOADER_SCOPE_CONTEXT = new HashMap<>();
-
   private static List<DeploymentProvider> providerList = SPIServiceUtils.getSortedService(DeploymentProvider.class);
 
   public static SystemBootstrapInfo getSystemBootStrapInfo(String systemKey) {
@@ -52,16 +37,4 @@ public class Deployment {
     return null;
   }
 
-  public static void setClassLoaderScopeProperty(String key, String value) {
-    CLASS_LOADER_SCOPE_CONTEXT.put(key, value);
-  }
-
-  public static String getClassLoaderScopeProperty(String key) {
-    return CLASS_LOADER_SCOPE_CONTEXT.get(key);
-  }
-
-  @VisibleForTesting
-  public static void clearClassLoaderScopeProperty() {
-    CLASS_LOADER_SCOPE_CONTEXT.clear();
-  }
 }
diff --git a/huawei-cloud/servicestage/pom.xml b/huawei-cloud/servicestage/pom.xml
index 660b051..af87940 100644
--- a/huawei-cloud/servicestage/pom.xml
+++ b/huawei-cloud/servicestage/pom.xml
@@ -30,7 +30,7 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
-      <artifactId>service-registry</artifactId>
+      <artifactId>java-chassis-core</artifactId>
     </dependency>
   </dependencies>
 
diff --git a/service-registry/pom.xml b/service-registry/pom.xml
index 6b36881..136ccb0 100644
--- a/service-registry/pom.xml
+++ b/service-registry/pom.xml
@@ -50,6 +50,12 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>swagger-generator-core</artifactId>
     </dependency>
+
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>java-chassis-core</artifactId>
+    </dependency>
+
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java
index 78e625a..606b0b2 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java
@@ -184,11 +184,10 @@ public final class Const {
 
   public static final String REGISTRY_SERVICE_NAME = "SERVICECENTER";
 
-  public static final String APP_SERVICE_SEPARATOR = ":";
 
   public static final String PATH_CHECKSESSION = "checksession";
 
-  public static final String URL_PREFIX = "urlPrefix";
+
 
   public static final String INSTANCE_PUBKEY_PRO = "publickey";
 


[servicecomb-java-chassis] 09/09: [SCB-1876] part-9: fix local registry tests error

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 0a67e0ac94cd659d5c3260c132823dc5fc2dad48
Author: liubao <bi...@qq.com>
AuthorDate: Thu May 14 11:24:18 2020 +0800

    [SCB-1876] part-9: fix local registry tests error
---
 .../apache/servicecomb/demo/jaxrs/tests/RawJaxrsIntegrationTest.java | 5 +++--
 .../java/org/apache/servicecomb/tests/tracing/TracingTestBase.java   | 4 ++--
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/RawJaxrsIntegrationTest.java b/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/RawJaxrsIntegrationTest.java
index 113aec7..74fb18e 100644
--- a/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/RawJaxrsIntegrationTest.java
+++ b/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/RawJaxrsIntegrationTest.java
@@ -17,14 +17,15 @@
 
 package org.apache.servicecomb.demo.jaxrs.tests;
 
+import static org.apache.servicecomb.serviceregistry.client.LocalServiceRegistryClientImpl.LOCAL_REGISTRY_FILE_KEY;
+
 import org.junit.BeforeClass;
 
 public class RawJaxrsIntegrationTest extends JaxrsIntegrationTestBase {
 
   @BeforeClass
   public static void setUp() throws Exception {
-    // TODO : local test
-//    System.setProperty(LOCAL_REGISTRY_FILE_KEY, "notExistJustForceLocal");
+    System.setProperty(LOCAL_REGISTRY_FILE_KEY, "notExistJustForceLocal");
     JaxrsTestMain.main(new String[0]);
   }
 }
diff --git a/integration-tests/test-common/src/test/java/org/apache/servicecomb/tests/tracing/TracingTestBase.java b/integration-tests/test-common/src/test/java/org/apache/servicecomb/tests/tracing/TracingTestBase.java
index d0670a7..5198e13 100644
--- a/integration-tests/test-common/src/test/java/org/apache/servicecomb/tests/tracing/TracingTestBase.java
+++ b/integration-tests/test-common/src/test/java/org/apache/servicecomb/tests/tracing/TracingTestBase.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.tests.tracing;
 
 import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.CONFIG_TRACING_COLLECTOR_ADDRESS;
+import static org.apache.servicecomb.serviceregistry.client.LocalServiceRegistryClientImpl.LOCAL_REGISTRY_FILE_KEY;
 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
 import static org.junit.Assert.assertThat;
 
@@ -57,8 +58,7 @@ public class TracingTestBase {
   }
 
   private static void setUpLocalRegistry() {
-    // TODO : local registry
-//    System.setProperty(LOCAL_REGISTRY_FILE_KEY, "notExistJustForceLocal");
+    System.setProperty(LOCAL_REGISTRY_FILE_KEY, "notExistJustForceLocal");
   }
 
   protected void assertThatSpansReceivedByZipkin(Collection<String> logs, String... values) {


[servicecomb-java-chassis] 06/09: [SCB-1876] part-6: move api to a separate folder as config and fix ut problems

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit d626e3676acb3bad41db60bfbde3c3aec3b29086
Author: liubao <bi...@qq.com>
AuthorDate: Wed May 13 17:08:17 2020 +0800

    [SCB-1876] part-6: move api to a separate folder as config and fix ut problems
---
 common/common-rest/pom.xml                         |   6 +-
 .../common/rest/AbstractRestInvocation.java        |   2 -
 .../common/rest/locator/ServicePathManager.java    |   4 +-
 .../common/rest/TestAbstractRestInvocation.java    |  30 +--
 .../common/rest/TestRestEngineSchemaListener.java  |   2 +-
 .../common/rest/TestRestProducerInvocation.java    |   2 +-
 .../rest/definition/TestRestOperationMeta.java     |   2 +-
 .../common/rest/locator/TestMicroservicePaths.java |   2 +-
 .../rest/locator/TestServicePathManager.java       |  19 +-
 core/pom.xml                                       |   4 +
 .../org/apache/servicecomb/core/SCBEngine.java     |  31 +--
 .../servicecomb/core/bootstrap/SCBBootstrap.java   |  21 +-
 .../provider/producer/ProducerBootListener.java    |   4 +-
 .../provider/producer/ProducerProviderManager.java |   3 +-
 .../core/TestCseApplicationListener.java           |  12 +-
 .../org/apache/servicecomb/core/TestTransport.java |   2 +-
 .../core/filter/TestEndpointDiscoveryFilter.java   |   2 +-
 .../handler/impl/TestSimpleLoadBalanceHandler.java |  18 +-
 .../core/transport/TestAbstractTransport.java      |  36 +--
 coverage-reports/pom.xml                           |   4 +
 dependencies/bom/pom.xml                           |   5 +
 distribution/pom.xml                               |   4 +
 .../common/utils/ClassLoaderScopeContext.java      |  51 +++++
 .../common/net/TestURIEndpointObject.java          |   5 +
 .../foundation-registry}/pom.xml                   |  27 +--
 .../servicecomb/serviceregistry/Discovery.java     |   0
 .../serviceregistry/DiscoveryManager.java          |  13 +-
 .../servicecomb/serviceregistry/LifeCycle.java     |   0
 .../servicecomb/serviceregistry/Registration.java  |   4 +-
 .../serviceregistry/RegistrationManager.java       |   4 +
 .../serviceregistry/api/MicroserviceKey.java       |   0
 .../serviceregistry/api/PropertyExtended.java      |   0
 .../servicecomb/serviceregistry/api/Versions.java  |   0
 .../serviceregistry/api/registry/BasePath.java     |   0
 .../api/registry/DataCenterInfo.java               |   0
 .../serviceregistry/api/registry/Framework.java    |   0
 .../api/registry/FrameworkVersions.java            |   0
 .../serviceregistry/api/registry/HealthCheck.java  |   0
 .../api/registry/HealthCheckMode.java              |   0
 .../serviceregistry/api/registry/Microservice.java |   0
 .../api/registry/MicroserviceInstance.java         |   0
 .../api/registry/MicroserviceInstanceStatus.java   |   0
 .../api/registry/MicroserviceStatus.java           |   0
 .../serviceregistry/api/registry/WatchAction.java  |   0
 .../api/response/FindInstancesResponse.java        |   0
 .../response/MicroserviceInstanceChangedEvent.java |   0
 .../serviceregistry/cache/CacheEndpoint.java       |   0
 .../serviceregistry/cache/InstanceCache.java       |   0
 .../cache/InstanceCacheManager.java                |   0
 .../cache/InstanceCacheManagerNew.java             |   0
 .../cache/MicroserviceInstanceCache.java           |   0
 .../client/http/MicroserviceInstances.java         |   0
 .../config/AbstractPropertiesLoader.java           |   0
 .../config/ConfigurePropertyUtils.java             |   4 +-
 .../config/InstancePropertiesLoader.java           |   0
 .../config/ServiceRegistryCommonConfig.java        |   0
 .../serviceregistry/consumer/AppManager.java       |   0
 .../consumer/MicroserviceInstancePing.java         |   0
 .../consumer/MicroserviceManager.java              |   0
 .../consumer/MicroserviceVersion.java              |   0
 .../consumer/MicroserviceVersionRule.java          |   0
 .../consumer/MicroserviceVersionRuleData.java      |   0
 .../consumer/MicroserviceVersions.java             |   0
 .../consumer/SimpleMicroserviceInstancePing.java   |   0
 .../consumer/StaticMicroserviceVersions.java       |   0
 .../definition/DefinitionConst.java                |   0
 .../definition/MicroserviceDefinition.java         |   0
 .../definition/MicroserviceNameParser.java         |   0
 .../discovery/AbstractDiscoveryFilter.java         |   0
 .../discovery/AbstractEndpointDiscoveryFilter.java |   0
 .../discovery/DiscoveryContext.java                |   0
 .../serviceregistry/discovery/DiscoveryFilter.java |   0
 .../serviceregistry/discovery/DiscoveryTree.java   |   0
 .../discovery/DiscoveryTreeNode.java               |   0
 .../discovery/InstanceStatusDiscoveryFilter.java   |   0
 .../event/CreateMicroserviceEvent.java             |   0
 .../event/CreateMicroserviceVersionEvent.java      |   0
 .../event/DestroyMicroserviceEvent.java            |   0
 .../event/DestroyMicroserviceVersionEvent.java     |   0
 .../event/MicroserviceInstanceRegisteredEvent.java |   0
 .../serviceregistry/swagger/SwaggerLoader.java     |   0
 .../serviceregistry/task/event/ExceptionEvent.java |   0
 .../task/event/HeartbeatFailEvent.java             |   0
 .../task/event/HeartbeatSuccEvent.java             |   0
 .../serviceregistry/task/event/RecoveryEvent.java  |   0
 .../task/event/SafeModeChangeEvent.java            |   0
 .../serviceregistry/task/event/ShutdownEvent.java  |   0
 .../serviceregistry/version/Version.java           |   0
 .../serviceregistry/version/VersionRule.java       |   0
 .../version/VersionRuleFixedParser.java            |   0
 .../version/VersionRuleLatestParser.java           |   0
 .../serviceregistry/version/VersionRuleParser.java |   0
 .../version/VersionRuleRangeParser.java            |   0
 .../version/VersionRuleStartFromParser.java        |   0
 .../serviceregistry/version/VersionRuleUtils.java  |   0
 .../serviceregistry/version/VersionUtils.java      |   0
 foundations/pom.xml                                |   1 +
 handlers/handler-loadbalance/pom.xml               |   6 +-
 .../loadbalance/TestLoadBalanceHandler2.java       |  65 +++++-
 .../loadbalance/TestLoadbalanceHandler.java        |  20 +-
 .../filter/TestServerDiscoveryFilter.java          |   2 +-
 handlers/handler-publickey-auth/pom.xml            |   5 +
 .../authentication/TestAuthHandlerBoot.java        |  15 ++
 .../TestRSAProviderTokenManager.java               |  16 +-
 inspector/pom.xml                                  |   6 +-
 .../inspector/internal/InspectorImpl.java          |   3 +-
 .../internal/TestInspectorBootListener.java        |   9 +-
 .../inspector/internal/TestInspectorImpl.java      |  30 ++-
 metrics/metrics-core/pom.xml                       |   6 +-
 .../metrics/core/TestMetricsBootListener.java      |   2 +-
 .../metrics/prometheus/PrometheusPublisher.java    |   2 +-
 .../prometheus/TestPrometheusPublisher.java        |   8 +
 providers/provider-pojo/pom.xml                    |   5 +
 .../servicecomb/provider/pojo/TestInvoker.java     | 245 ++-------------------
 .../pojo/reference/PojoReferenceMetaTest.java      |   2 +-
 .../pojo/reference/TestRpcReferenceProcessor.java  |   2 +-
 providers/provider-springmvc/pom.xml               |  10 +
 .../reference/TestCseClientHttpRequest.java        |   8 +-
 .../async/CseAsyncClientHttpRequestTest.java       |   8 +-
 service-registry/pom.xml                           |   2 +-
 .../servicecomb/serviceregistry/RegistryUtils.java |  24 +-
 .../serviceregistry/ServiceCenterRegistration.java |   5 +
 .../serviceregistry/MockMicroserviceVersions.java  |  16 +-
 .../servicecomb/serviceregistry/TestConsumers.java |  14 +-
 .../serviceregistry/TestRegistryBase.java          |   1 +
 .../cache/TestInstanceCacheManagerNew.java         |   9 +
 .../cache/TestMicroserviceInstanceCache.java       |  23 +-
 .../config/TestConfigurePropertyUtils.java         |  10 +-
 .../consumer/TestMicroserviceVersionRuleFixed.java |   9 +
 .../TestMicroserviceVersionRuleLatest.java         |   9 +
 .../instance/TestInstanceCacheCheckerMock.java     |  10 +-
 .../TestInstanceCacheCheckerWithoutMock.java       |  13 +-
 .../task/TestMicroserviceInstanceRegisterTask.java |  28 +++
 .../transport-rest/transport-rest-servlet/pom.xml  |   6 +-
 .../rest/servlet/ServletRestTransport.java         |   4 +-
 .../transport/rest/servlet/ServletUtils.java       |   4 +-
 .../transport/rest/servlet/TestRestServlet.java    |   2 +-
 .../rest/servlet/TestServletRestDispatcher.java    |   2 +-
 .../rest/servlet/TestServletRestTransport.java     |   8 +-
 .../transport/rest/servlet/TestServletUtils.java   |  15 +-
 .../transport-rest/transport-rest-vertx/pom.xml    |   6 +-
 .../rest/vertx/TestRestServerVerticle.java         |   2 +-
 .../rest/vertx/TestVertxRestDispatcher.java        |   2 +-
 143 files changed, 551 insertions(+), 472 deletions(-)

diff --git a/common/common-rest/pom.xml b/common/common-rest/pom.xml
index ef01489..ca1b28e 100644
--- a/common/common-rest/pom.xml
+++ b/common/common-rest/pom.xml
@@ -34,7 +34,11 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>java-chassis-core</artifactId>
     </dependency>
-
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>io.vertx</groupId>
       <artifactId>vertx-codegen</artifactId>
diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
index a3ebba4..92bac2f 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
@@ -17,8 +17,6 @@
 
 package org.apache.servicecomb.common.rest;
 
-import static org.apache.servicecomb.common.rest.codec.produce.ProduceProcessorManager.DEFAULT_SERIAL_CLASS;
-
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.List;
diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java
index 372f83f..bf95427 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java
@@ -21,10 +21,10 @@ import java.util.Collection;
 
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.common.rest.definition.RestOperationMeta;
-import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -102,7 +102,7 @@ public class ServicePathManager {
   }
 
   public void buildProducerPaths() {
-    String urlPrefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
+    String urlPrefix = ClassLoaderScopeContext.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     if (StringUtils.isEmpty(urlPrefix)) {
       producerPaths = swaggerPaths;
       producerPaths.printPaths();
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java
index 7b1bce8..8d2c5d3 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestAbstractRestInvocation.java
@@ -40,6 +40,7 @@ import org.apache.servicecomb.common.rest.filter.HttpServerFilterBaseForTest;
 import org.apache.servicecomb.common.rest.locator.OperationLocator;
 import org.apache.servicecomb.common.rest.locator.ServicePathManager;
 import org.apache.servicecomb.common.rest.locator.TestPathSchema;
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.Handler;
@@ -55,20 +56,24 @@ import org.apache.servicecomb.core.executor.ReactiveExecutor;
 import org.apache.servicecomb.core.provider.consumer.ReferenceConfig;
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.common.event.EventManager;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.foundation.common.utils.JsonUtils;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.exception.RuntimeExceptionWithoutStackTrace;
 import org.apache.servicecomb.foundation.vertx.http.AbstractHttpServletRequest;
 import org.apache.servicecomb.foundation.vertx.http.AbstractHttpServletResponse;
 import org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx;
 import org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx;
 import org.apache.servicecomb.foundation.vertx.http.StandardHttpServletResponseEx;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.apache.servicecomb.swagger.invocation.context.HttpStatus;
 import org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.apache.servicecomb.swagger.invocation.response.Headers;
 import org.hamcrest.Matchers;
+import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
@@ -135,9 +140,11 @@ public class TestAbstractRestInvocation {
 
   static long nanoTime = 123;
 
-  @BeforeClass
-  public static void classSetup() {
-    scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
+  @Before
+  public void setup() {
+    ConfigUtil.installDynamicConfig();
+    RegistryUtils.initWithLocalRegistry();
+    scbEngine = SCBBootstrap.createSCBEngineForTest()
         .addProducerMeta("sid1", new TestPathSchema())
         .run();
     operationMeta = scbEngine.getProducerMicroserviceMeta().operationMetas().get("test.sid1.dynamicId");
@@ -149,15 +156,7 @@ public class TestAbstractRestInvocation {
         return nanoTime;
       }
     };
-  }
 
-  @AfterClass
-  public static void classTeardown() {
-    scbEngine.destroy();
-  }
-
-  @Before
-  public void setup() {
     if (responseEx == null) {
       responseEx = new StandardHttpServletResponseEx(servletResponse);
     }
@@ -169,6 +168,12 @@ public class TestAbstractRestInvocation {
     restInvocation.setHttpServerFilters(httpServerFilters);
   }
 
+  @After
+  public void teardown() {
+    ArchaiusUtils.resetConfig();
+    scbEngine.destroy();
+  }
+
   private void initRestInvocation() {
     restInvocation.produceProcessor = ProduceProcessorManager.INSTANCE.findDefaultJsonProcessor();
     restInvocation.requestEx = requestEx;
@@ -1149,8 +1154,7 @@ public class TestAbstractRestInvocation {
         responseBody.value = bodyBuffer.toString();
       }
     };
-    setup();
-
+    initRestInvocation();
     restInvocation.scheduleInvocation();
 
     assertEquals(Integer.valueOf(429), status.value);
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestEngineSchemaListener.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestEngineSchemaListener.java
index 7cda771..7a7be6c 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestEngineSchemaListener.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestEngineSchemaListener.java
@@ -40,7 +40,7 @@ public class TestRestEngineSchemaListener {
 
   @BeforeClass
   public static void setup() {
-    scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
+    scbEngine = SCBBootstrap.createSCBEngineForTest()
         .addProducerMeta("sid1", new TestPathSchema())
         .run();
     spm = ServicePathManager.getServicePathManager(scbEngine.getProducerMicroserviceMeta());
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestProducerInvocation.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestProducerInvocation.java
index 42108da..2b62afc 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestProducerInvocation.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestProducerInvocation.java
@@ -81,7 +81,7 @@ public class TestRestProducerInvocation {
 
   @BeforeClass
   public static void classSetup() {
-    scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
+    scbEngine = SCBBootstrap.createSCBEngineForTest()
         .addProducerMeta("sid1", new TestPathSchema())
         .run();
     operationMeta = scbEngine.getProducerMicroserviceMeta().operationMetas().get("test.sid1.dynamicId");
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java
index 830be4b..0734f98 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java
@@ -159,7 +159,7 @@ public class TestRestOperationMeta {
 
   @BeforeClass
   public static void classSetup() {
-    scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
+    scbEngine = SCBBootstrap.createSCBEngineForTest()
         .addProducerMeta("sid1", new RestOperationMetaSchema())
         .run();
     swagger = scbEngine.getProducerMicroserviceMeta().ensureFindSchemaMeta("sid1").getSwagger();
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestMicroservicePaths.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestMicroservicePaths.java
index 5e2416e..d0996d3 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestMicroservicePaths.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestMicroservicePaths.java
@@ -43,7 +43,7 @@ public class TestMicroservicePaths {
 
   @BeforeClass
   public static void setup() {
-    scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
+    scbEngine = SCBBootstrap.createSCBEngineForTest()
         .addProducerMeta("sid1", new TestPathSchema())
         .run();
 
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestServicePathManager.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestServicePathManager.java
index 404abc4..a5a9348 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestServicePathManager.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestServicePathManager.java
@@ -17,22 +17,33 @@
 
 package org.apache.servicecomb.common.rest.locator;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.junit.After;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
 public class TestServicePathManager {
+  @Before
+  public void setUp() {
+    ConfigUtil.installDynamicConfig();
+    RegistryUtils.initWithLocalRegistry();
+  }
   @After
   public void tearDown() {
-    SCBEngine.clearClassLoaderScopeProperty();
+    ArchaiusUtils.resetConfig();
+    ClassLoaderScopeContext.clearClassLoaderScopeProperty();
   }
 
   @Test
   public void testBuildProducerPathsNoPrefix() {
-    SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
+    SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest()
         .addProducerMeta("sid1", new TestPathSchema())
         .run();
     ServicePathManager spm = ServicePathManager.getServicePathManager(scbEngine.getProducerMicroserviceMeta());
@@ -44,9 +55,9 @@ public class TestServicePathManager {
 
   @Test
   public void testBuildProducerPathsHasPrefix() {
-    SCBEngine.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, "/root/rest");
+    ClassLoaderScopeContext.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, "/root/rest");
 
-    SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
+    SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest()
         .addProducerMeta("sid1", new TestPathSchema())
         .run();
     ServicePathManager spm = ServicePathManager.getServicePathManager(scbEngine.getProducerMicroserviceMeta());
diff --git a/core/pom.xml b/core/pom.xml
index a38fa32..3290b9e 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -38,6 +38,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
+      <artifactId>foundation-registry</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
       <artifactId>swagger-invocation-core</artifactId>
     </dependency>
     <dependency>
diff --git a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
index ff226e0..ded2504 100644
--- a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
+++ b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
@@ -19,9 +19,7 @@ package org.apache.servicecomb.core;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicLong;
@@ -67,7 +65,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.util.StringUtils;
 
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.eventbus.AllowConcurrentEvents;
 import com.google.common.eventbus.EventBus;
 import com.google.common.eventbus.Subscribe;
@@ -87,18 +84,6 @@ public class SCBEngine {
 
   private static final Object initializationLock = new Object();
 
-  /*
- * class loader scope property is used when users run java-chassis in an class loader separated environment.
- *
- * For examples, deploy two war's to web container, or deploy two bundles in an OSGI container.
- *
- * Now java chassis not testing this feature carefully, but we will support users doing so.
- *
- * users who using this feature can feed back your problems in issues.
- *
- */
-  private static final Map<String, String> CLASS_LOADER_SCOPE_CONTEXT = new HashMap<>();
-
   private volatile static SCBEngine INSTANCE;
 
   private ConsumerHandlerManager consumerHandlerManager = new ConsumerHandlerManager();
@@ -155,7 +140,7 @@ public class SCBEngine {
   }
 
   public String getAppId() {
-    return DiscoveryManager.INSTANCE.getApplicationId();
+    return RegistrationManager.INSTANCE.getAppId();
   }
 
   public void setStatus(SCBStatus status) {
@@ -181,20 +166,6 @@ public class SCBEngine {
     return RegistrationManager.INSTANCE.getSwaggerLoader();
   }
 
-
-  public static void setClassLoaderScopeProperty(String key, String value) {
-    CLASS_LOADER_SCOPE_CONTEXT.put(key, value);
-  }
-
-  public static String getClassLoaderScopeProperty(String key) {
-    return CLASS_LOADER_SCOPE_CONTEXT.get(key);
-  }
-
-  @VisibleForTesting
-  public static void clearClassLoaderScopeProperty() {
-    CLASS_LOADER_SCOPE_CONTEXT.clear();
-  }
-
   public ConsumerHandlerManager getConsumerHandlerManager() {
     return consumerHandlerManager;
   }
diff --git a/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBBootstrap.java b/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBBootstrap.java
index 26b1bfa..93926c0 100644
--- a/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBBootstrap.java
+++ b/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBBootstrap.java
@@ -20,26 +20,7 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 
 public class SCBBootstrap {
-  public SCBBootstrap useLocalRegistry() {
-    // TODO: local registry intialization
-    return this;
-  }
-
-  public SCBBootstrap useLocalRegistry(String localFile) {
-    // TODO: local registry intialization
-    return this;
-  }
-
-  public static SCBEngine runWithSpring() {
-    BeanUtils.init();
-    return SCBEngine.getInstance();
-  }
-
-  public SCBEngine createSCBEngine() {
-    return SCBEngine.getInstance();
-  }
-
-  public SCBEngine createSCBEngineForTest() {
+  public static SCBEngine createSCBEngineForTest() {
     return new SCBEngineForTest();
   }
 }
diff --git a/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java b/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java
index e663e5d..ca65112 100644
--- a/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java
+++ b/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java
@@ -24,10 +24,10 @@ import java.util.concurrent.ExecutorService;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.core.BootListener;
-import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.foundation.common.utils.IOUtils;
 import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.BasePath;
@@ -80,7 +80,7 @@ public class ProducerBootListener implements BootListener {
       return;
     }
 
-    String urlPrefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
+    String urlPrefix = ClassLoaderScopeContext.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     Map<String, BasePath> basePaths = new LinkedHashMap<>();
     for (SchemaMeta schemaMeta : microserviceMeta.getSchemaMetas().values()) {
       Swagger swagger = schemaMeta.getSwagger();
diff --git a/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerProviderManager.java b/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerProviderManager.java
index 56db136..dffad2e 100644
--- a/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerProviderManager.java
+++ b/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerProviderManager.java
@@ -30,6 +30,7 @@ import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.core.executor.ExecutorManager;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.engine.SwaggerProducer;
@@ -117,7 +118,7 @@ public class ProducerProviderManager {
   // call REST service by the full url. e.g. restTemplate.getForObejct("cse://serviceName/root/prefix/health")
   // By default, user's do not need context prefix, e.g. restTemplate.getForObejct("cse://serviceName/health")
   private void registerUrlPrefixToSwagger(Swagger swagger) {
-    String urlPrefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
+    String urlPrefix = ClassLoaderScopeContext.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     if (!StringUtils.isEmpty(urlPrefix) && !swagger.getBasePath().startsWith(urlPrefix)
         && DynamicPropertyFactory.getInstance()
         .getBooleanProperty(DefinitionConst.REGISTER_URL_PREFIX, false).get()) {
diff --git a/core/src/test/java/org/apache/servicecomb/core/TestCseApplicationListener.java b/core/src/test/java/org/apache/servicecomb/core/TestCseApplicationListener.java
index 315b199..ec1a4d4 100644
--- a/core/src/test/java/org/apache/servicecomb/core/TestCseApplicationListener.java
+++ b/core/src/test/java/org/apache/servicecomb/core/TestCseApplicationListener.java
@@ -21,6 +21,9 @@ import org.apache.servicecomb.core.CseApplicationListener;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.SCBStatus;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -31,11 +34,18 @@ import mockit.Mocked;
 public class TestCseApplicationListener {
   @Before
   public void before() {
+    ConfigUtil.installDynamicConfig();
+  }
 
+  @AfterClass
+  public static void classTeardown() {
+    DiscoveryManager.renewInstance();
+    ArchaiusUtils.resetConfig();
   }
+
   @Test
   public void onApplicationEvent_close(@Mocked ContextClosedEvent contextClosedEvent) {
-    SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+    SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest();
     scbEngine.setStatus(SCBStatus.UP);
 
     CseApplicationListener listener = new CseApplicationListener();
diff --git a/core/src/test/java/org/apache/servicecomb/core/TestTransport.java b/core/src/test/java/org/apache/servicecomb/core/TestTransport.java
index 7f51cba..065e411 100644
--- a/core/src/test/java/org/apache/servicecomb/core/TestTransport.java
+++ b/core/src/test/java/org/apache/servicecomb/core/TestTransport.java
@@ -27,7 +27,7 @@ import org.junit.Test;
 public class TestTransport {
   @BeforeClass
   public static void classSetup() {
-    new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+
   }
 
   @AfterClass
diff --git a/core/src/test/java/org/apache/servicecomb/core/filter/TestEndpointDiscoveryFilter.java b/core/src/test/java/org/apache/servicecomb/core/filter/TestEndpointDiscoveryFilter.java
index 13e7d3d..ea7d64e 100644
--- a/core/src/test/java/org/apache/servicecomb/core/filter/TestEndpointDiscoveryFilter.java
+++ b/core/src/test/java/org/apache/servicecomb/core/filter/TestEndpointDiscoveryFilter.java
@@ -41,7 +41,7 @@ public class TestEndpointDiscoveryFilter {
   @Mocked
   Invocation invocation;
 
-  SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+  SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest();
 
   @Before
   public void setup() {
diff --git a/core/src/test/java/org/apache/servicecomb/core/handler/impl/TestSimpleLoadBalanceHandler.java b/core/src/test/java/org/apache/servicecomb/core/handler/impl/TestSimpleLoadBalanceHandler.java
index 2f77345..0f8faac 100644
--- a/core/src/test/java/org/apache/servicecomb/core/handler/impl/TestSimpleLoadBalanceHandler.java
+++ b/core/src/test/java/org/apache/servicecomb/core/handler/impl/TestSimpleLoadBalanceHandler.java
@@ -21,12 +21,15 @@ import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
 import org.apache.servicecomb.foundation.common.cache.VersionedCache;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.discovery.DiscoveryFilter;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
@@ -54,10 +57,11 @@ public class TestSimpleLoadBalanceHandler {
 
   AsyncResponse ar = resp -> response = resp;
 
-  SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+  SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest();
 
   @Before
   public void setUp() throws Exception {
+    ConfigUtil.installDynamicConfig();
     new Expectations(SPIServiceUtils.class) {
       {
         SPIServiceUtils.getSortedService(DiscoveryFilter.class);
@@ -67,6 +71,14 @@ public class TestSimpleLoadBalanceHandler {
       }
     };
 
+    new Expectations(DiscoveryManager.INSTANCE.getInstanceCacheManager()) {
+      {
+        DiscoveryManager.INSTANCE.getInstanceCacheManager()
+            .getOrCreateVersionedCache(anyString, anyString, anyString);
+        result = instanceVersionedCache;
+      }
+    };
+
     handler = new SimpleLoadBalanceHandler();
     indexMap = Deencapsulation.getField(handler, "indexMap");
   }
@@ -74,6 +86,7 @@ public class TestSimpleLoadBalanceHandler {
   @After
   public void teardown() {
     scbEngine.destroy();
+    ArchaiusUtils.resetConfig();
   }
 
   @Test
@@ -81,7 +94,8 @@ public class TestSimpleLoadBalanceHandler {
     handler.handle(invocation, ar);
 
     Throwable result = response.getResult();
-    Assert.assertEquals("InvocationException: code=490;msg=CommonExceptionData [message=Unexpected consumer error, please check logs for details]",
+    Assert.assertEquals(
+        "InvocationException: code=490;msg=CommonExceptionData [message=Unexpected consumer error, please check logs for details]",
         result.getMessage());
     Assert.assertEquals("No available address found. microserviceName=null, version=null, discoveryGroupName=parent/",
         result.getCause().getMessage());
diff --git a/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java b/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java
index e45705d..6ff6e68 100644
--- a/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java
+++ b/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java
@@ -24,19 +24,18 @@ import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 
 import org.apache.servicecomb.core.Invocation;
-import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.foundation.vertx.VertxUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
-import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
-import org.junit.Before;
 import org.junit.Test;
 import org.springframework.util.ReflectionUtils;
 
 import com.netflix.config.DynamicProperty;
 
+import mockit.Expectations;
 import mockit.Mocked;
 
 public class TestAbstractTransport {
@@ -65,16 +64,6 @@ public class TestAbstractTransport {
     }
   }
 
-  @Before
-  public void setup() {
-
-  }
-
-  @After
-  public void teardown() {
-
-  }
-
   @AfterClass
   public static void classTeardown() {
     VertxUtils.blockCloseVertxByName("transport");
@@ -82,6 +71,11 @@ public class TestAbstractTransport {
 
   @Test
   public void testSetListenAddressWithoutSchemaChineseSpaceNewSC() throws UnsupportedEncodingException {
+    new Expectations() {
+      {
+        RegistrationManager.getPublishAddress("my", "127.0.0.1:9090");
+      }
+    };
 
     MyAbstractTransport transport = new MyAbstractTransport();
     transport.setListenAddressWithoutSchema("127.0.0.1:9090", Collections.singletonMap("country", "中 国"));
@@ -90,22 +84,6 @@ public class TestAbstractTransport {
   }
 
   @Test
-  public void testSetListenAddressWithoutSchemaChineseSpaceOldSC() {
-    MyAbstractTransport transport = new MyAbstractTransport();
-    try {
-      transport.setListenAddressWithoutSchema("127.0.0.1:9090", Collections.singletonMap("country", "中 国"));
-      Assert.fail("must throw exception");
-    } catch (ServiceCombException e) {
-      Assert.assertEquals(
-          "current service center not support encoded endpoint, please do not use chinese or space or anything need to be encoded.",
-          e.getMessage());
-      Assert.assertEquals(
-          "Illegal character in query at index 31: rest://127.0.0.1:9090?country=中 国",
-          e.getCause().getMessage());
-    }
-  }
-
-  @Test
   public void testSetListenAddressWithoutSchemaNormalNotEncode() {
     MyAbstractTransport transport = new MyAbstractTransport();
     transport.setListenAddressWithoutSchema("127.0.0.1:9090", Collections.singletonMap("country", "chinese"));
diff --git a/coverage-reports/pom.xml b/coverage-reports/pom.xml
index fc8336c..e1c2403 100644
--- a/coverage-reports/pom.xml
+++ b/coverage-reports/pom.xml
@@ -40,6 +40,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
+      <artifactId>foundation-registry</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
       <artifactId>foundation-ssl</artifactId>
     </dependency>
     <dependency>
diff --git a/dependencies/bom/pom.xml b/dependencies/bom/pom.xml
index d4a8925..65596e3 100644
--- a/dependencies/bom/pom.xml
+++ b/dependencies/bom/pom.xml
@@ -150,6 +150,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.servicecomb</groupId>
+        <artifactId>foundation-registry</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.servicecomb</groupId>
         <artifactId>foundation-ssl</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/distribution/pom.xml b/distribution/pom.xml
index a759d61..c438455 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -126,6 +126,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
+      <artifactId>foundation-registry</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
       <artifactId>foundation-ssl</artifactId>
     </dependency>
     <dependency>
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/ClassLoaderScopeContext.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/ClassLoaderScopeContext.java
new file mode 100644
index 0000000..c977b76
--- /dev/null
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/ClassLoaderScopeContext.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.foundation.common.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.common.annotations.VisibleForTesting;
+
+/**
+* class loader scope property is used when users run java-chassis in an class loader separated environment.
+*
+* For examples, deploy two war's to web container, or deploy two bundles in an OSGI container.
+*
+* Now java chassis not testing this feature carefully, but we will support users doing so.
+*
+* users who using this feature can feed back your problems in issues.
+*
+*/
+public class ClassLoaderScopeContext {
+
+  private static final Map<String, String> CLASS_LOADER_SCOPE_CONTEXT = new HashMap<>();
+
+  public static void setClassLoaderScopeProperty(String key, String value) {
+    CLASS_LOADER_SCOPE_CONTEXT.put(key, value);
+  }
+
+  public static String getClassLoaderScopeProperty(String key) {
+    return CLASS_LOADER_SCOPE_CONTEXT.get(key);
+  }
+
+  @VisibleForTesting
+  public static void clearClassLoaderScopeProperty() {
+    CLASS_LOADER_SCOPE_CONTEXT.clear();
+  }
+}
diff --git a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestURIEndpointObject.java b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestURIEndpointObject.java
index 5f7f4d4..973414e 100644
--- a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestURIEndpointObject.java
+++ b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestURIEndpointObject.java
@@ -48,6 +48,11 @@ public class TestURIEndpointObject {
     Assert.assertTrue(obj.isSslEnabled());
     Assert.assertTrue(obj.isHttp2Enabled());
     Assert.assertNull(obj.getFirst("notExist"));
+
+    obj = new URIEndpointObject("rest://127.0.2.0:8080?urlPrefix=%2Froot");
+    Assert.assertEquals("127.0.2.0", obj.getHostOrIp());
+    Assert.assertEquals(8080, obj.getPort());
+    Assert.assertEquals("/root", obj.getQuery("urlPrefix").get(0));
   }
 
   @Test(expected = IllegalArgumentException.class)
diff --git a/providers/provider-pojo/pom.xml b/foundations/foundation-registry/pom.xml
similarity index 73%
copy from providers/provider-pojo/pom.xml
copy to foundations/foundation-registry/pom.xml
index 6f62447..bceaaa4 100644
--- a/providers/provider-pojo/pom.xml
+++ b/foundations/foundation-registry/pom.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
   ~ Licensed to the Apache Software Foundation (ASF) under one or more
   ~ contributor license agreements.  See the NOTICE file distributed with
@@ -17,32 +18,26 @@
 
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
   <parent>
+    <artifactId>foundations</artifactId>
     <groupId>org.apache.servicecomb</groupId>
-    <artifactId>providers</artifactId>
     <version>2.1.0-SNAPSHOT</version>
   </parent>
-  <artifactId>provider-pojo</artifactId>
-  <name>Java Chassis::Providers::POJO</name>
+  <modelVersion>4.0.0</modelVersion>
+
+  <properties>
+  </properties>
+
+  <artifactId>foundation-registry</artifactId>
+  <name>Java Chassis::Foundations::Registry</name>
   <dependencies>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
-      <artifactId>java-chassis-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <scope>test</scope>
+      <artifactId>foundation-config</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
-      <artifactId>foundation-test-scaffolding</artifactId>
+      <artifactId>swagger-invocation-core</artifactId>
     </dependency>
   </dependencies>
 </project>
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
similarity index 95%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
index 39a0009..b6804f6 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
@@ -31,6 +31,8 @@ import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
 import org.apache.servicecomb.serviceregistry.definition.MicroserviceDefinition;
 
+import com.google.common.annotations.VisibleForTesting;
+
 public class DiscoveryManager {
   public static DiscoveryManager INSTANCE = new DiscoveryManager();
 
@@ -42,7 +44,7 @@ public class DiscoveryManager {
 
   private final MicroserviceDefinition microserviceDefinition;
 
-  public DiscoveryManager() {
+  private DiscoveryManager() {
     appManager = new AppManager();
     instanceCacheManager = new InstanceCacheManagerNew(appManager);
     discoveryList = SPIServiceUtils.getOrLoadSortedService(Discovery.class);
@@ -51,6 +53,11 @@ public class DiscoveryManager {
     microserviceDefinition = new MicroserviceDefinition(loader.getConfigModels());
   }
 
+  @VisibleForTesting
+  public static void renewInstance() {
+    DiscoveryManager.INSTANCE = new DiscoveryManager();
+  }
+
   public MicroserviceInstances findServiceInstances(String appId, String serviceName,
       String versionRule) {
     MicroserviceInstances result = new MicroserviceInstances();
@@ -107,10 +114,6 @@ public class DiscoveryManager {
     return appManager.getOrCreateMicroserviceVersions(appId, microserviceName);
   }
 
-  public String getApplicationId() {
-    return microserviceDefinition.getApplicationId();
-  }
-
   public void destroy() {
     discoveryList.forEach(discovery -> discovery.destroy());
   }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
similarity index 98%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
index 7a17916..a860d8d 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
@@ -27,11 +27,13 @@ import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceS
 
 public interface Registration extends SPIOrder, LifeCycle {
   String name();
-  
+
   MicroserviceInstance getMicroserviceInstance();
 
   Microservice getMicroservice();
 
+  String getAppId();
+
   boolean updateMicroserviceInstanceStatus(MicroserviceInstanceStatus status);
 
   void addSchema(String schemaId, String content);
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
similarity index 99%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
index b89add2..3309568 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
@@ -61,6 +61,10 @@ public class RegistrationManager {
     return primary.getMicroservice();
   }
 
+  public String getAppId() {
+    return primary.getAppId();
+  }
+
   public SwaggerLoader getSwaggerLoader() {
     return swaggerLoader;
   }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/MicroserviceKey.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/MicroserviceKey.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/MicroserviceKey.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/MicroserviceKey.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/PropertyExtended.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/PropertyExtended.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/PropertyExtended.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/PropertyExtended.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/Versions.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Versions.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/Versions.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Versions.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/BasePath.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/BasePath.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/BasePath.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/BasePath.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/DataCenterInfo.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/DataCenterInfo.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/DataCenterInfo.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/DataCenterInfo.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Framework.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Framework.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Framework.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Framework.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/FrameworkVersions.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/FrameworkVersions.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/FrameworkVersions.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/FrameworkVersions.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheck.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheck.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheck.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheck.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheckMode.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheckMode.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheckMode.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/HealthCheckMode.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/Microservice.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstance.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstance.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstance.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstance.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstanceStatus.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstanceStatus.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstanceStatus.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceInstanceStatus.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceStatus.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceStatus.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceStatus.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/MicroserviceStatus.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/WatchAction.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/WatchAction.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/WatchAction.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/registry/WatchAction.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/MicroserviceInstanceChangedEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/response/MicroserviceInstanceChangedEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/MicroserviceInstanceChangedEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/response/MicroserviceInstanceChangedEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/CacheEndpoint.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/CacheEndpoint.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/cache/CacheEndpoint.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/CacheEndpoint.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCache.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCache.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCache.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCache.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManagerNew.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManagerNew.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManagerNew.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManagerNew.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/config/AbstractPropertiesLoader.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/AbstractPropertiesLoader.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/config/AbstractPropertiesLoader.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/AbstractPropertiesLoader.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java
similarity index 94%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java
index 464419a..fb2432b 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java
+++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ConfigurePropertyUtils.java
@@ -25,7 +25,7 @@ import java.util.Map;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.lang.StringUtils;
-import org.apache.servicecomb.core.SCBEngine;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.serviceregistry.api.registry.BasePath;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 
@@ -73,7 +73,7 @@ public final class ConfigurePropertyUtils {
   }
 
   private static String buildPath(String path) {
-    String prefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
+    String prefix = ClassLoaderScopeContext.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     if (StringUtils.isNotEmpty(prefix)) {
       if (!path.startsWith(prefix)) {
         path = prefix + path;
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/config/InstancePropertiesLoader.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/InstancePropertiesLoader.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/config/InstancePropertiesLoader.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/InstancePropertiesLoader.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryCommonConfig.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryCommonConfig.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryCommonConfig.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryCommonConfig.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/AppManager.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceInstancePing.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceInstancePing.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceInstancePing.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceInstancePing.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceManager.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceManager.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceManager.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceManager.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRule.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRuleData.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRuleData.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRuleData.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersionRuleData.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/SimpleMicroserviceInstancePing.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/SimpleMicroserviceInstancePing.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/SimpleMicroserviceInstancePing.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/SimpleMicroserviceInstancePing.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceDefinition.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceDefinition.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceDefinition.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceDefinition.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractDiscoveryFilter.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractDiscoveryFilter.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractDiscoveryFilter.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractDiscoveryFilter.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryContext.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryContext.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryContext.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryContext.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryFilter.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryFilter.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryFilter.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryFilter.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTreeNode.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/InstanceStatusDiscoveryFilter.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/InstanceStatusDiscoveryFilter.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/InstanceStatusDiscoveryFilter.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/InstanceStatusDiscoveryFilter.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceVersionEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceVersionEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceVersionEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/CreateMicroserviceVersionEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceVersionEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceVersionEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceVersionEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/DestroyMicroserviceVersionEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ExceptionEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ExceptionEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ExceptionEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ExceptionEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatFailEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatFailEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatFailEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatFailEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatSuccEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatSuccEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatSuccEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/HeartbeatSuccEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/RecoveryEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/RecoveryEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/RecoveryEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/RecoveryEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/SafeModeChangeEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/SafeModeChangeEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/SafeModeChangeEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/SafeModeChangeEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ShutdownEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ShutdownEvent.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ShutdownEvent.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/event/ShutdownEvent.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/version/Version.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/Version.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/version/Version.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/Version.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRule.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRule.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRule.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRule.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleFixedParser.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleFixedParser.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleFixedParser.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleFixedParser.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleLatestParser.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleLatestParser.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleLatestParser.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleLatestParser.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleParser.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleParser.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleParser.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleParser.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleRangeParser.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleRangeParser.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleRangeParser.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleRangeParser.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleStartFromParser.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleStartFromParser.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleStartFromParser.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleStartFromParser.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleUtils.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleUtils.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleUtils.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionRuleUtils.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionUtils.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionUtils.java
similarity index 100%
rename from core/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionUtils.java
rename to foundations/foundation-registry/src/main/java/org/apache/servicecomb/serviceregistry/version/VersionUtils.java
diff --git a/foundations/pom.xml b/foundations/pom.xml
index 5ddcf95..65e1198 100644
--- a/foundations/pom.xml
+++ b/foundations/pom.xml
@@ -35,5 +35,6 @@
     <module>foundation-ssl</module>
     <module>foundation-test-scaffolding</module>
     <module>foundation-protobuf</module>
+    <module>foundation-registry</module>
   </modules>
 </project>
diff --git a/handlers/handler-loadbalance/pom.xml b/handlers/handler-loadbalance/pom.xml
index 522ccf6..66a0c49 100644
--- a/handlers/handler-loadbalance/pom.xml
+++ b/handlers/handler-loadbalance/pom.xml
@@ -71,7 +71,11 @@
       <artifactId>annotations</artifactId>
       <scope>provided</scope>
     </dependency>
-
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>foundation-test-scaffolding</artifactId>
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
index 0c4fc46..d2b9a98 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.NonSwaggerInvocation;
@@ -43,6 +44,9 @@ import org.apache.servicecomb.loadbalance.event.IsolationServerEvent;
 import org.apache.servicecomb.loadbalance.filter.IsolationDiscoveryFilter;
 import org.apache.servicecomb.loadbalance.filter.ServerDiscoveryFilter;
 import org.apache.servicecomb.loadbalance.filter.ZoneAwareDiscoveryFilter;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 import org.apache.servicecomb.serviceregistry.api.registry.DataCenterInfo;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
@@ -55,6 +59,7 @@ import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -70,7 +75,14 @@ import mockit.MockUp;
 public class TestLoadBalanceHandler2 {
   private Holder<Long> mockTimeMillis;
 
-  static SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+  private static SCBEngine scbEngine;
+
+  @BeforeClass
+  public static void beforeClass() {
+    ConfigUtil.installDynamicConfig();
+    RegistryUtils.initWithLocalRegistry();
+    scbEngine = SCBBootstrap.createSCBEngineForTest();
+  }
 
   @AfterClass
   public static void afterClass() {
@@ -80,9 +92,6 @@ public class TestLoadBalanceHandler2 {
 
   @Before
   public void setUp() {
-    // clear up load balance stats
-    //prepare for defineEndpointAndHandle
-    ArchaiusUtils.resetConfig();
     ArchaiusUtils.setProperty("servicecomb.loadbalance.userDefinedEndpoint.enabled", "true");
     // avoid mock
     ServiceCombLoadBalancerStats.INSTANCE.init();
@@ -99,7 +108,6 @@ public class TestLoadBalanceHandler2 {
 
   @After
   public void teardown() {
-    ArchaiusUtils.resetConfig();
     ServiceCombServerStats.releaseTryingChance();
   }
 
@@ -119,7 +127,7 @@ public class TestLoadBalanceHandler2 {
     Invocation invocation = new Invocation(referenceConfig, operationMeta, invocationRuntimeType, new HashMap<>());
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
-
+    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -169,6 +177,10 @@ public class TestLoadBalanceHandler2 {
     DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
     scbEngine.setTransportManager(transportManager);
 
+    RegistryUtils.setServiceRegistry(serviceRegistry);
+
+    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
+    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -265,6 +277,7 @@ public class TestLoadBalanceHandler2 {
     Invocation invocation = new Invocation(referenceConfig, operationMeta, invocationRuntimeType, new HashMap<>());
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
+    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -292,6 +305,10 @@ public class TestLoadBalanceHandler2 {
     DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
     scbEngine.setTransportManager(transportManager);
 
+    RegistryUtils.setServiceRegistry(serviceRegistry);
+
+    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
+    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -350,6 +367,7 @@ public class TestLoadBalanceHandler2 {
     Invocation invocation = new Invocation(referenceConfig, operationMeta, invocationRuntimeType, new HashMap<>());
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
+    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -399,6 +417,10 @@ public class TestLoadBalanceHandler2 {
     DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
     scbEngine.setTransportManager(transportManager);
 
+    RegistryUtils.setServiceRegistry(serviceRegistry);
+
+    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
+    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -472,6 +494,7 @@ public class TestLoadBalanceHandler2 {
     });
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
+    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -521,6 +544,10 @@ public class TestLoadBalanceHandler2 {
     DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
     scbEngine.setTransportManager(transportManager);
 
+    RegistryUtils.setServiceRegistry(serviceRegistry);
+
+    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
+    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -610,6 +637,7 @@ public class TestLoadBalanceHandler2 {
     });
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
+    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -660,6 +688,10 @@ public class TestLoadBalanceHandler2 {
     DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
     scbEngine.setTransportManager(transportManager);
 
+    RegistryUtils.setServiceRegistry(serviceRegistry);
+
+    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
+    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -757,7 +789,7 @@ public class TestLoadBalanceHandler2 {
     AsyncResponse asyncResp = Mockito.mock(AsyncResponse.class);
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
-
+    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -776,6 +808,10 @@ public class TestLoadBalanceHandler2 {
     scbEngine.setTransportManager(transportManager);
     SCBEngine.getInstance().setTransportManager(transportManager);
 
+    RegistryUtils.setServiceRegistry(serviceRegistry);
+
+    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
+    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -958,4 +994,19 @@ public class TestLoadBalanceHandler2 {
   private void mockDelayMillis(long delay) {
     mockTimeMillis.value += delay;
   }
+
+  private void mockUpInstanceCacheManager(InstanceCacheManager instanceCacheManager) {
+    new MockUp<DiscoveryManager>() {
+      @Mock
+      public InstanceCacheManager getInstanceCacheManager() {
+        return instanceCacheManager;
+      }
+    };
+  }
+
+  private ServiceRegistry mockUpServiceRegistry() {
+    ServiceRegistry serviceRegistry = Mockito.mock(ServiceRegistry.class);
+    when(serviceRegistry.getEventBus()).thenReturn(EventManager.getEventBus());
+    return serviceRegistry;
+  }
 }
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java
index abe1022..ed05c89 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java
@@ -27,6 +27,7 @@ import java.util.concurrent.ExecutorService;
 
 import javax.ws.rs.core.Response.Status;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
@@ -35,6 +36,7 @@ import org.apache.servicecomb.core.transport.TransportManager;
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.cache.CacheEndpoint;
 import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager;
@@ -92,19 +94,13 @@ public class TestLoadbalanceHandler {
   @Rule
   public ExpectedException expectedException = ExpectedException.none();
 
-  @BeforeClass
-  public static void classSetup() {
-    scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest().run();
-    transportManager = scbEngine.getTransportManager();
-  }
-
-  @AfterClass
-  public static void classTeardown() {
-    scbEngine.destroy();
-  }
-
   @Before
   public void setUp() {
+    ConfigUtil.installDynamicConfig();
+    RegistryUtils.initWithLocalRegistry();
+    scbEngine = SCBBootstrap.createSCBEngineForTest().run();
+    transportManager = scbEngine.getTransportManager();
+
     new MockUp<Invocation>(invocation) {
       @Mock
       String getMicroserviceName() {
@@ -144,7 +140,9 @@ public class TestLoadbalanceHandler {
 
   @After
   public void teardown() {
+    scbEngine.destroy();
     ArchaiusUtils.resetConfig();
+
   }
 
   @Test
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestServerDiscoveryFilter.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestServerDiscoveryFilter.java
index 79fef4d..3e73611 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestServerDiscoveryFilter.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestServerDiscoveryFilter.java
@@ -44,7 +44,7 @@ public class TestServerDiscoveryFilter {
 
   @BeforeClass
   public static void setup() {
-    scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest().run();
+    scbEngine = SCBBootstrap.createSCBEngineForTest().run();
     transportManager = scbEngine.getTransportManager();
   }
 
diff --git a/handlers/handler-publickey-auth/pom.xml b/handlers/handler-publickey-auth/pom.xml
index 4393605..3f930ca 100644
--- a/handlers/handler-publickey-auth/pom.xml
+++ b/handlers/handler-publickey-auth/pom.xml
@@ -37,6 +37,11 @@
       <artifactId>java-chassis-core</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
       <scope>test</scope>
diff --git a/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestAuthHandlerBoot.java b/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestAuthHandlerBoot.java
index 5cceb6f..2961c44 100644
--- a/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestAuthHandlerBoot.java
+++ b/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestAuthHandlerBoot.java
@@ -17,16 +17,31 @@
 package org.apache.servicecomb.authentication;
 
 import org.apache.servicecomb.AuthHandlerBoot;
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.BootListener;
 import org.apache.servicecomb.core.BootListener.BootEvent;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.token.RSAKeypair4Auth;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.junit.After;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
 public class TestAuthHandlerBoot {
 
+  @Before
+  public void setUp() {
+    ConfigUtil.installDynamicConfig();
+    RegistryUtils.initWithLocalRegistry();
+  }
+
+  @After
+  public void teardown() {
+    ArchaiusUtils.resetConfig();
+  }
 
   @Test
   public void testGenerateRSAKey() {
diff --git a/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestRSAProviderTokenManager.java b/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestRSAProviderTokenManager.java
index d0ab949..1c29927 100644
--- a/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestRSAProviderTokenManager.java
+++ b/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestRSAProviderTokenManager.java
@@ -27,6 +27,8 @@ import org.apache.servicecomb.foundation.common.utils.RSAKeyPairEntry;
 import org.apache.servicecomb.foundation.common.utils.RSAUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.token.RSAKeypair4Auth;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.cache.MicroserviceInstanceCache;
@@ -45,12 +47,13 @@ public class TestRSAProviderTokenManager {
 
 
   @Before
-  public void setUp() throws Exception {
+  public void setUp() {
     ConfigUtil.installDynamicConfig();
+    RegistryUtils.initWithLocalRegistry();
   }
 
   @After
-  public void tearDown() {
+  public void teardown() {
     ArchaiusUtils.resetConfig();
   }
 
@@ -116,7 +119,14 @@ public class TestRSAProviderTokenManager {
     properties.put(DefinitionConst.INSTANCE_PUBKEY_PRO, rsaKeyPairEntry.getPublicKeyEncoded());
     Microservice microservice = new Microservice();
     microservice.setServiceId(serviceId);
-
+    new Expectations(RegistrationManager.INSTANCE) {
+      {
+        RegistrationManager.INSTANCE.getMicroservice();
+        result = microservice;
+        RegistrationManager.INSTANCE.getMicroserviceInstance();
+        result = microserviceInstance;
+      }
+    };
     //Test Consumer first create token
     String token = rsaConsumerTokenManager.getToken();
     Assert.assertNotNull(token);
diff --git a/inspector/pom.xml b/inspector/pom.xml
index 9afba9d..b1cbf9f 100644
--- a/inspector/pom.xml
+++ b/inspector/pom.xml
@@ -58,7 +58,11 @@
       <groupId>io.github.swagger2markup</groupId>
       <artifactId>swagger2markup</artifactId>
     </dependency>
-
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>foundation-test-scaffolding</artifactId>
diff --git a/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorImpl.java b/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorImpl.java
index 1fdb55a..e86ad2a 100644
--- a/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorImpl.java
+++ b/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorImpl.java
@@ -53,6 +53,7 @@ import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.foundation.common.part.InputStreamPart;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.inspector.internal.model.DynamicPropertyView;
 import org.apache.servicecomb.inspector.internal.model.PriorityPropertyView;
 import org.apache.servicecomb.inspector.internal.swagger.AppendStyleProcessor;
@@ -129,7 +130,7 @@ public class InspectorImpl {
       return;
     }
 
-    String urlPrefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
+    String urlPrefix = ClassLoaderScopeContext.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     if (StringUtils.isEmpty(urlPrefix)) {
       return;
     }
diff --git a/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorBootListener.java b/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorBootListener.java
index 287a0be..a5b58e8 100644
--- a/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorBootListener.java
+++ b/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorBootListener.java
@@ -16,6 +16,7 @@
  */
 package org.apache.servicecomb.inspector.internal;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.config.priority.PriorityPropertyManager;
 import org.apache.servicecomb.core.BootListener.BootEvent;
 import org.apache.servicecomb.core.BootListener.EventType;
@@ -23,6 +24,7 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -35,7 +37,8 @@ public class TestInspectorBootListener {
 
   @BeforeClass
   public static void setup() {
-    ArchaiusUtils.resetConfig();
+    ConfigUtil.installDynamicConfig();
+    RegistryUtils.initWithLocalRegistry();
     priorityPropertyManager = new PriorityPropertyManager();
     inspectorConfig = priorityPropertyManager.createConfigObject(InspectorConfig.class);
   }
@@ -72,7 +75,7 @@ public class TestInspectorBootListener {
   public void diabled() {
     ArchaiusUtils.setProperty("servicecomb.inspector.enabled", false);
 
-    SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+    SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest();
     scbEngine.getTransportManager().clearTransportBeforeInit();
     scbEngine.run();
     Assert.assertNull(scbEngine.getProducerMicroserviceMeta().findSchemaMeta("inspector"));
@@ -83,7 +86,7 @@ public class TestInspectorBootListener {
   public void enabled() {
     ArchaiusUtils.setProperty("servicecomb.inspector.enabled", true);
 
-    SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+    SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest();
     scbEngine.getTransportManager().clearTransportBeforeInit();
     scbEngine.run();
     Assert.assertNotNull(scbEngine.getProducerMicroserviceMeta().findSchemaMeta("inspector"));
diff --git a/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorImpl.java b/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorImpl.java
index f28e51b..cb4b323 100644
--- a/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorImpl.java
+++ b/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorImpl.java
@@ -43,12 +43,15 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
 import org.apache.servicecomb.core.definition.CoreMetaUtils;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.exception.RuntimeExceptionWithoutStackTrace;
 import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector;
 import org.apache.servicecomb.inspector.internal.model.DynamicPropertyView;
 import org.apache.servicecomb.inspector.internal.model.PriorityPropertyView;
 import org.apache.servicecomb.inspector.internal.swagger.SchemaFormat;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.engine.SwaggerProducer;
@@ -75,7 +78,8 @@ public class TestInspectorImpl {
 
   @BeforeClass
   public static void setup() throws IOException {
-    ArchaiusUtils.resetConfig();
+    ConfigUtil.installDynamicConfig();
+    RegistryUtils.initWithLocalRegistry();
     schemas.put("schema1", IOUtils
         .toString(TestInspectorImpl.class.getClassLoader().getResource("schema1.yaml"), StandardCharsets.UTF_8));
     schemas.put("schema2", IOUtils
@@ -85,13 +89,13 @@ public class TestInspectorImpl {
   }
 
   private static InspectorImpl initInspector(String urlPrefix) {
-    SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+    SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest();
     scbEngine.getTransportManager().clearTransportBeforeInit();
 
     if (StringUtils.isNotEmpty(urlPrefix)) {
       Map<String, Transport> transportMap = Deencapsulation.getField(scbEngine.getTransportManager(), "transportMap");
       transportMap.put(RESTFUL, new ServletRestTransport());
-      SCBEngine.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, urlPrefix);
+      ClassLoaderScopeContext.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, urlPrefix);
     }
 
     scbEngine.run();
@@ -105,7 +109,7 @@ public class TestInspectorImpl {
   public static void teardown() {
     ArchaiusUtils.resetConfig();
     SCBEngine.getInstance().destroy();
-    SCBEngine.clearClassLoaderScopeProperty();
+    ClassLoaderScopeContext.clearClassLoaderScopeProperty();
   }
 
   private Map<String, String> unzip(InputStream is) throws IOException {
@@ -138,6 +142,15 @@ public class TestInspectorImpl {
   }
 
   private void testDownloadSchemasSwagger(Microservice microservice, SchemaFormat format) throws IOException {
+    new Expectations(RegistrationManager.INSTANCE) {
+      {
+        RegistrationManager.INSTANCE.getMicroservice();
+        result = microservice;
+        microservice.getServiceName();
+        result = "ms";
+      }
+    };
+
     Response response = inspector.downloadSchemas(format);
     Part part = response.getResult();
     Assert.assertEquals("ms.yaml.zip", part.getSubmittedFileName());
@@ -153,7 +166,14 @@ public class TestInspectorImpl {
 
   @Test
   public void downloadSchemas_html(@Mocked Microservice microservice) throws IOException {
-
+    new Expectations(RegistrationManager.INSTANCE) {
+      {
+        RegistrationManager.INSTANCE.getMicroservice();
+        result = microservice;
+        microservice.getServiceName();
+        result = "ms";
+      }
+    };
     Response response = inspector.downloadSchemas(SchemaFormat.HTML);
     Part part = response.getResult();
     Assert.assertEquals("ms.html.zip", part.getSubmittedFileName());
diff --git a/metrics/metrics-core/pom.xml b/metrics/metrics-core/pom.xml
index 2838f42..623f31d 100644
--- a/metrics/metrics-core/pom.xml
+++ b/metrics/metrics-core/pom.xml
@@ -41,7 +41,11 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>swagger-generator-jaxrs</artifactId>
     </dependency>
-
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>io.vertx</groupId>
       <artifactId>vertx-codegen</artifactId>
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java
index 4b4301d..7755c99 100644
--- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java
@@ -33,7 +33,7 @@ public class TestMetricsBootListener {
 
   @Test
   public void registerSchemas() {
-    new SCBBootstrap().useLocalRegistry().createSCBEngineForTest().run();
+    SCBBootstrap.createSCBEngineForTest().run();
 
     Microservice microservice = RegistrationManager.INSTANCE.getMicroservice();
     microservice.getSchemas().contains("healthEndpoint");
diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
index 7db5147..55961b8 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
@@ -105,7 +105,7 @@ public class PrometheusPublisher extends Collector implements Collector.Describa
     List<String> labelValues = new ArrayList<>();
 
     labelNames.add("appId");
-    labelValues.add(RegistrationManager.INSTANCE.getMicroservice().getAppId());
+    labelValues.add(RegistrationManager.INSTANCE.getAppId());
 
     for (Tag tag : measurement.id().tags()) {
       labelNames.add(tag.key());
diff --git a/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java b/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java
index c48c688..b61c55d 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java
@@ -28,6 +28,7 @@ import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Rule;
@@ -41,6 +42,7 @@ import com.netflix.spectator.api.Registry;
 import com.sun.net.httpserver.HttpServer;
 
 import io.prometheus.client.exporter.HTTPServer;
+import mockit.Expectations;
 
 @SuppressWarnings("restriction")
 public class TestPrometheusPublisher {
@@ -82,6 +84,12 @@ public class TestPrometheusPublisher {
 
   @Test
   public void collect() throws IllegalAccessException, IOException {
+    new Expectations(RegistrationManager.INSTANCE) {
+      {
+        RegistrationManager.INSTANCE.getAppId();
+        result = "testAppId";
+      }
+    };
     ArchaiusUtils.setProperty(PrometheusPublisher.METRICS_PROMETHEUS_ADDRESS, "localhost:0");
     publisher.init(globalRegistry, null, null);
 
diff --git a/providers/provider-pojo/pom.xml b/providers/provider-pojo/pom.xml
index 6f62447..7056341 100644
--- a/providers/provider-pojo/pom.xml
+++ b/providers/provider-pojo/pom.xml
@@ -31,6 +31,11 @@
       <artifactId>java-chassis-core</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
       <scope>test</scope>
diff --git a/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/TestInvoker.java b/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/TestInvoker.java
index 8f88361..3c5f325 100644
--- a/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/TestInvoker.java
+++ b/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/TestInvoker.java
@@ -21,11 +21,17 @@ import java.io.File;
 
 import javax.servlet.http.Part;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.vertx.http.ReadStreamPart;
 import org.apache.servicecomb.provider.pojo.definition.PojoConsumerMeta;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.junit.After;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
 import com.fasterxml.jackson.databind.JavaType;
@@ -33,231 +39,6 @@ import com.fasterxml.jackson.databind.JavaType;
 import mockit.Deencapsulation;
 
 public class TestInvoker {
-//  @Rule
-//  public ExpectedException expectedException = ExpectedException.none();
-//
-//  SCBEngine scbEngine = new SCBEngine();
-//
-//  @Before
-//  public void setup() {
-//    new MockUp<SCBEngine>() {
-//      @Mock
-//      SCBEngine getInstance() {
-//        return scbEngine;
-//      }
-//    };
-//    scbEngine.setStatus(SCBStatus.UP);
-//  }
-//
-//  @Test
-//  public void testNormalSchemaId(@Injectable ConsumerProviderManager manager,
-//      @Injectable ReferenceConfig config,
-//      @Injectable MicroserviceMeta microserviceMeta) {
-//    new Expectations() {
-//      {
-//        manager.getReferenceConfig("test");
-//        result = config;
-//        config.getMicroserviceMeta();
-//        result = microserviceMeta;
-//      }
-//    };
-//    scbEngine.setConsumerProviderManager(manager);
-//    CseContext.getInstance().setSwaggerEnvironment(new BootstrapNormal().boot());
-//
-//    Invoker invoker = new Invoker("test", "schemaId", IPerson.class);
-//    InvokerMeta invokerMeta = invoker.createInvokerMeta();
-//
-//    Assert.assertEquals(IPerson.class, invokerMeta.swaggerConsumer.getConsumerIntf());
-//  }
-//
-//  @Test
-//  public void testFindSchemaByConsumerInterface(@Injectable ConsumerProviderManager manager,
-//      @Injectable ReferenceConfig config,
-//      @Injectable MicroserviceMeta microserviceMeta) {
-//    new Expectations() {
-//      {
-//        manager.getReferenceConfig("test");
-//        result = config;
-//        config.getMicroserviceMeta();
-//        result = microserviceMeta;
-//        microserviceMeta.findSchemaMeta(IPerson.class);
-//      }
-//    };
-//    scbEngine.setConsumerProviderManager(manager);
-//    CseContext.getInstance().setSwaggerEnvironment(new BootstrapNormal().boot());
-//
-//    Invoker invoker = new Invoker("test", null, IPerson.class);
-//    InvokerMeta invokerMeta = invoker.createInvokerMeta();
-//
-//    Assert.assertEquals(IPerson.class, invokerMeta.swaggerConsumer.getConsumerIntf());
-//  }
-//
-//  @Test
-//  public void testConsumerInterfaceAsSchemaId(@Injectable ConsumerProviderManager manager,
-//      @Injectable ReferenceConfig config,
-//      @Injectable MicroserviceMeta microserviceMeta) {
-//    new Expectations() {
-//      {
-//        manager.getReferenceConfig("test");
-//        result = config;
-//        config.getMicroserviceMeta();
-//        result = microserviceMeta;
-//        microserviceMeta.findSchemaMeta(IPerson.class);
-//        result = null;
-//      }
-//    };
-//    scbEngine.setConsumerProviderManager(manager);
-//    CseContext.getInstance().setSwaggerEnvironment(new BootstrapNormal().boot());
-//
-//    Invoker invoker = new Invoker("test", null, IPerson.class);
-//    InvokerMeta invokerMeta = invoker.createInvokerMeta();
-//    Assert.assertEquals(IPerson.class, invokerMeta.swaggerConsumer.getConsumerIntf());
-//  }
-//
-//  @Test
-//  public void syncInvoke_normal(@Mocked Invocation invocation,
-//      @Mocked SwaggerConsumerOperation consumerOperation,
-//      @Mocked ConsumerResponseMapper mapper) {
-//    Response response = Response.ok("1");
-//    new MockUp<InvokerUtils>() {
-//      @Mock
-//      Response innerSyncInvoke(Invocation invocation) {
-//        return response;
-//      }
-//    };
-//    new Expectations() {
-//      {
-//        consumerOperation.getResponseMapper();
-//        result = mapper;
-//        mapper.mapResponse(response);
-//        result = 1;
-//      }
-//    };
-//
-//    Invoker invoker = new Invoker("test", null, IPerson.class);
-//    Object result = invoker.syncInvoke(invocation, consumerOperation);
-//    Assert.assertEquals(1, result);
-//  }
-//
-//  @Test
-//  public void syncInvoke_failed(@Mocked Invocation invocation,
-//      @Mocked SwaggerConsumerOperation consumerOperation,
-//      @Mocked ConsumerResponseMapper mapper) {
-//    Throwable error = new RuntimeExceptionWithoutStackTrace("failed");
-//    Response response = Response.createConsumerFail(error);
-//    new MockUp<InvokerUtils>() {
-//      @Mock
-//      Response innerSyncInvoke(Invocation invocation) {
-//        return response;
-//      }
-//    };
-//
-//    expectedException.expect(InvocationException.class);
-//    expectedException.expectCause(Matchers.sameInstance(error));
-//
-//    Invoker invoker = new Invoker("test", null, IPerson.class);
-//    invoker.syncInvoke(invocation, consumerOperation);
-//  }
-//
-//  @Test
-//  public void completableFutureInvoke_normal(@Mocked Invocation invocation,
-//      @Mocked SwaggerConsumerOperation consumerOperation,
-//      @Mocked ConsumerResponseMapper mapper) {
-//    Response response = Response.ok("1");
-//    new MockUp<InvokerUtils>() {
-//      @Mock
-//      void reactiveInvoke(Invocation invocation, AsyncResponse asyncResp) {
-//        asyncResp.handle(response);
-//      }
-//    };
-//    new Expectations() {
-//      {
-//        consumerOperation.getResponseMapper();
-//        result = mapper;
-//        mapper.mapResponse(response);
-//        result = 1;
-//      }
-//    };
-//
-//    Invoker invoker = new Invoker("test", null, IPerson.class);
-//    CompletableFuture<Object> future = invoker.completableFutureInvoke(invocation, consumerOperation);
-//    future.whenComplete((result, ex) -> {
-//      Assert.assertEquals(1, result);
-//      Assert.assertEquals(null, ex);
-//    });
-//
-//    Assert.assertThat(future, Matchers.instanceOf(InvocationContextCompletableFuture.class));
-//  }
-//
-//  @Test
-//  public void completableFutureInvoke_failed(@Mocked Invocation invocation,
-//      @Mocked SwaggerConsumerOperation consumerOperation,
-//      @Mocked ConsumerResponseMapper mapper) {
-//    Throwable error = new RuntimeExceptionWithoutStackTrace("failed");
-//    Response response = Response.createConsumerFail(error);
-//    new MockUp<InvokerUtils>() {
-//      @Mock
-//      void reactiveInvoke(Invocation invocation, AsyncResponse asyncResp) {
-//        asyncResp.handle(response);
-//      }
-//    };
-//
-//    Invoker invoker = new Invoker("test", null, IPerson.class);
-//    CompletableFuture<Object> future = invoker.completableFutureInvoke(invocation, consumerOperation);
-//    future.whenComplete((result, ex) -> {
-//      Assert.assertEquals(null, result);
-//      Assert.assertSame(error, ex);
-//    });
-//  }
-//
-//  @Test
-//  public void createInvokerMeta_schemaNotInContract(@Injectable ConsumerProviderManager manager,
-//      @Injectable ReferenceConfig config,
-//      @Injectable MicroserviceMeta microserviceMeta) {
-//    new Expectations() {
-//      {
-//        manager.getReferenceConfig("test");
-//        result = config;
-//        config.getMicroserviceMeta();
-//        result = microserviceMeta;
-//        microserviceMeta.findSchemaMeta("schemaId");
-//        result = null;
-//      }
-//    };
-//    scbEngine.setConsumerProviderManager(manager);
-//    CseContext.getInstance().setSwaggerEnvironment(new BootstrapNormal().boot());
-//
-//    Invoker invoker = new Invoker("test", "schemaId", IPerson.class);
-//
-//    expectedException.expect(IllegalStateException.class);
-//    expectedException.expectMessage(Matchers
-//        .is("Schema not exist, microserviceName=test, schemaId=schemaId, consumer interface=org.apache.servicecomb.provider.pojo.IPerson; "
-//            + "new producer not running or not deployed."));
-//    invoker.createInvokerMeta();
-//  }
-//
-//  @Test
-//  public void invoke_methodNotInContract(@Mocked SwaggerConsumer swaggerConsumer,
-//      @Mocked ReferenceConfig referenceConfig, @Mocked MicroserviceMeta microserviceMeta) {
-//    Invoker invoker = new Invoker("test", null, IPerson.class);
-//    InvokerMeta invokerMeta = new InvokerMeta(referenceConfig, microserviceMeta, null, swaggerConsumer);
-//    Deencapsulation.setField(invoker, "invokerMeta", invokerMeta);
-//    new Expectations() {
-//      {
-//        swaggerConsumer.findOperation(anyString);
-//        result = null;
-//        referenceConfig.getMicroserviceMeta();
-//        result = microserviceMeta;
-//      }
-//    };
-//
-//    expectedException.expect(IllegalStateException.class);
-//    expectedException.expectMessage(Matchers
-//        .is("Consumer method org.apache.servicecomb.provider.pojo.IPerson:trim not exist in contract, "
-//            + "microserviceName=test, schemaId=null; new producer not running or not deployed."));
-//    invoker.invoke(null, ReflectUtils.findMethod(String.class, "trim"), null);
-//  }
-
   public interface DownloadIntf {
     ReadStreamPart download();
   }
@@ -268,9 +49,21 @@ public class TestInvoker {
     }
   }
 
+  @Before
+  public void setUp() {
+    ConfigUtil.installDynamicConfig();
+    DiscoveryManager.renewInstance();
+    RegistryUtils.initWithLocalRegistry();
+  }
+
+  @After
+  public void teardown() {
+    ArchaiusUtils.resetConfig();
+  }
+
   @Test
   public void should_generate_response_meta_for_download() {
-    SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
+    SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest()
         .addProducerMeta("download", new DownloadSchema()).run();
     Invoker invoker = new Invoker(scbEngine.getProducerMicroserviceMeta().getMicroserviceName(), "download",
         DownloadIntf.class);
diff --git a/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/reference/PojoReferenceMetaTest.java b/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/reference/PojoReferenceMetaTest.java
index ea0de79..24509c4 100644
--- a/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/reference/PojoReferenceMetaTest.java
+++ b/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/reference/PojoReferenceMetaTest.java
@@ -30,7 +30,7 @@ import org.junit.Test;
 public class PojoReferenceMetaTest {
   @Test
   public void testHasConsumerInterface() {
-    SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+    SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest();
 
     PojoReferenceMeta pojoReferenceMeta = new PojoReferenceMeta();
     pojoReferenceMeta.setMicroserviceName("test");
diff --git a/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/reference/TestRpcReferenceProcessor.java b/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/reference/TestRpcReferenceProcessor.java
index 1ed4237..6fa76da 100644
--- a/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/reference/TestRpcReferenceProcessor.java
+++ b/providers/provider-pojo/src/test/java/org/apache/servicecomb/provider/pojo/reference/TestRpcReferenceProcessor.java
@@ -39,7 +39,7 @@ public class TestRpcReferenceProcessor {
 
   @Test
   public void testReference(@Injectable ApplicationContext applicationContext) {
-    SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+    SCBEngine scbEngine = SCBBootstrap.createSCBEngineForTest();
 
     PersonReference bean = new PersonReference();
 
diff --git a/providers/provider-springmvc/pom.xml b/providers/provider-springmvc/pom.xml
index 23aae4b..8511290 100644
--- a/providers/provider-springmvc/pom.xml
+++ b/providers/provider-springmvc/pom.xml
@@ -35,12 +35,22 @@
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
       <artifactId>swagger-invocation-springmvc</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>swagger-generator-springmvc</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>foundation-test-scaffolding</artifactId>
+      <scope>test</scope>
+    </dependency>
     <!-- compile CseHttpMessageConverter need this one .-->
     <dependency>
       <groupId>com.google.code.findbugs</groupId>
diff --git a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseClientHttpRequest.java b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseClientHttpRequest.java
index 67621fc..637a71c 100644
--- a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseClientHttpRequest.java
+++ b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseClientHttpRequest.java
@@ -18,10 +18,13 @@ package org.apache.servicecomb.provider.springmvc.reference;
 
 import java.net.URI;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
 import org.apache.servicecomb.foundation.common.Holder;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -39,13 +42,16 @@ public class TestCseClientHttpRequest {
 
   @BeforeClass
   public static void classSetup() {
-    scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
+    ConfigUtil.installDynamicConfig();
+    RegistryUtils.initWithLocalRegistry();
+    scbEngine = SCBBootstrap.createSCBEngineForTest()
         .addProducerMeta("sid1", new SpringmvcImpl()).run();
   }
 
   @AfterClass
   public static void classTeardown() {
     scbEngine.destroy();
+    ArchaiusUtils.resetConfig();
   }
 
   @RequestMapping(path = "SpringmvcImpl")
diff --git a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java
index 1521689..ece0c38 100644
--- a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java
+++ b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java
@@ -20,11 +20,14 @@ package org.apache.servicecomb.provider.springmvc.reference.async;
 import java.net.URI;
 import java.util.concurrent.CompletableFuture;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.provider.springmvc.reference.CseClientHttpResponse;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -43,7 +46,10 @@ public class CseAsyncClientHttpRequestTest {
 
   @BeforeClass
   public static void classSetup() {
-    scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
+    ConfigUtil.installDynamicConfig();
+    RegistryUtils.initWithLocalRegistry();
+    DiscoveryManager.renewInstance();
+    scbEngine = SCBBootstrap.createSCBEngineForTest()
         .addProducerMeta("sid1", new CseAsyncClientHttpRequestTestSchema()).run();
   }
 
diff --git a/service-registry/pom.xml b/service-registry/pom.xml
index 136ccb0..71e6908 100644
--- a/service-registry/pom.xml
+++ b/service-registry/pom.xml
@@ -53,7 +53,7 @@
 
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
-      <artifactId>java-chassis-core</artifactId>
+      <artifactId>foundation-registry</artifactId>
     </dependency>
 
     <dependency>
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
index 2474ee8..6a6cd85 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
@@ -34,8 +34,6 @@ import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.response.FindInstancesResponse;
-import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager;
-import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManagerNew;
 import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
 import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
 import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
@@ -79,7 +77,15 @@ public final class RegistryUtils {
 
     MicroserviceConfigLoader loader = ConfigUtil.getMicroserviceConfigLoader();
     MicroserviceDefinition microserviceDefinition = new MicroserviceDefinition(loader.getConfigModels());
-    initializeServiceRegistries(microserviceDefinition);
+    initializeServiceRegistriesWithConfig(microserviceDefinition);
+
+    initAggregateServiceRegistryCache();
+  }
+
+  public static synchronized void initWithLocalRegistry() {
+    MicroserviceConfigLoader loader = ConfigUtil.getMicroserviceConfigLoader();
+    MicroserviceDefinition microserviceDefinition = new MicroserviceDefinition(loader.getConfigModels());
+    initializeLocalServiceRegistries(microserviceDefinition);
 
     initAggregateServiceRegistryCache();
   }
@@ -97,9 +103,19 @@ public final class RegistryUtils {
             .register(aggregateServiceRegistryCache));
   }
 
-  private static void initializeServiceRegistries(MicroserviceDefinition microserviceDefinition) {
+  private static void initializeServiceRegistriesWithConfig(MicroserviceDefinition microserviceDefinition) {
     serviceRegistry =
         ServiceRegistryFactory.create(ServiceRegistryConfig.INSTANCE, microserviceDefinition);
+    initializeServiceRegistries(microserviceDefinition);
+  }
+
+  private static void initializeLocalServiceRegistries(MicroserviceDefinition microserviceDefinition) {
+    serviceRegistry =
+        ServiceRegistryFactory.createLocal();
+    initializeServiceRegistries(microserviceDefinition);
+  }
+
+  private static void initializeServiceRegistries(MicroserviceDefinition microserviceDefinition) {
     EXTRA_SERVICE_REGISTRY_CONFIGS.forEach((k, v) -> {
       ServiceRegistry serviceRegistry = ServiceRegistryFactory.create(v, microserviceDefinition);
       addExtraServiceRegistry(serviceRegistry);
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterRegistration.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterRegistration.java
index ec0f69d..b7f3318 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterRegistration.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterRegistration.java
@@ -64,6 +64,11 @@ public class ServiceCenterRegistration implements Registration {
   }
 
   @Override
+  public String getAppId() {
+    return RegistryUtils.getAppId();
+  }
+
+  @Override
   public boolean updateMicroserviceInstanceStatus(MicroserviceInstanceStatus status) {
     RegistryUtils.executeOnEachServiceRegistry(sr -> new SuppressedRunnableWrapper(() -> {
       MicroserviceInstance selfInstance = sr.getMicroserviceInstance();
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/MockMicroserviceVersions.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/MockMicroserviceVersions.java
index b7dc262..6b9a74f 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/MockMicroserviceVersions.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/MockMicroserviceVersions.java
@@ -24,7 +24,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.consumer.AppManager;
@@ -35,8 +34,6 @@ import org.apache.servicecomb.serviceregistry.version.Version;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
 
-import com.google.common.eventbus.EventBus;
-
 import mockit.Mock;
 import mockit.MockUp;
 
@@ -49,19 +46,12 @@ public class MockMicroserviceVersions extends MicroserviceVersions {
   public MockMicroserviceVersions() {
     super(new AppManager(), "appId", "msName");
 
-    ServiceRegistry serviceRegistry = new MockUp<ServiceRegistry>() {
+    new MockUp<DiscoveryManager>() {
       @Mock
-      Microservice getAggregatedRemoteMicroservice(String microserviceId) {
+      public Microservice getMicroservice(String microserviceId) {
         return mockedMicroservices.get(microserviceId);
       }
-
-      @Mock
-      EventBus getEventBus() {
-        return EventManager.getEventBus();
-      }
-    }.getMockInstance();
-
-    RegistryUtils.setServiceRegistry(serviceRegistry);
+    };
 
     addMock("1.0.0", 2);
     addMock("2.0.0", 2);
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestConsumers.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestConsumers.java
index ec0f8d4..650ca14 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestConsumers.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestConsumers.java
@@ -19,10 +19,9 @@ package org.apache.servicecomb.serviceregistry;
 
 import java.util.Arrays;
 
-import org.apache.servicecomb.config.ConfigUtil;
-import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector;
 import org.apache.servicecomb.serviceregistry.api.MicroserviceKey;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.response.MicroserviceInstanceChangedEvent;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersion;
@@ -35,7 +34,8 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import mockit.Expectations;
+import mockit.Mock;
+import mockit.MockUp;
 
 public class TestConsumers extends TestRegistryBase {
   @Before
@@ -105,10 +105,10 @@ public class TestConsumers extends TestRegistryBase {
 
   @Test
   public void deleteWhenCreateMicroserviceVersion() {
-    new Expectations(RegistryUtils.getServiceRegistry()) {
-      {
-        RegistryUtils.getServiceRegistry().getAggregatedRemoteMicroservice(serviceId);
-        result = null;
+    new MockUp<DiscoveryManager>() {
+      @Mock
+      public Microservice getMicroservice(String microserviceId) {
+        return null;
       }
     };
 
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java
index 0cfeda5..bec1add 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java
@@ -67,6 +67,7 @@ public class TestRegistryBase {
     serviceRegistry = ServiceRegistryFactory.createLocal("registry.yaml");
     serviceRegistry.init();
 
+    DiscoveryManager.renewInstance();
     appManager = DiscoveryManager.INSTANCE.getAppManager();
     microserviceManager = appManager.getOrCreateMicroserviceManager(appId);
     eventBus = serviceRegistry.getEventBus();
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/cache/TestInstanceCacheManagerNew.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/cache/TestInstanceCacheManagerNew.java
index f9cc16f..a952f9a 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/cache/TestInstanceCacheManagerNew.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/cache/TestInstanceCacheManagerNew.java
@@ -17,10 +17,13 @@
 
 package org.apache.servicecomb.serviceregistry.cache;
 
+import org.apache.servicecomb.config.ConfigUtil;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.serviceregistry.MockMicroserviceVersions;
 import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceManager;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -36,6 +39,7 @@ public class TestInstanceCacheManagerNew {
 
   @Before
   public void setup() {
+    ConfigUtil.installDynamicConfig();
     mockMicroserviceVersions = new MockMicroserviceVersions();
     appManager = mockMicroserviceVersions.getAppManager();
     microserviceManager = appManager
@@ -43,6 +47,11 @@ public class TestInstanceCacheManagerNew {
     mgr = new InstanceCacheManagerNew(mockMicroserviceVersions.getAppManager());
   }
 
+  @AfterClass
+  public static void classTeardown() {
+    ArchaiusUtils.resetConfig();
+  }
+
   @Test
   public void getOrCreate() {
     mockMicroserviceVersions.update_all();
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/cache/TestMicroserviceInstanceCache.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/cache/TestMicroserviceInstanceCache.java
index 0e31341..acbddbc 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/cache/TestMicroserviceInstanceCache.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/cache/TestMicroserviceInstanceCache.java
@@ -17,12 +17,17 @@
 
 package org.apache.servicecomb.serviceregistry.cache;
 
+import org.apache.servicecomb.config.ConfigUtil;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
+import org.junit.AfterClass;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
 import mockit.Expectations;
@@ -31,13 +36,22 @@ import mockit.MockUp;
 import mockit.Mocked;
 
 public class TestMicroserviceInstanceCache {
+  @Before
+  public void setup() {
+    ConfigUtil.installDynamicConfig();
+  }
+
+  @AfterClass
+  public static void classTeardown() {
+    ArchaiusUtils.resetConfig();
+  }
+
   @Test
-  public void testGetOrCreateMicroservice(@Mocked ServiceRegistry serviceRegistry,
-      @Mocked ServiceRegistryClient client,
+  public void testGetOrCreateMicroservice(
       @Mocked Microservice microservice) {
-    new MockUp<RegistryUtils>() {
+    new MockUp<DiscoveryManager>() {
       @Mock
-      Microservice getAggregatedRemoteMicroservice(String microserviceId) {
+      public Microservice getMicroservice(String microserviceId) {
         if ("forkedid".equals(microserviceId)) {
           return microservice;
         }
@@ -47,6 +61,7 @@ public class TestMicroserviceInstanceCache {
         throw new IllegalArgumentException("unrecognized param");
       }
     };
+
     Microservice cachedService = MicroserviceInstanceCache.getOrCreate("forkedid");
     Assert.assertNotNull(cachedService);
     cachedService = MicroserviceInstanceCache.getOrCreate("forkedid");
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/config/TestConfigurePropertyUtils.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/config/TestConfigurePropertyUtils.java
index f6bd52f..05f590d 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/config/TestConfigurePropertyUtils.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/config/TestConfigurePropertyUtils.java
@@ -23,9 +23,7 @@ import java.util.Map;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.servicecomb.config.ConfigUtil;
-import org.apache.servicecomb.core.SCBEngine;
-import org.apache.servicecomb.deployment.Deployment;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.serviceregistry.api.registry.BasePath;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.junit.Assert;
@@ -34,7 +32,7 @@ import org.junit.Test;
 public class TestConfigurePropertyUtils {
   @Test
   public void testGetPropertiesWithPrefix() {
-    SCBEngine.clearClassLoaderScopeProperty();
+    ClassLoaderScopeContext.clearClassLoaderScopeProperty();
     Configuration configuration = ConfigUtil.createLocalConfig();
 
     String prefix = "service_description.properties";
@@ -48,11 +46,11 @@ public class TestConfigurePropertyUtils {
     Assert.assertEquals(paths.get(0).getPath(), "/test1/testpath");
     Assert.assertEquals(paths.get(0).getProperty().get("checksession"), false);
 
-    SCBEngine.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, "/webroot");
+    ClassLoaderScopeContext.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, "/webroot");
     paths = ConfigurePropertyUtils.getMicroservicePaths(configuration);
     Assert.assertEquals(2, paths.size());
     Assert.assertEquals(paths.get(0).getPath(), "/webroot/test1/testpath");
     Assert.assertEquals(paths.get(0).getProperty().get("checksession"), false);
-    SCBEngine.clearClassLoaderScopeProperty();
+    ClassLoaderScopeContext.clearClassLoaderScopeProperty();
   }
 }
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRuleFixed.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRuleFixed.java
index a927e54..3a00555 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRuleFixed.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRuleFixed.java
@@ -19,7 +19,10 @@ package org.apache.servicecomb.serviceregistry.consumer;
 
 import java.util.Collections;
 
+import org.apache.servicecomb.config.ConfigUtil;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.serviceregistry.MockMicroserviceVersions;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -31,11 +34,17 @@ public class TestMicroserviceVersionRuleFixed {
 
   @Before
   public void setup() {
+    ConfigUtil.installDynamicConfig();
     mockMicroserviceVersions = new MockMicroserviceVersions();
     microserviceVersionRule = mockMicroserviceVersions
         .getOrCreateMicroserviceVersionRule("2.0.0");
   }
 
+  @AfterClass
+  public static void classTeardown() {
+    ArchaiusUtils.resetConfig();
+  }
+
   @Test
   public void getVersionRule() {
     Assert.assertEquals("2.0.0.0", microserviceVersionRule.getVersionRule().getVersionRule());
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRuleLatest.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRuleLatest.java
index bdacf99..e7aa81b 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRuleLatest.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/consumer/TestMicroserviceVersionRuleLatest.java
@@ -19,8 +19,11 @@ package org.apache.servicecomb.serviceregistry.consumer;
 
 import java.util.Collections;
 
+import org.apache.servicecomb.config.ConfigUtil;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.serviceregistry.MockMicroserviceVersions;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -32,11 +35,17 @@ public class TestMicroserviceVersionRuleLatest {
 
   @Before
   public void setup() {
+    ConfigUtil.installDynamicConfig();
     mockMicroserviceVersions = new MockMicroserviceVersions();
     microserviceVersionRule = mockMicroserviceVersions
         .getOrCreateMicroserviceVersionRule(DefinitionConst.VERSION_RULE_LATEST);
   }
 
+  @AfterClass
+  public static void classTeardown() {
+    ArchaiusUtils.resetConfig();
+  }
+
   @Test
   public void getVersionRule() {
     Assert.assertEquals(DefinitionConst.VERSION_RULE_LATEST, microserviceVersionRule.getVersionRule().getVersionRule());
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerMock.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerMock.java
index e2f8af1..0a0d484 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerMock.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerMock.java
@@ -18,8 +18,10 @@ package org.apache.servicecomb.serviceregistry.diagnosis.instance;
 
 import java.util.ArrayList;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.common.testing.MockClock;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.ServiceRegistry;
@@ -27,7 +29,6 @@ import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.response.FindInstancesResponse;
 import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
-import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.serviceregistry.diagnosis.Status;
@@ -40,15 +41,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import io.vertx.core.json.Json;
-import mockit.Deencapsulation;
 import mockit.Mock;
 import mockit.MockUp;
 
 public class TestInstanceCacheCheckerMock {
   private static final Logger LOGGER = LoggerFactory.getLogger(TestInstanceCacheCheckerWithoutMock.class);
 
-  AppManager originalAppManager = DiscoveryManager.INSTANCE.getAppManager();
-
   ServiceRegistry serviceRegistry = ServiceRegistryFactory.createLocal();
 
   InstanceCacheChecker checker;
@@ -61,7 +59,7 @@ public class TestInstanceCacheCheckerMock {
 
   @Before
   public void setUp() throws Exception {
-    Deencapsulation.setField(RegistryUtils.class, "appManager", new AppManager());
+    ConfigUtil.installDynamicConfig();
 
     serviceRegistry.init();
     RegistryUtils.setServiceRegistry(serviceRegistry);
@@ -74,7 +72,7 @@ public class TestInstanceCacheCheckerMock {
 
   @After
   public void tearDown() throws Exception {
-
+    ArchaiusUtils.resetConfig();
   }
 
   private Holder<MicroserviceInstances> createFindServiceInstancesResult() {
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerWithoutMock.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerWithoutMock.java
index fe05c6f..2c688a4 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerWithoutMock.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerWithoutMock.java
@@ -18,12 +18,13 @@ package org.apache.servicecomb.serviceregistry.diagnosis.instance;
 
 import java.util.Arrays;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.common.testing.MockClock;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.ServiceRegistry;
-import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersionRule;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.serviceregistry.diagnosis.Status;
@@ -36,13 +37,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import io.vertx.core.json.Json;
-import mockit.Deencapsulation;
 
 public class TestInstanceCacheCheckerWithoutMock {
   private static final Logger LOGGER = LoggerFactory.getLogger(TestInstanceCacheCheckerWithoutMock.class);
 
-  AppManager originalAppManager = DiscoveryManager.INSTANCE.getAppManager();
-
   ServiceRegistry serviceRegistry = ServiceRegistryFactory.createLocal();
 
   InstanceCacheChecker checker;
@@ -55,7 +53,9 @@ public class TestInstanceCacheCheckerWithoutMock {
 
   @Before
   public void setUp() throws Exception {
-    Deencapsulation.setField(RegistryUtils.class, "appManager", new AppManager());
+    ConfigUtil.installDynamicConfig();
+
+    DiscoveryManager.renewInstance();
 
     serviceRegistry.init();
     RegistryUtils.setServiceRegistry(serviceRegistry);
@@ -68,8 +68,7 @@ public class TestInstanceCacheCheckerWithoutMock {
 
   @After
   public void tearDown() throws Exception {
-    Deencapsulation.setField(RegistryUtils.class, "appManager", originalAppManager);
-    RegistryUtils.setServiceRegistry(null);
+    ArchaiusUtils.resetConfig();
   }
 
   @Test
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceInstanceRegisterTask.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceInstanceRegisterTask.java
index ff7119a..2904a7f 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceInstanceRegisterTask.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceInstanceRegisterTask.java
@@ -19,6 +19,9 @@ package org.apache.servicecomb.serviceregistry.task;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.servicecomb.config.ConfigUtil;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.HealthCheck;
 import org.apache.servicecomb.serviceregistry.api.registry.HealthCheckMode;
@@ -26,6 +29,7 @@ import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
 import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -51,6 +55,7 @@ public class TestMicroserviceInstanceRegisterTask {
 
   @Before
   public void setup() {
+    ConfigUtil.installDynamicConfig();
     eventBus = new EventBus();
 
     taskList = new ArrayList<>();
@@ -73,6 +78,11 @@ public class TestMicroserviceInstanceRegisterTask {
     microservice.getInstance().setHealthCheck(healthCheck);
   }
 
+  @AfterClass
+  public static void classTeardown() {
+    ArchaiusUtils.resetConfig();
+  }
+
   @Test
   public void microserviceNotRegistered() {
     microservice.setServiceId(null);
@@ -88,6 +98,12 @@ public class TestMicroserviceInstanceRegisterTask {
   @Test
   public void registerIpSuccess() {
     MicroserviceInstance instance = microservice.getInstance();
+    new Expectations(RegistrationManager.class) {
+      {
+        RegistrationManager.getPublishAddress();
+        result = "127.0.0.1";
+      }
+    };
     new Expectations(RegistryUtils.class) {
       {
         serviceRegistryConfig.isPreferIpAddress();
@@ -116,6 +132,12 @@ public class TestMicroserviceInstanceRegisterTask {
   @Test
   public void registerHostSuccess() {
     MicroserviceInstance instance = microservice.getInstance();
+    new Expectations(RegistrationManager.class) {
+      {
+        RegistrationManager.getPublishHostName();
+        result = "hostName";
+      }
+    };
     new Expectations(RegistryUtils.class) {
       {
         serviceRegistryConfig.isPreferIpAddress();
@@ -144,6 +166,12 @@ public class TestMicroserviceInstanceRegisterTask {
   @Test
   public void registerIpFailed() {
     MicroserviceInstance instance = microservice.getInstance();
+    new Expectations(RegistrationManager.class) {
+      {
+        RegistrationManager.getPublishAddress();
+        result = "127.0.0.1";
+      }
+    };
     new Expectations(RegistryUtils.class) {
       {
         serviceRegistryConfig.isPreferIpAddress();
diff --git a/transports/transport-rest/transport-rest-servlet/pom.xml b/transports/transport-rest/transport-rest-servlet/pom.xml
index f034fab..066675c 100644
--- a/transports/transport-rest/transport-rest-servlet/pom.xml
+++ b/transports/transport-rest/transport-rest-servlet/pom.xml
@@ -41,7 +41,11 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>transport-rest-client</artifactId>
     </dependency>
-
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
diff --git a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletRestTransport.java b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletRestTransport.java
index 1af687e..da3e949 100644
--- a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletRestTransport.java
+++ b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletRestTransport.java
@@ -21,8 +21,8 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.servicecomb.core.Invocation;
-import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.transport.AbstractTransport;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.apache.servicecomb.transport.rest.client.RestTransportClient;
@@ -59,7 +59,7 @@ public class ServletRestTransport extends AbstractTransport {
 
   @Override
   public boolean init() {
-    String urlPrefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
+    String urlPrefix = ClassLoaderScopeContext.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     Map<String, String> queryMap = new HashMap<>();
     if (!StringUtils.isEmpty(urlPrefix)) {
       queryMap.put(DefinitionConst.URL_PREFIX, urlPrefix);
diff --git a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java
index c4418d9..d6479c8 100644
--- a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java
+++ b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java
@@ -29,10 +29,10 @@ import javax.servlet.ServletRegistration;
 import javax.servlet.ServletRegistration.Dynamic;
 
 import org.apache.servicecomb.common.rest.UploadConfig;
-import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.foundation.common.net.NetUtils;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -133,7 +133,7 @@ public class ServletUtils {
       return;
     }
 
-    SCBEngine.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, urlPrefix);
+    ClassLoaderScopeContext.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, urlPrefix);
     LOGGER.info("UrlPrefix of this instance is \"{}\".", urlPrefix);
   }
 
diff --git a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestRestServlet.java b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestRestServlet.java
index 560fa2f..eb2564c 100644
--- a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestRestServlet.java
+++ b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestRestServlet.java
@@ -40,7 +40,7 @@ public class TestRestServlet {
   public void setUp() {
     restservlet = new RestServlet();
 
-    new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+    SCBBootstrap.createSCBEngineForTest();
   }
 
   @After
diff --git a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestDispatcher.java b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestDispatcher.java
index 6b2c766..7198365 100644
--- a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestDispatcher.java
+++ b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestDispatcher.java
@@ -53,7 +53,7 @@ public class TestServletRestDispatcher {
 
   @Before
   public void setup() {
-    new SCBBootstrap().useLocalRegistry().createSCBEngineForTest().setTransportManager(transportManager);
+    SCBBootstrap.createSCBEngineForTest().setTransportManager(transportManager);
   }
 
   @After
diff --git a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestTransport.java b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestTransport.java
index 95872ca..0fdf0d3 100644
--- a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestTransport.java
+++ b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestTransport.java
@@ -20,7 +20,7 @@ package org.apache.servicecomb.transport.rest.servlet;
 import java.io.IOException;
 import java.net.ServerSocket;
 
-import org.apache.servicecomb.core.SCBEngine;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.transport.rest.client.RestTransportClient;
 import org.apache.servicecomb.transport.rest.client.RestTransportClientManager;
@@ -38,7 +38,7 @@ public class TestServletRestTransport {
 
   @After
   public void tearDown() {
-    SCBEngine.clearClassLoaderScopeProperty();
+    ClassLoaderScopeContext.clearClassLoaderScopeProperty();
   }
 
   @Test
@@ -95,10 +95,10 @@ public class TestServletRestTransport {
         result = "1.1.1.1:1234";
       }
     };
-    SCBEngine.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, "/root");
+    ClassLoaderScopeContext.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, "/root");
 
     Assert.assertTrue(transport.init());
-    Assert.assertEquals("rest://1.1.1.1:1234?urlPrefix=/root", transport.getPublishEndpoint().getEndpoint());
+    Assert.assertEquals("rest://1.1.1.1:1234?urlPrefix=%2Froot", transport.getPublishEndpoint().getEndpoint());
   }
 
   @Test
diff --git a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java
index d36f16b..3a6abc0 100644
--- a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java
+++ b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java
@@ -36,8 +36,8 @@ import javax.servlet.ServletRegistration.Dynamic;
 import javax.servlet.http.HttpServlet;
 
 import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
+import org.apache.servicecomb.foundation.common.utils.ClassLoaderScopeContext;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.hamcrest.Matchers;
@@ -175,18 +175,18 @@ public class TestServletUtils {
 
   @Test
   public void testSaveUrlPrefixNull(@Mocked ServletContext servletContext) {
-    SCBEngine.clearClassLoaderScopeProperty();
+    ClassLoaderScopeContext.clearClassLoaderScopeProperty();
 
     ServletUtils.saveUrlPrefix(servletContext);
 
-    Assert.assertNull(SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX));
-    SCBEngine.clearClassLoaderScopeProperty();
+    Assert.assertNull(ClassLoaderScopeContext.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX));
+    ClassLoaderScopeContext.clearClassLoaderScopeProperty();
   }
 
   @Test
   public void testSaveUrlPrefixNormal(@Mocked ServletContext servletContext,
       @Mocked ServletRegistration servletRegistration) {
-    SCBEngine.clearClassLoaderScopeProperty();
+    ClassLoaderScopeContext.clearClassLoaderScopeProperty();
     new Expectations() {
       {
         servletContext.getContextPath();
@@ -202,8 +202,9 @@ public class TestServletUtils {
 
     ServletUtils.saveUrlPrefix(servletContext);
 
-    Assert.assertThat(SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX), Matchers.is("/root/rest"));
-    SCBEngine.clearClassLoaderScopeProperty();
+    Assert.assertThat(ClassLoaderScopeContext.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX),
+        Matchers.is("/root/rest"));
+    ClassLoaderScopeContext.clearClassLoaderScopeProperty();
   }
 
   @Test
diff --git a/transports/transport-rest/transport-rest-vertx/pom.xml b/transports/transport-rest/transport-rest-vertx/pom.xml
index e2da906..cf82359 100644
--- a/transports/transport-rest/transport-rest-vertx/pom.xml
+++ b/transports/transport-rest/transport-rest-vertx/pom.xml
@@ -37,7 +37,11 @@
       <artifactId>vertx-codegen</artifactId>
       <scope>provided</scope>
     </dependency>
-    
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestRestServerVerticle.java b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestRestServerVerticle.java
index 6f758b4..ee24cf6 100644
--- a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestRestServerVerticle.java
+++ b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestRestServerVerticle.java
@@ -66,7 +66,7 @@ public class TestRestServerVerticle {
     instance = new RestServerVerticle();
     startFuture = Future.future();
 
-    new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
+    SCBBootstrap.createSCBEngineForTest();
   }
 
   @After
diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestVertxRestDispatcher.java b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestVertxRestDispatcher.java
index 1bd00f1..3b9ac5c 100644
--- a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestVertxRestDispatcher.java
+++ b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestVertxRestDispatcher.java
@@ -95,7 +95,7 @@ public class TestVertxRestDispatcher {
       }
     };
 
-    new SCBBootstrap().useLocalRegistry().createSCBEngineForTest().setTransportManager(transportManager);
+    SCBBootstrap.createSCBEngineForTest().setTransportManager(transportManager);
   }
 
   @After


[servicecomb-java-chassis] 05/09: [SCB-1876] part-5: add registration and discovery implementation

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 80bece2682b98f55b20c4ec06b0b727b1ddb746f
Author: liubao <bi...@qq.com>
AuthorDate: Tue May 12 14:30:14 2020 +0800

    [SCB-1876] part-5: add registration and discovery implementation
---
 .../servicecomb/core/CseApplicationListener.java   |  4 +
 .../org/apache/servicecomb/core/SCBEngine.java     |  2 +-
 .../core/definition/ServiceRegistryListener.java   | 15 +++-
 .../provider/producer/ProducerBootListener.java    |  3 +-
 .../servicecomb/serviceregistry/Discovery.java     |  2 -
 .../serviceregistry/DiscoveryManager.java          | 16 +++-
 .../servicecomb/serviceregistry/LifeCycle.java     |  2 +
 .../servicecomb/serviceregistry/Registration.java  |  2 +
 .../serviceregistry/RegistrationManager.java       |  5 ++
 .../consumer/MicroserviceVersions.java             |  3 +-
 .../definition/DefinitionConst.java                |  4 +
 .../event/MicroserviceInstanceRegisteredEvent.java |  5 +-
 .../core/TestCseApplicationListener.java           |  6 ++
 .../servicecomb/serviceregistry/RegistryUtils.java | 11 +--
 .../serviceregistry/ServiceCenterDiscovery.java    | 90 ++++++++++++++++++++
 .../serviceregistry/ServiceCenterRegistration.java | 99 ++++++++++++++++++++++
 ...rg.apache.servicecomb.serviceregistry.Discovery | 18 ++++
 ...apache.servicecomb.serviceregistry.Registration | 18 ++++
 .../servicecomb/serviceregistry/TestConsumers.java | 13 +++
 .../serviceregistry/TestRegistryBase.java          | 24 ++----
 .../discovery/TestDiscoveryTree.java               | 22 ++++-
 21 files changed, 318 insertions(+), 46 deletions(-)

diff --git a/core/src/main/java/org/apache/servicecomb/core/CseApplicationListener.java b/core/src/main/java/org/apache/servicecomb/core/CseApplicationListener.java
index 7beb65e..6a3f6c4 100644
--- a/core/src/main/java/org/apache/servicecomb/core/CseApplicationListener.java
+++ b/core/src/main/java/org/apache/servicecomb/core/CseApplicationListener.java
@@ -19,6 +19,8 @@ package org.apache.servicecomb.core;
 
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClients;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
@@ -44,6 +46,8 @@ public class CseApplicationListener
     this.applicationContext = applicationContext;
     BeanUtils.setContext(applicationContext);
     HttpClients.load();
+    RegistrationManager.INSTANCE.init();
+    DiscoveryManager.INSTANCE.init();
   }
 
   public void setInitEventClass(Class<?> initEventClass) {
diff --git a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
index da03752..ff226e0 100644
--- a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
+++ b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
@@ -322,7 +322,7 @@ public class SCBEngine {
       } catch (TimeoutException e) {
         LOGGER.warn("{}", e.getMessage());
       } catch (Throwable e) {
-        LOGGER.error("Failed to start ServiceComb due to errors and close: {}", e.getMessage());
+        LOGGER.error("Failed to start ServiceComb due to errors and close", e);
         try {
           destroy();
         } catch (Exception exception) {
diff --git a/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java b/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java
index ca9dfe5..b6c4c8e 100644
--- a/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java
+++ b/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java
@@ -30,6 +30,7 @@ import org.apache.servicecomb.foundation.common.event.SubscriberOrder;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersion;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.serviceregistry.event.CreateMicroserviceEvent;
 import org.apache.servicecomb.serviceregistry.event.CreateMicroserviceVersionEvent;
 import org.apache.servicecomb.serviceregistry.event.DestroyMicroserviceEvent;
@@ -87,10 +88,16 @@ public class ServiceRegistryListener {
     MicroserviceVersions microserviceVersions = microserviceVersion.getMicroserviceVersions();
     microserviceMeta.setMicroserviceVersionsMeta(getMicroserviceVersionsMeta(microserviceVersions));
 
-    // TODO: service center do not have schema. But this logic expected to work. Deleted old code and comments.
-    for (String schemaId : microservice.getSchemas()) {
-      Swagger swagger = scbEngine.getSwaggerLoader().loadSwagger(microservice, schemaId);
-      microserviceMeta.registerSchemaMeta(schemaId, swagger);
+    boolean isServiceCenter = DefinitionConst.REGISTRY_APP_ID.equals(microservice.getAppId())
+        && DefinitionConst.REGISTRY_SERVICE_NAME.equals(microservice.getServiceName());
+    // do not load service center schemas, because service center did not provide swagger,but can get schema ids....
+    // service center better to resolve the problem.
+    if (!isServiceCenter) {
+      // TODO: get schemas from instance
+      for (String schemaId : microservice.getSchemas()) {
+        Swagger swagger = scbEngine.getSwaggerLoader().loadSwagger(microservice, schemaId);
+        microserviceMeta.registerSchemaMeta(schemaId, swagger);
+      }
     }
 
     microserviceMeta.putExtData(CORE_MICROSERVICE_VERSION, microserviceVersion);
diff --git a/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java b/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java
index 0aac744..e663e5d 100644
--- a/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java
+++ b/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java
@@ -67,11 +67,10 @@ public class ProducerBootListener implements BootListener {
           microserviceMeta.getMicroserviceName(),
           schemaMeta.getSchemaId(),
           content);
-      // TODO: don't forget to implement this in registry
+
       RegistrationManager.INSTANCE.addSchema(schemaMeta.getSchemaId(), content);
     }
 
-    // TODO: don't forget to implement this in registry
     saveBasePaths(microserviceMeta);
   }
 
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
index 4517c51..ed914b7 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
@@ -35,8 +35,6 @@ public interface Discovery extends SPIOrder, LifeCycle {
   MicroserviceInstances findServiceInstances(String appId, String serviceName,
       String versionRule);
 
-  MicroserviceVersions getOrCreateMicroserviceVersions(String appId, String microserviceName);
-
   String getRevision();
 
   void setRevision(String revision);
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
index 3323baa..39a0009 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
@@ -34,21 +34,25 @@ import org.apache.servicecomb.serviceregistry.definition.MicroserviceDefinition;
 public class DiscoveryManager {
   public static DiscoveryManager INSTANCE = new DiscoveryManager();
 
-  private List<Discovery> discoveryList = SPIServiceUtils.getOrLoadSortedService(Discovery.class);
+  private final List<Discovery> discoveryList;
 
-  private final AppManager appManager = new AppManager();
+  private final AppManager appManager;
 
-  private InstanceCacheManager instanceCacheManager = new InstanceCacheManagerNew(appManager);
+  private final InstanceCacheManager instanceCacheManager;
 
   private final MicroserviceDefinition microserviceDefinition;
 
   public DiscoveryManager() {
+    appManager = new AppManager();
+    instanceCacheManager = new InstanceCacheManagerNew(appManager);
+    discoveryList = SPIServiceUtils.getOrLoadSortedService(Discovery.class);
+
     MicroserviceConfigLoader loader = ConfigUtil.getMicroserviceConfigLoader();
     microserviceDefinition = new MicroserviceDefinition(loader.getConfigModels());
   }
 
   public MicroserviceInstances findServiceInstances(String appId, String serviceName,
-      String versionRule, String revision) {
+      String versionRule) {
     MicroserviceInstances result = new MicroserviceInstances();
 
     discoveryList
@@ -114,4 +118,8 @@ public class DiscoveryManager {
   public void run() {
     discoveryList.forEach(discovery -> discovery.run());
   }
+
+  public void init() {
+    discoveryList.forEach(discovery -> discovery.init());
+  }
 }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java
index 70bbccb..2e0b4af 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java
@@ -18,6 +18,8 @@
 package org.apache.servicecomb.serviceregistry;
 
 public interface LifeCycle {
+  void init();
+
   void run();
 
   void destroy();
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
index fa6d4c4..7a17916 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
@@ -26,6 +26,8 @@ import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
 
 public interface Registration extends SPIOrder, LifeCycle {
+  String name();
+  
   MicroserviceInstance getMicroserviceInstance();
 
   Microservice getMicroservice();
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
index 12aefe6..b89add2 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
@@ -94,6 +94,11 @@ public class RegistrationManager {
     registrationList.forEach(registration -> registration.run());
   }
 
+
+  public void init() {
+    registrationList.forEach(discovery -> discovery.init());
+  }
+
   public static String getPublishAddress() {
     String publicAddressSetting =
         DynamicPropertyFactory.getInstance().getStringProperty(PUBLISH_ADDRESS, "").get();
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
index b254838..c314506 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
@@ -179,8 +179,7 @@ public class MicroserviceVersions {
   protected MicroserviceInstances findServiceInstances() {
     return DiscoveryManager.INSTANCE.findServiceInstances(appId,
         microserviceName,
-        DefinitionConst.VERSION_RULE_ALL,
-        revision);
+        DefinitionConst.VERSION_RULE_ALL);
   }
 
   protected void safeSetInstances(List<MicroserviceInstance> pulledInstances, String rev) {
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
index 69a9ded..69c7012 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
@@ -50,4 +50,8 @@ public interface DefinitionConst {
   public static final String REGISTER_URL_PREFIX = "servicecomb.service.registry.registerUrlPrefix";
 
   public static final String REGISTER_SERVICE_PATH = "servicecomb.service.registry.registerPath";
+
+  public static final String REGISTRY_APP_ID = "default";
+
+  public static final String REGISTRY_SERVICE_NAME = "SERVICECENTER";
 }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java
index 8149a76..1526213 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java
@@ -17,6 +17,9 @@
 
 package org.apache.servicecomb.serviceregistry.event;
 
+/**
+ * when registration is ready, should post this event.
+ */
 public class MicroserviceInstanceRegisteredEvent {
-  // TODO: registry need publish this event instead of MicroserviceInstanceRegisterTask
+
 }
diff --git a/core/src/test/java/org/apache/servicecomb/core/TestCseApplicationListener.java b/core/src/test/java/org/apache/servicecomb/core/TestCseApplicationListener.java
index 33b71af..315b199 100644
--- a/core/src/test/java/org/apache/servicecomb/core/TestCseApplicationListener.java
+++ b/core/src/test/java/org/apache/servicecomb/core/TestCseApplicationListener.java
@@ -16,17 +16,23 @@
  */
 package org.apache.servicecomb.core;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.core.CseApplicationListener;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.SCBStatus;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 import org.springframework.context.event.ContextClosedEvent;
 
 import mockit.Mocked;
 
 public class TestCseApplicationListener {
+  @Before
+  public void before() {
+
+  }
   @Test
   public void onApplicationEvent_close(@Mocked ContextClosedEvent contextClosedEvent) {
     SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest();
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
index 9fc917b..2474ee8 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
@@ -40,6 +40,7 @@ import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
 import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
 import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
 import org.apache.servicecomb.serviceregistry.definition.MicroserviceDefinition;
+import org.apache.servicecomb.serviceregistry.event.MicroserviceInstanceRegisteredEvent;
 import org.apache.servicecomb.serviceregistry.registry.ServiceRegistryFactory;
 import org.apache.servicecomb.serviceregistry.registry.cache.AggregateServiceRegistryCache;
 import org.apache.servicecomb.serviceregistry.registry.cache.MicroserviceCache;
@@ -62,10 +63,6 @@ public final class RegistryUtils {
    */
   private static volatile ServiceRegistry serviceRegistry;
 
-
-  private static InstanceCacheManager instanceCacheManager = new InstanceCacheManagerNew(
-      DiscoveryManager.INSTANCE.getAppManager());
-
   private static final Map<String, ServiceRegistryConfig> EXTRA_SERVICE_REGISTRY_CONFIGS = new LinkedHashMap<>();
 
   private static final Map<String, ServiceRegistry> EXTRA_SERVICE_REGISTRIES = new LinkedHashMap<>();
@@ -141,10 +138,6 @@ public final class RegistryUtils {
     return serviceRegistry.getServiceRegistryClient();
   }
 
-  public static InstanceCacheManager getInstanceCacheManager() {
-    return instanceCacheManager;
-  }
-
   public static String getAppId() {
     return serviceRegistry.getAppId();
   }
@@ -317,7 +310,7 @@ public final class RegistryUtils {
       if (instanceRegisterCounter.decrementAndGet() > 0) {
         return;
       }
-      EventManager.getEventBus().post(microserviceInstanceRegisterTask);
+      EventManager.getEventBus().post(new MicroserviceInstanceRegisteredEvent());
     }
   }
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterDiscovery.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterDiscovery.java
new file mode 100644
index 0000000..eef2a82
--- /dev/null
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterDiscovery.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.serviceregistry;
+
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
+
+public class ServiceCenterDiscovery implements Discovery {
+  public static final String NAME = "service center discovery";
+
+  private String revision;
+
+  @Override
+  public void init() {
+    // ServiceCenterRegistration has already done it
+  }
+
+  @Override
+  public void run() {
+    // ServiceCenterRegistration has already done it
+  }
+
+  @Override
+  public void destroy() {
+    // ServiceCenterRegistration has already done it
+  }
+
+  @Override
+  public int getOrder() {
+    return 0;
+  }
+
+  @Override
+  public Microservice getMicroservice(String microserviceId) {
+    return RegistryUtils.getMicroservice(microserviceId);
+  }
+
+  @Override
+  public String getSchema(String microserviceId, String schemaId) {
+    ;
+    return RegistryUtils
+        .getAggregatedSchema(microserviceId, schemaId);
+  }
+
+  @Override
+  public MicroserviceInstance findMicroserviceInstance(String serviceId, String instanceId) {
+    return RegistryUtils.getResultFromFirstValidServiceRegistry(
+        sr -> sr.getServiceRegistryClient().findServiceInstance(serviceId, instanceId));
+  }
+
+  @Override
+  public MicroserviceInstances findServiceInstances(String appId, String serviceName, String versionRule) {
+    return RegistryUtils.findServiceInstances(appId,
+        serviceName,
+        DefinitionConst.VERSION_RULE_ALL,
+        revision);
+  }
+
+  @Override
+  public String getRevision() {
+    return revision;
+  }
+
+  @Override
+  public void setRevision(String revision) {
+    this.revision = revision;
+  }
+
+  @Override
+  public String name() {
+    return NAME;
+  }
+}
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterRegistration.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterRegistration.java
new file mode 100644
index 0000000..ec0f69d
--- /dev/null
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceCenterRegistration.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.serviceregistry;
+
+import java.util.Collection;
+
+import org.apache.servicecomb.foundation.common.concurrency.SuppressedRunnableWrapper;
+import org.apache.servicecomb.serviceregistry.api.registry.BasePath;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
+
+public class ServiceCenterRegistration implements Registration {
+  public static final String NAME = "service center registration";
+
+  @Override
+  public void init() {
+    RegistryUtils.init();
+  }
+
+  @Override
+  public void run() {
+    RegistryUtils.run();
+  }
+
+  @Override
+  public void destroy() {
+    RegistryUtils.destroy();
+  }
+
+  @Override
+  public int getOrder() {
+    return 0;
+  }
+
+  @Override
+  public String name() {
+    return NAME;
+  }
+
+  @Override
+  public MicroserviceInstance getMicroserviceInstance() {
+    return RegistryUtils.getMicroserviceInstance();
+  }
+
+  @Override
+  public Microservice getMicroservice() {
+    return RegistryUtils.getMicroservice();
+  }
+
+  @Override
+  public boolean updateMicroserviceInstanceStatus(MicroserviceInstanceStatus status) {
+    RegistryUtils.executeOnEachServiceRegistry(sr -> new SuppressedRunnableWrapper(() -> {
+      MicroserviceInstance selfInstance = sr.getMicroserviceInstance();
+      sr.getServiceRegistryClient().updateMicroserviceInstanceStatus(
+          selfInstance.getServiceId(),
+          selfInstance.getInstanceId(),
+          MicroserviceInstanceStatus.DOWN);
+    }).run());
+    return true;
+  }
+
+  @Override
+  public void addSchema(String schemaId, String content) {
+    RegistryUtils.executeOnEachServiceRegistry(sr -> {
+      sr.getMicroservice().addSchema(schemaId, content);
+    });
+  }
+
+  @Override
+  public void addEndpoint(String endpoint) {
+    RegistryUtils.executeOnEachServiceRegistry(sr -> {
+      Microservice microservice = sr.getMicroservice();
+      microservice.getInstance().getEndpoints().add(endpoint);
+    });
+  }
+
+  @Override
+  public void addBasePath(Collection<BasePath> basePaths) {
+    RegistryUtils.executeOnEachServiceRegistry(sr -> {
+      sr.getMicroservice().getPaths().addAll(basePaths);
+    });
+  }
+}
diff --git a/service-registry/src/main/resources/META-INF/services/org.apache.servicecomb.serviceregistry.Discovery b/service-registry/src/main/resources/META-INF/services/org.apache.servicecomb.serviceregistry.Discovery
new file mode 100644
index 0000000..7d152e0
--- /dev/null
+++ b/service-registry/src/main/resources/META-INF/services/org.apache.servicecomb.serviceregistry.Discovery
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.servicecomb.serviceregistry.ServiceCenterDiscovery
\ No newline at end of file
diff --git a/service-registry/src/main/resources/META-INF/services/org.apache.servicecomb.serviceregistry.Registration b/service-registry/src/main/resources/META-INF/services/org.apache.servicecomb.serviceregistry.Registration
new file mode 100644
index 0000000..b869661
--- /dev/null
+++ b/service-registry/src/main/resources/META-INF/services/org.apache.servicecomb.serviceregistry.Registration
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.servicecomb.serviceregistry.ServiceCenterRegistration
\ No newline at end of file
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestConsumers.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestConsumers.java
index 0aead31..ec0f8d4 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestConsumers.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestConsumers.java
@@ -19,6 +19,8 @@ package org.apache.servicecomb.serviceregistry;
 
 import java.util.Arrays;
 
+import org.apache.servicecomb.config.ConfigUtil;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector;
 import org.apache.servicecomb.serviceregistry.api.MicroserviceKey;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
@@ -28,12 +30,23 @@ import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersionRule;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
 import org.apache.servicecomb.serviceregistry.task.event.RecoveryEvent;
 import org.hamcrest.Matchers;
+import org.junit.After;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
 import mockit.Expectations;
 
 public class TestConsumers extends TestRegistryBase {
+  @Before
+  public void before() {
+
+  }
+
+  @After
+  public void tearDown() {
+  }
+
   @Test
   public void getOrCreateMicroserviceVersionRule() {
     MicroserviceVersionRule microserviceVersionRule = appManager
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java
index 31535af..0cfeda5 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java
@@ -18,24 +18,21 @@ package org.apache.servicecomb.serviceregistry;
 
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
 import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceManager;
 import org.apache.servicecomb.serviceregistry.registry.ServiceRegistryFactory;
-import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 
 import com.google.common.eventbus.EventBus;
 
-import mockit.Deencapsulation;
 import mockit.Mock;
 import mockit.MockUp;
 
 public class TestRegistryBase {
-  private AppManager originalAppManager = DiscoveryManager.INSTANCE.getAppManager();
-
   protected ServiceRegistry serviceRegistry;
 
   protected AppManager appManager;
@@ -62,16 +59,14 @@ public class TestRegistryBase {
 
   @Before
   public void setup() {
+    ConfigUtil.installDynamicConfig();
+
     // avoid write too many logs
     Logger.getRootLogger().setLevel(Level.OFF);
 
-    ArchaiusUtils.resetConfig();
-
     serviceRegistry = ServiceRegistryFactory.createLocal("registry.yaml");
     serviceRegistry.init();
 
-    Deencapsulation.setField(RegistryUtils.class, "appManager", new AppManager());
-
     appManager = DiscoveryManager.INSTANCE.getAppManager();
     microserviceManager = appManager.getOrCreateMicroserviceManager(appId);
     eventBus = serviceRegistry.getEventBus();
@@ -83,11 +78,6 @@ public class TestRegistryBase {
     Logger.getRootLogger().setLevel(Level.INFO);
   }
 
-  @After
-  public void tearDown() {
-    Deencapsulation.setField(RegistryUtils.class, "appManager", originalAppManager);
-  }
-
   @AfterClass
   public static void classTeardown() {
     RegistryUtils.setServiceRegistry(null);
@@ -97,20 +87,20 @@ public class TestRegistryBase {
   protected void mockNotExist() {
     MicroserviceInstances microserviceInstances = new MicroserviceInstances();
     microserviceInstances.setMicroserviceNotExist(true);
-    new MockUp<RegistryUtils>() {
+    new MockUp<DiscoveryManager>() {
       @Mock
       MicroserviceInstances findServiceInstances(String appId, String serviceName,
-          String versionRule, String revision) {
+          String versionRule) {
         return microserviceInstances;
       }
     };
   }
 
   protected void mockDisconnect() {
-    new MockUp<RegistryUtils>() {
+    new MockUp<DiscoveryManager>() {
       @Mock
       MicroserviceInstances findServiceInstances(String appId, String serviceName,
-          String versionRule, String revision) {
+          String versionRule) {
         return null;
       }
     };
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/discovery/TestDiscoveryTree.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/discovery/TestDiscoveryTree.java
index 0940270..a6523bb 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/discovery/TestDiscoveryTree.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/discovery/TestDiscoveryTree.java
@@ -20,13 +20,18 @@ package org.apache.servicecomb.serviceregistry.discovery;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.foundation.common.cache.VersionedCache;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager;
 import org.hamcrest.Matchers;
+import org.junit.After;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -36,6 +41,15 @@ import mockit.Expectations;
 import mockit.Mocked;
 
 public class TestDiscoveryTree {
+  @Before
+  public void before() {
+    ConfigUtil.installDynamicConfig();
+  }
+  @After
+  public void tearDown() {
+    ArchaiusUtils.resetConfig();
+  }
+
   DiscoveryTree discoveryTree = new DiscoveryTree();
 
   List<DiscoveryFilter> filters = Deencapsulation.getField(discoveryTree, "filters");
@@ -167,9 +181,9 @@ public class TestDiscoveryTree {
 
   @Test
   public void easyDiscovery(@Mocked InstanceCacheManager instanceCacheManager) {
-    new Expectations(RegistryUtils.class) {
+    new Expectations(DiscoveryManager.class) {
       {
-        RegistryUtils.getInstanceCacheManager();
+        DiscoveryManager.INSTANCE.getInstanceCacheManager();
         result = instanceCacheManager;
         instanceCacheManager.getOrCreateVersionedCache(anyString, anyString, anyString);
         result = parent;
@@ -183,9 +197,9 @@ public class TestDiscoveryTree {
 
   @Test
   public void discovery_filterReturnNull(@Mocked InstanceCacheManager instanceCacheManager) {
-    new Expectations(RegistryUtils.class) {
+    new Expectations(DiscoveryManager.class) {
       {
-        RegistryUtils.getInstanceCacheManager();
+        DiscoveryManager.INSTANCE.getInstanceCacheManager();
         result = instanceCacheManager;
         instanceCacheManager.getOrCreateVersionedCache(anyString, anyString, anyString);
         result = parent;


[servicecomb-java-chassis] 04/09: [SCB-1876] part-4: remove unnecessary comments

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit dc9276aea7caa0e71cbc6e742f2ea6f94d70ff4f
Author: liubao <bi...@qq.com>
AuthorDate: Thu May 7 08:31:59 2020 +0800

    [SCB-1876] part-4: remove unnecessary comments
---
 core/src/main/java/org/apache/servicecomb/core/SCBEngine.java | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
index db26af7..da03752 100644
--- a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
+++ b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
@@ -96,9 +96,6 @@ public class SCBEngine {
  *
  * users who using this feature can feed back your problems in issues.
  *
- * NOTICE: this context is better put into module `core`, however now `core` depends on `service-registry`.
- *
- * Maybe it's better to refactor project that `service-registry` depends on `core`.
  */
   private static final Map<String, String> CLASS_LOADER_SCOPE_CONTEXT = new HashMap<>();
 


[servicecomb-java-chassis] 02/09: [SCB-1876] part-2: extract interface Registration and Discovery

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 437a63c4e5ff58aa9f64b664ebb6777f37be6e50
Author: liubao <bi...@qq.com>
AuthorDate: Wed Apr 29 12:08:06 2020 +0800

    [SCB-1876] part-2: extract interface Registration and Discovery
---
 core/pom.xml                                       |   4 +
 .../org/apache/servicecomb/core/SCBEngine.java     |  44 +++-----
 .../core/endpoint/AbstractEndpointsCache.java      | 119 ---------------------
 .../consumer/MicroserviceReferenceConfig.java      |   4 +-
 .../provider/producer/ProducerBootListener.java    |  27 +++--
 .../provider/producer/ProducerProviderManager.java |   9 +-
 .../FindInstancesResponse.java => Discovery.java}  |  26 +++--
 .../serviceregistry/DiscoveryManager.java          |  77 +++++++++++++
 .../servicecomb/serviceregistry/LifeCycle.java     |  10 +-
 ...indInstancesResponse.java => Registration.java} |  27 ++---
 .../serviceregistry/RegistrationManager.java       |  74 +++++++++++++
 .../api/response/FindInstancesResponse.java        |  11 +-
 .../cache/InstanceCacheManager.java                |   0
 .../cache/MicroserviceInstanceCache.java           |   0
 .../client/http/MicroserviceInstances.java         |  39 ++++++-
 .../config/ServiceRegistryCommonConfig.java}       |  22 ++--
 .../consumer/MicroserviceVersions.java             |  12 +--
 .../definition/DefinitionConst.java                |   4 +
 .../definition/MicroserviceDefinition.java         |   0
 .../definition/MicroserviceNameParser.java         |   0
 .../event/MicroserviceInstanceRegisteredEvent.java |  10 +-
 .../serviceregistry/swagger/SwaggerLoader.java     |   0
 .../org/apache/servicecomb/core/TestTransport.java |  47 --------
 .../servicecomb/serviceregistry/RegistryUtils.java |  14 +--
 .../servicecomb/serviceregistry/api/Const.java     |   2 -
 .../config/ServiceRegistryConfig.java              |  11 --
 .../config/ServiceRegistryConfigBuilder.java       |   9 --
 .../cache/RefreshableMicroserviceCache.java        |   4 +-
 28 files changed, 290 insertions(+), 316 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index c1dcef8..326efc9 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -30,6 +30,10 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
+      <artifactId>foundation-vertx</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
       <artifactId>swagger-invocation-core</artifactId>
     </dependency>
     <dependency>
diff --git a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
index 0c13f85..0ba04c8 100644
--- a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
+++ b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
@@ -38,7 +38,6 @@ import org.apache.servicecomb.core.definition.CoreMetaUtils;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.MicroserviceVersionsMeta;
 import org.apache.servicecomb.core.definition.ServiceRegistryListener;
-import org.apache.servicecomb.core.endpoint.AbstractEndpointsCache;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.InvocationStartEvent;
 import org.apache.servicecomb.core.executor.ExecutorManager;
@@ -50,18 +49,18 @@ import org.apache.servicecomb.core.provider.consumer.MicroserviceReferenceConfig
 import org.apache.servicecomb.core.provider.producer.ProducerProviderManager;
 import org.apache.servicecomb.core.transport.TransportManager;
 import org.apache.servicecomb.foundation.common.VendorExtensions;
-import org.apache.servicecomb.foundation.common.concurrency.SuppressedRunnableWrapper;
 import org.apache.servicecomb.foundation.common.event.EnableExceptionPropagation;
 import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.foundation.vertx.VertxUtils;
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClients;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.ServiceRegistry;
-import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
 import org.apache.servicecomb.serviceregistry.definition.MicroserviceNameParser;
+import org.apache.servicecomb.serviceregistry.event.MicroserviceInstanceRegisteredEvent;
 import org.apache.servicecomb.serviceregistry.swagger.SwaggerLoader;
 import org.apache.servicecomb.serviceregistry.task.MicroserviceInstanceRegisterTask;
 import org.apache.servicecomb.swagger.engine.SwaggerEnvironment;
@@ -161,7 +160,7 @@ public class SCBEngine {
   }
 
   public String getAppId() {
-    return RegistryUtils.getAppId();
+    return DiscoveryManager.INSTANCE.getApplicationId();
   }
 
   public void setStatus(SCBStatus status) {
@@ -183,12 +182,8 @@ public class SCBEngine {
     return INSTANCE;
   }
 
-  public ServiceRegistry getServiceRegistry() {
-    return RegistryUtils.getServiceRegistry();
-  }
-
   public SwaggerLoader getSwaggerLoader() {
-    return RegistryUtils.getSwaggerLoader();
+    return RegistrationManager.INSTANCE.getSwaggerLoader();
   }
 
 
@@ -362,8 +357,6 @@ public class SCBEngine {
 
     bootListeners.sort(Comparator.comparingInt(BootListener::getOrder));
 
-    AbstractEndpointsCache.init(RegistryUtils.getInstanceCacheManager(), transportManager);
-
     triggerEvent(EventType.BEFORE_HANDLER);
     HandlerConfigUtils.init(consumerHandlerManager, producerHandlerManager);
     triggerEvent(EventType.AFTER_HANDLER);
@@ -386,14 +379,15 @@ public class SCBEngine {
 
     triggerAfterRegistryEvent();
 
-    RegistryUtils.run();
+    RegistrationManager.INSTANCE.run();
+    DiscoveryManager.INSTANCE.run();
 
     shutdownHook = new Thread(this::destroyForShutdownHook);
     Runtime.getRuntime().addShutdownHook(shutdownHook);
   }
 
   private void createProducerMicroserviceMeta() {
-    String microserviceName = RegistryUtils.getMicroservice().getServiceName();
+    String microserviceName = RegistrationManager.INSTANCE.getMicroservice().getServiceName();
     List<Handler> consumerHandlerChain = consumerHandlerManager.getOrCreate(microserviceName);
     List<Handler> producerHandlerChain = producerHandlerManager.getOrCreate(microserviceName);
 
@@ -437,7 +431,9 @@ public class SCBEngine {
 
     //Step 3: Unregister microservice instance from Service Center and close vertx
     // Forbidden other consumers find me
-    RegistryUtils.destroy();
+    RegistrationManager.INSTANCE.destroy();
+    DiscoveryManager.INSTANCE.destroy();
+
     serviceRegistryListener.destroy();
 
     //Step 4: wait all invocation finished
@@ -452,7 +448,7 @@ public class SCBEngine {
     priorityPropertyManager.close();
 
     //Step 6: Stop vertx to prevent blocking exit
-	// delete the following one line when every refactor is done.
+    // delete the following one line when every refactor is done.
     VertxUtils.blockCloseVertxByName("transport");
 
     HttpClients.destroy();
@@ -462,13 +458,7 @@ public class SCBEngine {
   }
 
   private void turnDownInstanceStatus() {
-    RegistryUtils.executeOnEachServiceRegistry(sr -> new SuppressedRunnableWrapper(() -> {
-      MicroserviceInstance selfInstance = sr.getMicroserviceInstance();
-      sr.getServiceRegistryClient().updateMicroserviceInstanceStatus(
-          selfInstance.getServiceId(),
-          selfInstance.getInstanceId(),
-          MicroserviceInstanceStatus.DOWN);
-    }).run());
+    RegistrationManager.INSTANCE.updateMicroserviceInstanceStatus(MicroserviceInstanceStatus.DOWN);
   }
 
   private void blockShutDownOperationForConsumerRefresh() {
@@ -527,7 +517,7 @@ public class SCBEngine {
    * @return
    */
   public MicroserviceReferenceConfig createMicroserviceReferenceConfig(String microserviceName, String versionRule) {
-    MicroserviceVersions microserviceVersions = RegistryUtils.getAppManager()
+    MicroserviceVersions microserviceVersions = DiscoveryManager.INSTANCE
         .getOrCreateMicroserviceVersions(parseAppId(microserviceName), microserviceName);
     ConsumerMicroserviceVersionsMeta microserviceVersionsMeta = CoreMetaUtils
         .getMicroserviceVersionsMeta(microserviceVersions);
@@ -603,10 +593,10 @@ public class SCBEngine {
 
     @Subscribe
     @EnableExceptionPropagation
-    public void afterRegistryInstance(MicroserviceInstanceRegisterTask microserviceInstanceRegisterTask) {
-      LOGGER.info("receive MicroserviceInstanceRegisterTask event, check instance Id...");
+    public void afterRegistryInstance(MicroserviceInstanceRegisteredEvent microserviceInstanceRegisteredEvent) {
+      LOGGER.info("receive MicroserviceInstanceRegisteredEvent event, check instance Id...");
 
-      if (!StringUtils.isEmpty(RegistryUtils.getMicroserviceInstance().getInstanceId())) {
+      if (!StringUtils.isEmpty(RegistrationManager.INSTANCE.getMicroserviceInstance().getInstanceId())) {
         LOGGER.info("instance registry succeeds for the first time, will send AFTER_REGISTRY event.");
         engine.setStatus(SCBStatus.UP);
         engine.triggerEvent(EventType.AFTER_REGISTRY);
diff --git a/core/src/main/java/org/apache/servicecomb/core/endpoint/AbstractEndpointsCache.java b/core/src/main/java/org/apache/servicecomb/core/endpoint/AbstractEndpointsCache.java
deleted file mode 100644
index 8501013..0000000
--- a/core/src/main/java/org/apache/servicecomb/core/endpoint/AbstractEndpointsCache.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.core.endpoint;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.apache.servicecomb.core.Transport;
-import org.apache.servicecomb.core.transport.TransportManager;
-import org.apache.servicecomb.serviceregistry.cache.CacheEndpoint;
-import org.apache.servicecomb.serviceregistry.cache.InstanceCache;
-import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager;
-import org.springframework.util.StringUtils;
-
-/**
- * registry模块不理解core中的概念
- * 所以要将字符串的各种信息转义一下,方便运行时使用
- */
-public abstract class AbstractEndpointsCache<ENDPOINT> {
-  protected static InstanceCacheManager instanceCacheManager;
-
-  protected static TransportManager transportManager;
-
-  protected List<ENDPOINT> endpoints = new ArrayList<>();
-
-  protected String transportName;
-
-  protected InstanceCache instanceCache = null;
-
-  public static void init(InstanceCacheManager instanceCacheManager, TransportManager transportManager) {
-    AbstractEndpointsCache.instanceCacheManager = instanceCacheManager;
-    AbstractEndpointsCache.transportManager = transportManager;
-  }
-
-  /*
-   * transportName 可能为"",表示走任意健康的地址即可
-   */
-  public AbstractEndpointsCache(String appId, String microserviceName, String microserviceVersionRule,
-      String transportName) {
-    this.transportName = transportName;
-    this.instanceCache = new InstanceCache(appId, microserviceName, microserviceVersionRule, null);
-  }
-
-  public List<ENDPOINT> getLatestEndpoints() {
-    InstanceCache newCache = instanceCacheManager.getOrCreate(instanceCache.getAppId(),
-        instanceCache.getMicroserviceName(),
-        instanceCache.getMicroserviceVersionRule());
-    if (!instanceCache.cacheChanged(newCache)) {
-      return endpoints;
-    }
-
-    // 走到这里,肯定已经是存在"有效"地址了(可能是个空列表,表示没有存活的实例)
-    // 先创建,成功了,再走下面的更新逻辑
-    List<ENDPOINT> tmpEndpoints = createEndpoints(newCache);
-
-    this.instanceCache = newCache;
-    this.endpoints = tmpEndpoints;
-    return endpoints;
-  }
-
-  protected List<ENDPOINT> createEndpoints(InstanceCache newCache) {
-    Map<String, List<CacheEndpoint>> transportMap = getOrCreateTransportMap(newCache);
-
-    return createEndpoints(transportMap);
-  }
-
-  protected List<ENDPOINT> createEndpoints(Map<String, List<CacheEndpoint>> transportMap) {
-    List<ENDPOINT> tmpEndpoints = new ArrayList<>();
-    for (Entry<String, List<CacheEndpoint>> entry : transportMap.entrySet()) {
-      Transport transport = transportManager.findTransport(entry.getKey());
-      if (transport == null) {
-        continue;
-      }
-
-      List<CacheEndpoint> endpointList = entry.getValue();
-      if (endpointList == null) {
-        continue;
-      }
-
-      for (CacheEndpoint cacheEndpoint : endpointList) {
-        ENDPOINT endpoint = createEndpoint(transport, cacheEndpoint);
-        tmpEndpoints.add(endpoint);
-      }
-    }
-    return tmpEndpoints;
-  }
-
-  private Map<String, List<CacheEndpoint>> getOrCreateTransportMap(InstanceCache newCache) {
-    Map<String, List<CacheEndpoint>> allTransportMap = newCache.getOrCreateTransportMap();
-    if (StringUtils.isEmpty(transportName)) {
-      // 未指定transport,将所有transport全取出来
-      return allTransportMap;
-    }
-
-    Map<String, List<CacheEndpoint>> transportMap = new HashMap<>();
-    transportMap.put(transportName, allTransportMap.get(transportName));
-    return transportMap;
-  }
-
-  protected abstract ENDPOINT createEndpoint(Transport transport, CacheEndpoint cacheEndpoint);
-}
diff --git a/core/src/main/java/org/apache/servicecomb/core/provider/consumer/MicroserviceReferenceConfig.java b/core/src/main/java/org/apache/servicecomb/core/provider/consumer/MicroserviceReferenceConfig.java
index feaf882..82af266 100644
--- a/core/src/main/java/org/apache/servicecomb/core/provider/consumer/MicroserviceReferenceConfig.java
+++ b/core/src/main/java/org/apache/servicecomb/core/provider/consumer/MicroserviceReferenceConfig.java
@@ -23,7 +23,7 @@ import org.apache.servicecomb.core.definition.ConsumerMicroserviceVersionsMeta;
 import org.apache.servicecomb.core.definition.CoreMetaUtils;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersion;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersionRule;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
@@ -100,7 +100,7 @@ public class MicroserviceReferenceConfig {
   }
 
   private void mark3rdPartyService(OperationMeta operationMeta, ReferenceConfig referenceConfig) {
-    final MicroserviceVersions microserviceVersions = RegistryUtils.getAppManager()
+    final MicroserviceVersions microserviceVersions = DiscoveryManager.INSTANCE
         .getOrCreateMicroserviceVersions(
             operationMeta.getMicroserviceMeta().getAppId(),
             operationMeta.getMicroserviceName());
diff --git a/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java b/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java
index 542783a..0aac744 100644
--- a/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java
+++ b/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerBootListener.java
@@ -24,15 +24,15 @@ import java.util.concurrent.ExecutorService;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.core.BootListener;
+import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
-import org.apache.servicecomb.deployment.Deployment;
 import org.apache.servicecomb.foundation.common.utils.IOUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.BasePath;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,7 +48,7 @@ public class ProducerBootListener implements BootListener {
   @Override
   public void onAfterTransport(BootEvent event) {
     // register schema to microservice;
-    Microservice microservice = event.getScbEngine().getServiceRegistry().getMicroservice();
+    Microservice microservice = RegistrationManager.INSTANCE.getMicroservice();
 
     String swaggerSchema = "http";
     for (String endpoint : microservice.getInstance().getEndpoints()) {
@@ -67,23 +67,21 @@ public class ProducerBootListener implements BootListener {
           microserviceMeta.getMicroserviceName(),
           schemaMeta.getSchemaId(),
           content);
-      RegistryUtils.executeOnEachServiceRegistry(sr -> {
-        sr.getMicroservice().addSchema(schemaMeta.getSchemaId(), content);
-      });
+      // TODO: don't forget to implement this in registry
+      RegistrationManager.INSTANCE.addSchema(schemaMeta.getSchemaId(), content);
     }
 
-    RegistryUtils.executeOnEachServiceRegistry(sr -> {
-      saveBasePaths(microserviceMeta, sr.getMicroservice());
-    });
+    // TODO: don't forget to implement this in registry
+    saveBasePaths(microserviceMeta);
   }
 
   // just compatible to old 3rd components, servicecomb not use it......
-  private void saveBasePaths(MicroserviceMeta microserviceMeta, Microservice microservice) {
-    if (!DynamicPropertyFactory.getInstance().getBooleanProperty(Const.REGISTER_SERVICE_PATH, false).get()) {
+  private void saveBasePaths(MicroserviceMeta microserviceMeta) {
+    if (!DynamicPropertyFactory.getInstance().getBooleanProperty(DefinitionConst.REGISTER_SERVICE_PATH, false).get()) {
       return;
     }
 
-    String urlPrefix = Deployment.getClassLoaderScopeProperty(Const.URL_PREFIX);
+    String urlPrefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     Map<String, BasePath> basePaths = new LinkedHashMap<>();
     for (SchemaMeta schemaMeta : microserviceMeta.getSchemaMetas().values()) {
       Swagger swagger = schemaMeta.getSwagger();
@@ -98,7 +96,8 @@ public class ProducerBootListener implements BootListener {
         basePaths.put(basePath, basePathObj);
       }
     }
-    microservice.getPaths().addAll(basePaths.values());
+
+    RegistrationManager.INSTANCE.addBasePath(basePaths.values());
   }
 
   // bug: can not close all thread for edge
diff --git a/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerProviderManager.java b/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerProviderManager.java
index d7694d8..56db136 100644
--- a/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerProviderManager.java
+++ b/core/src/main/java/org/apache/servicecomb/core/provider/producer/ProducerProviderManager.java
@@ -30,9 +30,8 @@ import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.core.executor.ExecutorManager;
-import org.apache.servicecomb.deployment.Deployment;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.engine.SwaggerProducer;
 import org.apache.servicecomb.swagger.engine.SwaggerProducerOperation;
 import org.slf4j.Logger;
@@ -117,11 +116,11 @@ public class ProducerProviderManager {
   // This is special requirement by users: When service deployed in tomcat,user want to use RestTemplate to
   // call REST service by the full url. e.g. restTemplate.getForObejct("cse://serviceName/root/prefix/health")
   // By default, user's do not need context prefix, e.g. restTemplate.getForObejct("cse://serviceName/health")
-  private void registerUrlPrefixToSwagger( Swagger swagger) {
-    String urlPrefix = Deployment.getClassLoaderScopeProperty(Const.URL_PREFIX);
+  private void registerUrlPrefixToSwagger(Swagger swagger) {
+    String urlPrefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     if (!StringUtils.isEmpty(urlPrefix) && !swagger.getBasePath().startsWith(urlPrefix)
         && DynamicPropertyFactory.getInstance()
-        .getBooleanProperty(Const.REGISTER_URL_PREFIX, false).get()) {
+        .getBooleanProperty(DefinitionConst.REGISTER_URL_PREFIX, false).get()) {
       LOGGER.info("Add swagger base path prefix for {} with {}", swagger.getBasePath(), urlPrefix);
       swagger.setBasePath(urlPrefix + swagger.getBasePath());
     }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
similarity index 57%
copy from core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
copy to core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
index b4a2e8a..30ea1e9 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
@@ -15,23 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.serviceregistry.api.response;
+package org.apache.servicecomb.serviceregistry;
 
-import java.util.List;
+import org.apache.servicecomb.foundation.common.utils.SPIOrder;
+import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
+import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
 
-import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+public interface Discovery extends SPIOrder, LifeCycle {
+  MicroserviceInstances findServiceInstances(String appId, String serviceName,
+      String versionRule);
 
-/**
- * Created by   on 2016/12/8.
- */
-public class FindInstancesResponse {
-  private List<MicroserviceInstance> instances;
+  MicroserviceVersions getOrCreateMicroserviceVersions(String appId, String microserviceName);
+
+  String getRevision();
 
-  public List<MicroserviceInstance> getInstances() {
-    return instances;
-  }
+  void setRevision(String revision);
 
-  public void setInstances(List<MicroserviceInstance> instances) {
-    this.instances = instances;
-  }
+  String name();
 }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
new file mode 100644
index 0000000..ff2975a
--- /dev/null
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.serviceregistry;
+
+import java.util.List;
+
+import org.apache.servicecomb.config.ConfigUtil;
+import org.apache.servicecomb.config.archaius.sources.MicroserviceConfigLoader;
+import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
+import org.apache.servicecomb.serviceregistry.consumer.AppManager;
+import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
+import org.apache.servicecomb.serviceregistry.definition.MicroserviceDefinition;
+
+public class DiscoveryManager {
+  public static DiscoveryManager INSTANCE = new DiscoveryManager();
+
+  private List<Discovery> discoveryList = SPIServiceUtils.getOrLoadSortedService(Discovery.class);
+
+  private final AppManager appManager = new AppManager();
+
+  private final MicroserviceDefinition microserviceDefinition;
+
+  public DiscoveryManager() {
+    MicroserviceConfigLoader loader = ConfigUtil.getMicroserviceConfigLoader();
+    microserviceDefinition = new MicroserviceDefinition(loader.getConfigModels());
+  }
+
+  public MicroserviceInstances findServiceInstances(String appId, String serviceName,
+      String versionRule, String revision) {
+    MicroserviceInstances result = new MicroserviceInstances();
+
+    discoveryList
+        .forEach(discovery -> {
+          MicroserviceInstances microserviceInstances = discovery.findServiceInstances(appId, serviceName, versionRule);
+          result.mergeMicroserviceInstances(microserviceInstances);
+          discovery.setRevision(microserviceInstances.getRevision());
+        });
+
+    return result;
+  }
+
+  public AppManager getAppManager() {
+    return this.appManager;
+  }
+
+  public MicroserviceVersions getOrCreateMicroserviceVersions(String appId, String microserviceName) {
+    return appManager.getOrCreateMicroserviceVersions(appId, microserviceName);
+  }
+
+  public String getApplicationId() {
+    return microserviceDefinition.getApplicationId();
+  }
+
+  public void destroy() {
+    discoveryList.forEach(discovery -> discovery.destroy());
+  }
+
+  public void run() {
+    discoveryList.forEach(discovery -> discovery.run());
+  }
+}
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java
similarity index 67%
copy from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java
copy to core/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java
index 43a7377..70bbccb 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/LifeCycle.java
@@ -15,12 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.serviceregistry.cache;
+package org.apache.servicecomb.serviceregistry;
 
-import org.apache.servicecomb.foundation.common.cache.VersionedCache;
+public interface LifeCycle {
+  void run();
 
-public interface InstanceCacheManager {
-  InstanceCache getOrCreate(String appId, String microserviceName, String microserviceVersionRule);
-
-  VersionedCache getOrCreateVersionedCache(String appId, String microserviceName, String microserviceVersionRule);
+  void destroy();
 }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
similarity index 56%
copy from core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
copy to core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
index b4a2e8a..1262733 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
@@ -15,23 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.serviceregistry.api.response;
+package org.apache.servicecomb.serviceregistry;
 
-import java.util.List;
+import java.util.Collection;
 
+import org.apache.servicecomb.foundation.common.utils.SPIOrder;
+import org.apache.servicecomb.serviceregistry.api.registry.BasePath;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
 
-/**
- * Created by   on 2016/12/8.
- */
-public class FindInstancesResponse {
-  private List<MicroserviceInstance> instances;
+public interface Registration extends SPIOrder, LifeCycle {
+  MicroserviceInstance getMicroserviceInstance();
+
+  Microservice getMicroservice();
+
+  boolean updateMicroserviceInstanceStatus(MicroserviceInstanceStatus status);
 
-  public List<MicroserviceInstance> getInstances() {
-    return instances;
-  }
+  void addSchema(String schemaId, String content);
 
-  public void setInstances(List<MicroserviceInstance> instances) {
-    this.instances = instances;
-  }
+  void addBasePath(Collection<BasePath> basePaths);
 }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
new file mode 100644
index 0000000..da0bb9e
--- /dev/null
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.serviceregistry;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import org.apache.servicecomb.serviceregistry.api.registry.BasePath;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
+import org.apache.servicecomb.serviceregistry.swagger.SwaggerLoader;
+
+public class RegistrationManager {
+  public static RegistrationManager INSTANCE = new RegistrationManager();
+
+  private List<Registration> registrationList = SPIServiceUtils.getOrLoadSortedService(Registration.class);
+
+  private Registration primary = SPIServiceUtils.getPriorityHighestService(Registration.class);
+
+  private static SwaggerLoader swaggerLoader = new SwaggerLoader();
+
+  public MicroserviceInstance getMicroserviceInstance() {
+    return primary.getMicroserviceInstance();
+  }
+
+  public Microservice getMicroservice() {
+    return primary.getMicroservice();
+  }
+
+  public SwaggerLoader getSwaggerLoader() {
+    return swaggerLoader;
+  }
+
+  public void updateMicroserviceInstanceStatus(
+      MicroserviceInstanceStatus status) {
+    registrationList
+        .forEach(registration -> registration.updateMicroserviceInstanceStatus(status));
+  }
+
+  public void addSchema(String schemaId, String content) {
+    registrationList
+        .forEach(registration -> registration.addSchema(schemaId, content));
+  }
+
+  public void addBasePath(Collection<BasePath> basePaths) {
+    registrationList
+        .forEach(registration -> registration.addBasePath(basePaths));
+  }
+
+  public void destroy() {
+    registrationList.forEach(registration -> registration.destroy());
+  }
+
+  public void run() {
+    registrationList.forEach(registration -> registration.run());
+  }
+}
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
index b4a2e8a..4376967 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/api/response/FindInstancesResponse.java
@@ -21,9 +21,6 @@ import java.util.List;
 
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 
-/**
- * Created by   on 2016/12/8.
- */
 public class FindInstancesResponse {
   private List<MicroserviceInstance> instances;
 
@@ -34,4 +31,12 @@ public class FindInstancesResponse {
   public void setInstances(List<MicroserviceInstance> instances) {
     this.instances = instances;
   }
+
+  public void mergeInstances(List<MicroserviceInstance> instances) {
+    if (this.instances == null) {
+      this.instances = instances;
+    } else {
+      this.instances.addAll(instances);
+    }
+  }
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java
similarity index 100%
copy from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java
copy to core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java
index 8a51e50..218d555 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/client/http/MicroserviceInstances.java
@@ -19,9 +19,6 @@ package org.apache.servicecomb.serviceregistry.client.http;
 
 import org.apache.servicecomb.serviceregistry.api.response.FindInstancesResponse;
 
-/**
- * Created by on 2017/12/28.
- */
 public class MicroserviceInstances {
   private boolean microserviceNotExist;
 
@@ -62,4 +59,40 @@ public class MicroserviceInstances {
   public void setInstancesResponse(FindInstancesResponse instancesResponse) {
     this.instancesResponse = instancesResponse;
   }
+
+  public void mergeMicroserviceInstances(MicroserviceInstances other) {
+    mergeNeedRefresh(other.needRefresh);
+    mergeMicroserviceNotExist(other.microserviceNotExist);
+    mergeRevision(other.revision);
+    mergeInstanceResponse(other.getInstancesResponse());
+    mergeRevision(other.getRevision());
+  }
+
+  private void mergeRevision(String revision) {
+    if (this.revision == null || this.revision.compareTo(revision) < 0) {
+      this.revision = revision;
+    }
+  }
+
+  private void mergeMicroserviceNotExist(boolean microserviceNotExist) {
+    // if one of discovery not exist, all mark not exist
+    if (microserviceNotExist) {
+      this.microserviceNotExist = microserviceNotExist;
+    }
+  }
+
+  private void mergeNeedRefresh(boolean needRefresh) {
+    // if one of discovery need refresh, all need refresh
+    if (needRefresh) {
+      this.needRefresh = needRefresh;
+    }
+  }
+
+  private void mergeInstanceResponse(FindInstancesResponse instancesResponse) {
+    if (this.instancesResponse == null) {
+      this.instancesResponse = instancesResponse;
+    } else {
+      this.instancesResponse.mergeInstances(instancesResponse.getInstances());
+    }
+  }
 }
diff --git a/core/src/main/java/org/apache/servicecomb/core/endpoint/EndpointsCache.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryCommonConfig.java
similarity index 54%
rename from core/src/main/java/org/apache/servicecomb/core/endpoint/EndpointsCache.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryCommonConfig.java
index 9fe5266..12c51a2 100644
--- a/core/src/main/java/org/apache/servicecomb/core/endpoint/EndpointsCache.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryCommonConfig.java
@@ -15,21 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.core.endpoint;
+package org.apache.servicecomb.serviceregistry.config;
 
-import org.apache.servicecomb.core.Endpoint;
-import org.apache.servicecomb.core.Transport;
-import org.apache.servicecomb.serviceregistry.cache.CacheEndpoint;
+import com.netflix.config.DynamicPropertyFactory;
 
-public class EndpointsCache extends AbstractEndpointsCache<Endpoint> {
+public class ServiceRegistryCommonConfig {
+  private static final String REGISTRY_EMPTY_PROTECTION = "servicecomb.service.registry.instance.empty.protection";
 
-  public EndpointsCache(String appId, String microserviceName, String microserviceVersionRule,
-      String transportName) {
-    super(appId, microserviceName, microserviceVersionRule, transportName);
-  }
-
-  @Override
-  protected Endpoint createEndpoint(Transport transport, CacheEndpoint cacheEndpoint) {
-    return new Endpoint(transport, cacheEndpoint.getEndpoint(), cacheEndpoint.getInstance());
+  public static boolean isEmptyInstanceProtectionEnabled() {
+    return
+        DynamicPropertyFactory.getInstance()
+            .getBooleanProperty(REGISTRY_EMPTY_PROTECTION,
+                true).get();
   }
 }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
index dd34169..b254838 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersions.java
@@ -28,12 +28,11 @@ import java.util.Map.Entry;
 import org.apache.servicecomb.foundation.common.VendorExtensions;
 import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.response.MicroserviceInstanceChangedEvent;
 import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
-import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
+import org.apache.servicecomb.serviceregistry.config.ServiceRegistryCommonConfig;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.serviceregistry.definition.MicroserviceNameParser;
 import org.apache.servicecomb.serviceregistry.event.CreateMicroserviceEvent;
@@ -178,7 +177,7 @@ public class MicroserviceVersions {
   }
 
   protected MicroserviceInstances findServiceInstances() {
-    return RegistryUtils.findServiceInstances(appId,
+    return DiscoveryManager.INSTANCE.findServiceInstances(appId,
         microserviceName,
         DefinitionConst.VERSION_RULE_ALL,
         revision);
@@ -250,7 +249,7 @@ public class MicroserviceVersions {
       return mergedInstances;
     }
 
-    if (pulledInstances.isEmpty() && inUseInstances != null && ServiceRegistryConfig.INSTANCE
+    if (pulledInstances.isEmpty() && inUseInstances != null && ServiceRegistryCommonConfig
         .isEmptyInstanceProtectionEnabled()) {
       MicroserviceInstancePing ping = SPIServiceUtils.getPriorityHighestService(MicroserviceInstancePing.class);
       inUseInstances.stream().forEach(instance -> {
@@ -315,7 +314,8 @@ public class MicroserviceVersions {
     return (appId.equals(changedEvent.getKey().getAppId()) &&
         microserviceName.equals(changedEvent.getKey().getServiceName())) ||
         microserviceName.equals(
-            changedEvent.getKey().getAppId() + DefinitionConst.APP_SERVICE_SEPARATOR + changedEvent.getKey().getServiceName());
+            changedEvent.getKey().getAppId() + DefinitionConst.APP_SERVICE_SEPARATOR + changedEvent.getKey()
+                .getServiceName());
   }
 
   public void destroy() {
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
index 53a61aa..9bb145e 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
@@ -44,4 +44,8 @@ public interface DefinitionConst {
   String APP_SERVICE_SEPARATOR = ":";
 
   String URL_PREFIX = "urlPrefix";
+
+  public static final String REGISTER_URL_PREFIX = "servicecomb.service.registry.registerUrlPrefix";
+
+  public static final String REGISTER_SERVICE_PATH = "servicecomb.service.registry.registerPath";
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceDefinition.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceDefinition.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceDefinition.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceDefinition.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java
similarity index 67%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java
index 43a7377..8149a76 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManager.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/event/MicroserviceInstanceRegisteredEvent.java
@@ -15,12 +15,8 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.serviceregistry.cache;
+package org.apache.servicecomb.serviceregistry.event;
 
-import org.apache.servicecomb.foundation.common.cache.VersionedCache;
-
-public interface InstanceCacheManager {
-  InstanceCache getOrCreate(String appId, String microserviceName, String microserviceVersionRule);
-
-  VersionedCache getOrCreateVersionedCache(String appId, String microserviceName, String microserviceVersionRule);
+public class MicroserviceInstanceRegisteredEvent {
+  // TODO: registry need publish this event instead of MicroserviceInstanceRegisterTask
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java
diff --git a/core/src/test/java/org/apache/servicecomb/core/TestTransport.java b/core/src/test/java/org/apache/servicecomb/core/TestTransport.java
index f588df9..7f51cba 100644
--- a/core/src/test/java/org/apache/servicecomb/core/TestTransport.java
+++ b/core/src/test/java/org/apache/servicecomb/core/TestTransport.java
@@ -17,29 +17,13 @@
 
 package org.apache.servicecomb.core;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
-import org.apache.servicecomb.core.endpoint.EndpointsCache;
-import org.apache.servicecomb.core.transport.TransportManager;
-import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
-import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
-import org.apache.servicecomb.serviceregistry.cache.CacheEndpoint;
-import org.apache.servicecomb.serviceregistry.cache.InstanceCache;
-import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import mockit.Expectations;
-import mockit.Injectable;
-import mockit.Mocked;
-
 public class TestTransport {
   @BeforeClass
   public static void classSetup() {
@@ -89,35 +73,4 @@ public class TestTransport {
     Assert.assertEquals("test", oEndpoint.getTransport().getName());
     Assert.assertEquals("rest://127.0.0.1:8080", oEndpoint.getEndpoint());
   }
-
-  @Test
-  public void testAbstractTransport(@Mocked Microservice microservice,
-      @Injectable InstanceCacheManager instanceCacheManager, @Injectable TransportManager transportManager,
-      @Mocked InstanceCache instanceCache, @Injectable MicroserviceInstance instance) {
-    EndpointsCache.init(instanceCacheManager, transportManager);
-    EndpointsCache oEndpointsCache = new EndpointsCache("app", "testname", "test", "rest");
-
-    List<Endpoint> endpoionts = oEndpointsCache.getLatestEndpoints();
-    Assert.assertEquals(endpoionts.size(), 0);
-
-    Map<String, List<CacheEndpoint>> allTransportMap = new HashMap<>();
-    CacheEndpoint cacheEndpoint = new CacheEndpoint("rest://127.0.0.1:9999", instance);
-    List<CacheEndpoint> restEndpoints = new ArrayList<>();
-    restEndpoints.add(cacheEndpoint);
-    allTransportMap.put("rest", restEndpoints);
-
-    new Expectations() {
-      {
-        instanceCacheManager.getOrCreate(anyString, anyString, anyString);
-        result = instanceCache;
-        instanceCache.cacheChanged((InstanceCache) any);
-        result = true;
-        instanceCache.getOrCreateTransportMap();
-        result = allTransportMap;
-      }
-    };
-
-    endpoionts = oEndpointsCache.getLatestEndpoints();
-    Assert.assertEquals(endpoionts.size(), 1);
-  }
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
index 28e881d..9e02945 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
@@ -76,11 +76,7 @@ public final class RegistryUtils {
 
   private static final String PUBLISH_PORT = "servicecomb.{transport_name}.publishPort";
 
-  private static SwaggerLoader swaggerLoader = new SwaggerLoader();
-
-  private static AppManager appManager = new AppManager();
-
-  private static InstanceCacheManager instanceCacheManager = new InstanceCacheManagerNew(appManager);
+  private static InstanceCacheManager instanceCacheManager = new InstanceCacheManagerNew(DiscoveryManager.INSTANCE.getAppManager());
 
   private static final Map<String, ServiceRegistryConfig> EXTRA_SERVICE_REGISTRY_CONFIGS = new LinkedHashMap<>();
 
@@ -160,14 +156,6 @@ public final class RegistryUtils {
     return instanceCacheManager;
   }
 
-  public static SwaggerLoader getSwaggerLoader() {
-    return swaggerLoader;
-  }
-
-  public static AppManager getAppManager() {
-    return appManager;
-  }
-
   public static String getAppId() {
     return serviceRegistry.getAppId();
   }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java
index 606b0b2..697f16a 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java
@@ -193,7 +193,5 @@ public final class Const {
 
   public static final String SERVICECENTER_FRAMEWORK_VERSION = "1.0.0";
 
-  public static final String REGISTER_SERVICE_PATH = "servicecomb.service.registry.registerPath";
 
-  public static final String REGISTER_URL_PREFIX = "servicecomb.service.registry.registerUrlPrefix";
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
index a926b27..407d712 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
@@ -102,8 +102,6 @@ public final class ServiceRegistryConfig {
 
   private int resendHeartBeatTimes;
 
-  private boolean emptyInstanceProtectionEnabled;
-
   private boolean alwaysOverrideSchema;
 
   private boolean preferIpAddress;
@@ -283,15 +281,6 @@ public final class ServiceRegistryConfig {
     return this;
   }
 
-  public boolean isEmptyInstanceProtectionEnabled() {
-    return emptyInstanceProtectionEnabled;
-  }
-
-  public ServiceRegistryConfig setEmptyInstanceProtectionEnabled(boolean emptyInstanceProtectionEnabled) {
-    this.emptyInstanceProtectionEnabled = emptyInstanceProtectionEnabled;
-    return this;
-  }
-
   public boolean isAlwaysOverrideSchema() {
     return alwaysOverrideSchema;
   }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
index f00d356..69a55eb 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
@@ -59,7 +59,6 @@ class ServiceRegistryConfigBuilder {
         .setInstancePullInterval(getInstancePullInterval())
         .setRegistryAutoDiscovery(isRegistryAutoDiscovery())
         .setResendHeartBeatTimes(getResendHeartBeatTimes())
-        .setEmptyInstanceProtectionEnabled(isEmptyInstanceProtectionEnabled())
         .setAlwaysOverrideSchema(isAlwaysOverrideSchema())
         .setPreferIpAddress(isPreferIpAddress())
         .setWatch(isWatch())
@@ -211,14 +210,6 @@ class ServiceRegistryConfigBuilder {
     return times < 0 ? ServiceRegistryConfig.DEFAULT_CHECK_TIMES : times;
   }
 
-  public boolean isEmptyInstanceProtectionEnabled() {
-    DynamicBooleanProperty property =
-        DynamicPropertyFactory.getInstance()
-            .getBooleanProperty("servicecomb.service.registry.instance.empty.protection",
-                true);
-    return property.get();
-  }
-
   public boolean isAlwaysOverrideSchema() {
     DynamicBooleanProperty property =
         DynamicPropertyFactory.getInstance()
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/cache/RefreshableMicroserviceCache.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/cache/RefreshableMicroserviceCache.java
index 9a74cf0..6038dba 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/cache/RefreshableMicroserviceCache.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/cache/RefreshableMicroserviceCache.java
@@ -24,13 +24,13 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.serviceregistry.api.Const;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.response.MicroserviceInstanceChangedEvent;
 import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
 import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceInstancePing;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.serviceregistry.task.event.SafeModeChangeEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -242,7 +242,7 @@ public class RefreshableMicroserviceCache implements MicroserviceCache {
         && ( // microserviceName matched
         key.getServiceName().equals(event.getKey().getServiceName())
             || key.getServiceName().equals(
-            event.getKey().getAppId() + Const.APP_SERVICE_SEPARATOR + event.getKey().getServiceName()
+            event.getKey().getAppId() + DefinitionConst.APP_SERVICE_SEPARATOR + event.getKey().getServiceName()
         ));
   }
 }


[servicecomb-java-chassis] 03/09: [SCB-1876] part-3: fix all reference and compilation errors

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit bdd390fd40be50f13abe704a9a1eef0d47d50e2e
Author: liubao <bi...@qq.com>
AuthorDate: Thu Apr 30 12:00:08 2020 +0800

    [SCB-1876] part-3: fix all reference and compilation errors
---
 .../common/rest/locator/ServicePathManager.java    |   6 +-
 .../common/rest/TestRestProducerInvocation.java    |  10 --
 .../rest/locator/TestServicePathManager.java       |   7 +-
 core/pom.xml                                       |   4 +
 .../servicecomb/core/CseApplicationListener.java   |   5 +-
 .../org/apache/servicecomb/core/SCBEngine.java     |   8 +-
 .../servicecomb/core/bootstrap/SCBBootstrap.java   |  18 +---
 .../core/bootstrap/SCBEngineForTest.java           |   3 +-
 .../core/bootstrap/SpringBootstrap.java            |  27 -----
 .../core/bootup/ServiceInformationCollector.java   |  16 +--
 .../core/definition/ServiceRegistryListener.java   |  15 +--
 .../core/invocation/InvocationFactory.java         |   4 +-
 .../core/transport/AbstractTransport.java          |  41 +------
 .../core/transport/TransportManager.java           |   8 +-
 .../servicecomb/serviceregistry/Discovery.java     |  10 ++
 .../serviceregistry/DiscoveryManager.java          |  40 +++++++
 .../servicecomb/serviceregistry/Registration.java  |   2 +
 .../serviceregistry/RegistrationManager.java       | 120 +++++++++++++++++++++
 .../cache/InstanceCacheManagerNew.java             |   0
 .../cache/MicroserviceInstanceCache.java           |   7 +-
 .../consumer/MicroserviceVersion.java              |   4 +-
 .../consumer/StaticMicroserviceVersions.java       |   6 +-
 .../definition/DefinitionConst.java                |   2 +
 .../definition/MicroserviceNameParser.java         |   4 +-
 .../serviceregistry/discovery/DiscoveryTree.java   |   4 +-
 .../serviceregistry/swagger/SwaggerLoader.java     |  15 +--
 .../resources/META-INF/spring/scb-core-bean.xml    |   2 -
 .../handler/impl/TestSimpleLoadBalanceHandler.java |   9 --
 .../core/transport/TestAbstractTransport.java      |  17 +--
 .../core/transport/TestTransportManager.java       |   4 +-
 .../servicecomb/demo/edge/consumer/Consumer.java   |   9 +-
 .../demo/edge/model/ResultWithInstance.java        |   8 +-
 .../jaxrs/client/MultiErrorCodeServiceClient.java  |   7 +-
 .../integration/PojoReferenceIntegrationTest.java  |   4 +-
 demo/demo-schema/pom.xml                           |   5 +-
 .../servicecomb/demo/CodeFirstRestTemplate.java    |   4 +-
 .../client/CodeFirstRestTemplateSpringmvc.java     |   4 +-
 .../springmvc/client/ConsumerTestsAfterBootup.java |   4 +-
 .../demo/springmvc/client/TestResponse.java        |   6 +-
 .../springmvc/server/ProducerTestsAfterBootup.java |   4 +-
 .../edge/core/CommonHttpEdgeDispatcher.java        |   4 +-
 .../filter/ZoneAwareDiscoveryFilter.java           |   4 +-
 .../loadbalance/TestLoadBalanceHandler2.java       |  49 +--------
 .../loadbalance/TestLoadbalanceHandler.java        |   9 +-
 .../org/apache/servicecomb/AuthHandlerBoot.java    |   6 +-
 .../consumer/RSAConsumerTokenManager.java          |   6 +-
 .../provider/RSAProviderTokenManager.java          |  10 +-
 .../authentication/TestAuthHandlerBoot.java        |  10 --
 .../TestRSAProviderTokenManager.java               |  24 ++---
 .../router/custom/MicroserviceCache.java           |   5 +-
 huawei-cloud/servicestage/pom.xml                  |   4 +
 .../inspector/internal/InspectorBootListener.java  |   4 +-
 .../inspector/internal/InspectorImpl.java          |  11 +-
 .../inspector/internal/TestInspectorImpl.java      |  25 +----
 .../org/apache/servicecomb/it/CommandReceiver.java |   5 +-
 .../java/org/apache/servicecomb/it/ITUtils.java    |   6 +-
 .../servicecomb/it/deploy/MicroserviceDeploy.java  |   7 +-
 .../it/extend/engine/GateRestTemplate.java         |   7 +-
 .../it/extend/engine/ITSCBAsyncRestTemplate.java   |  10 +-
 .../it/extend/engine/ITSCBRestTemplate.java        |   7 +-
 .../servicecomb/it/edge/PreLoadBootListener.java   |   8 +-
 .../it/schema/ReactiveWithIntfSchema.java          |  13 +--
 .../demo/jaxrs/tests/JaxrsIntegrationTestBase.java |   5 -
 .../demo/jaxrs/tests/RawJaxrsIntegrationTest.java  |   5 +-
 integration-tests/pom.xml                          |   5 +-
 .../servicecomb/tests/tracing/TracingTestBase.java |   4 +-
 .../metrics/core/TestMetricsBootListener.java      |   4 +-
 .../metrics/prometheus/PrometheusPublisher.java    |   4 +-
 .../prometheus/TestPrometheusPublisher.java        |   8 --
 .../async/CseAsyncClientHttpRequestTest.java       |   5 -
 .../servicecomb/serviceregistry/Features.java      |  30 ------
 .../servicecomb/serviceregistry/RegistryUtils.java | 117 +-------------------
 .../serviceregistry/ServiceRegistry.java           |   2 -
 .../servicecomb/serviceregistry/api/Const.java     |   2 -
 .../diagnosis/instance/InstanceCacheCheckTask.java |  12 +--
 .../registry/AbstractServiceRegistry.java          |  20 ++--
 .../task/MicroserviceInstanceRegisterTask.java     |   8 +-
 .../servicecomb/serviceregistry/TestRegistry.java  |  44 ++++----
 .../serviceregistry/TestRegistryBase.java          |   6 +-
 .../config/TestConfigurePropertyUtils.java         |   8 +-
 .../instance/TestInstanceCacheCheckTask.java       |   5 -
 .../instance/TestInstanceCacheCheckerMock.java     |  16 +--
 .../TestInstanceCacheCheckerWithoutMock.java       |   9 +-
 .../registry/EmptyMockServiceRegistry.java         |   6 --
 .../serviceregistry/swagger/TestSwaggerLoader.java |  36 +++----
 .../task/TestMicroserviceInstanceRegisterTask.java |   6 --
 .../transport/highway/TestHighwayCodec.java        |   6 --
 .../rest/client/http/RestClientInvocation.java     |   4 +-
 .../rest/client/http/TestRestClientInvocation.java |  12 +--
 .../rest/servlet/ServletRestTransport.java         |   8 +-
 .../transport/rest/servlet/ServletUtils.java       |   6 +-
 .../rest/servlet/TestServletRestTransport.java     |  23 +---
 .../transport/rest/servlet/TestServletUtils.java   |  16 +--
 93 files changed, 456 insertions(+), 693 deletions(-)

diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java
index 8e941a8..372f83f 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/locator/ServicePathManager.java
@@ -21,11 +21,11 @@ import java.util.Collection;
 
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.common.rest.definition.RestOperationMeta;
+import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
-import org.apache.servicecomb.deployment.Deployment;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.util.StringUtils;
@@ -102,7 +102,7 @@ public class ServicePathManager {
   }
 
   public void buildProducerPaths() {
-    String urlPrefix = Deployment.getClassLoaderScopeProperty(Const.URL_PREFIX);
+    String urlPrefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     if (StringUtils.isEmpty(urlPrefix)) {
       producerPaths = swaggerPaths;
       producerPaths.printPaths();
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestProducerInvocation.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestProducerInvocation.java
index 2e05f05..42108da 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestProducerInvocation.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/TestRestProducerInvocation.java
@@ -27,7 +27,6 @@ import org.apache.servicecomb.common.rest.filter.HttpServerFilter;
 import org.apache.servicecomb.common.rest.locator.OperationLocator;
 import org.apache.servicecomb.common.rest.locator.ServicePathManager;
 import org.apache.servicecomb.common.rest.locator.TestPathSchema;
-import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
@@ -37,7 +36,6 @@ import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.foundation.vertx.http.AbstractHttpServletRequest;
 import org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx;
 import org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.junit.AfterClass;
@@ -155,14 +153,6 @@ public class TestRestProducerInvocation {
     Microservice microservice = new Microservice();
     microservice.setServiceName("ms");
 
-    new Expectations(RegistryUtils.class) {
-      {
-        requestEx.getHeader(Const.TARGET_MICROSERVICE);
-        result = null;
-        RegistryUtils.getMicroservice();
-        result = microservice;
-      }
-    };
     new Expectations(ServicePathManager.class) {
       {
         //just make the method throw Exception
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestServicePathManager.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestServicePathManager.java
index 5ab7559..404abc4 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestServicePathManager.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/locator/TestServicePathManager.java
@@ -19,8 +19,7 @@ package org.apache.servicecomb.common.rest.locator;
 
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
-import org.apache.servicecomb.deployment.Deployment;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Test;
@@ -28,7 +27,7 @@ import org.junit.Test;
 public class TestServicePathManager {
   @After
   public void tearDown() {
-    Deployment.clearClassLoaderScopeProperty();
+    SCBEngine.clearClassLoaderScopeProperty();
   }
 
   @Test
@@ -45,7 +44,7 @@ public class TestServicePathManager {
 
   @Test
   public void testBuildProducerPathsHasPrefix() {
-    Deployment.setClassLoaderScopeProperty(Const.URL_PREFIX, "/root/rest");
+    SCBEngine.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, "/root/rest");
 
     SCBEngine scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
         .addProducerMeta("sid1", new TestPathSchema())
diff --git a/core/pom.xml b/core/pom.xml
index 326efc9..a38fa32 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -30,6 +30,10 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
+      <artifactId>deployment</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
       <artifactId>foundation-vertx</artifactId>
     </dependency>
     <dependency>
diff --git a/core/src/main/java/org/apache/servicecomb/core/CseApplicationListener.java b/core/src/main/java/org/apache/servicecomb/core/CseApplicationListener.java
index b840d8a..7beb65e 100644
--- a/core/src/main/java/org/apache/servicecomb/core/CseApplicationListener.java
+++ b/core/src/main/java/org/apache/servicecomb/core/CseApplicationListener.java
@@ -19,7 +19,6 @@ package org.apache.servicecomb.core;
 
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClients;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
@@ -38,15 +37,13 @@ public class CseApplicationListener
 
   @Override
   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-    if(this.applicationContext == applicationContext) {
+    if (this.applicationContext == applicationContext) {
       // same object. avoid initialize many times.
       return;
     }
     this.applicationContext = applicationContext;
     BeanUtils.setContext(applicationContext);
     HttpClients.load();
-    RegistryUtils.init();
-    SCBEngine.getInstance();
   }
 
   public void setInitEventClass(Class<?> initEventClass) {
diff --git a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
index 0ba04c8..db26af7 100644
--- a/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
+++ b/core/src/main/java/org/apache/servicecomb/core/SCBEngine.java
@@ -56,13 +56,11 @@ import org.apache.servicecomb.foundation.vertx.VertxUtils;
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClients;
 import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.RegistrationManager;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
 import org.apache.servicecomb.serviceregistry.definition.MicroserviceNameParser;
 import org.apache.servicecomb.serviceregistry.event.MicroserviceInstanceRegisteredEvent;
 import org.apache.servicecomb.serviceregistry.swagger.SwaggerLoader;
-import org.apache.servicecomb.serviceregistry.task.MicroserviceInstanceRegisterTask;
 import org.apache.servicecomb.swagger.engine.SwaggerEnvironment;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.slf4j.Logger;
@@ -294,11 +292,11 @@ public class SCBEngine {
 
   /**
    * <p>As the process of instance registry is asynchronous, the {@code AFTER_REGISTRY}
-   * event should not be sent immediately after {@link RegistryUtils#run()} is invoked.
-   * When the instance registry succeeds, {@link MicroserviceInstanceRegisterTask} will be posted in {@link EventManager},
+   * event should not be sent immediately.
+   * When the instance registry succeeds, {@link MicroserviceInstanceRegisteredEvent} will be posted in {@link EventManager},
    * register a subscriber to watch this event and send {@code AFTER_REGISTRY}.</p>
    *
-   * <p>This method should be called before {@link RegistryUtils#run()} to avoid that the registry process is too quick
+   * <p>This method should be called before registry initialization to avoid that the registry process is too quick
    * that the event is not watched by this subscriber.</p>
    *
    * <p>Check if {@code InstanceId} is null to judge whether the instance registry has succeeded.</p>
diff --git a/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBBootstrap.java b/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBBootstrap.java
index 787adae..26b1bfa 100644
--- a/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBBootstrap.java
+++ b/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBBootstrap.java
@@ -17,28 +17,16 @@
 package org.apache.servicecomb.core.bootstrap;
 
 import org.apache.servicecomb.core.SCBEngine;
-import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.ServiceRegistry;
-import org.apache.servicecomb.serviceregistry.client.LocalServiceRegistryClientImpl;
-import org.apache.servicecomb.serviceregistry.registry.ServiceRegistryFactory;
 
 public class SCBBootstrap {
   public SCBBootstrap useLocalRegistry() {
-    return useLocalRegistry(System.getProperty(LocalServiceRegistryClientImpl.LOCAL_REGISTRY_FILE_KEY));
+    // TODO: local registry intialization
+    return this;
   }
 
   public SCBBootstrap useLocalRegistry(String localFile) {
-    return useLocalRegistry(ServiceRegistryFactory.createLocal(localFile));
-  }
-
-  private SCBBootstrap useLocalRegistry(ServiceRegistry serviceRegistry) {
-    serviceRegistry.init();
-    RegistryUtils.setServiceRegistry(serviceRegistry);
-
-    EventManager.eventBus = serviceRegistry.getEventBus();
-
+    // TODO: local registry intialization
     return this;
   }
 
diff --git a/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBEngineForTest.java b/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBEngineForTest.java
index 440b69b..3ccf530 100644
--- a/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBEngineForTest.java
+++ b/core/src/main/java/org/apache/servicecomb/core/bootstrap/SCBEngineForTest.java
@@ -24,7 +24,6 @@ import org.apache.servicecomb.core.executor.GroupExecutor;
 import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.apache.servicecomb.foundation.common.event.SimpleEventBus;
 import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
 
 /**
  * not depend on remote service registry and spring context
@@ -39,7 +38,7 @@ public class SCBEngineForTest extends SCBEngine {
     super.destroy();
 
     ReflectUtils.setField(SCBEngine.class, null, "INSTANCE", null);
-    RegistryUtils.setServiceRegistry(null);
+    
     EventManager.eventBus = new SimpleEventBus();
   }
 }
diff --git a/core/src/main/java/org/apache/servicecomb/core/bootstrap/SpringBootstrap.java b/core/src/main/java/org/apache/servicecomb/core/bootstrap/SpringBootstrap.java
deleted file mode 100644
index ec827f3..0000000
--- a/core/src/main/java/org/apache/servicecomb/core/bootstrap/SpringBootstrap.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.core.bootstrap;
-
-import org.apache.servicecomb.core.SCBEngine;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-
-public class SpringBootstrap {
-  public SpringBootstrap() {
-    RegistryUtils.init();
-    SCBEngine.getInstance();
-  }
-}
diff --git a/core/src/main/java/org/apache/servicecomb/core/bootup/ServiceInformationCollector.java b/core/src/main/java/org/apache/servicecomb/core/bootup/ServiceInformationCollector.java
index 78e05b7..a9b19e5 100644
--- a/core/src/main/java/org/apache/servicecomb/core/bootup/ServiceInformationCollector.java
+++ b/core/src/main/java/org/apache/servicecomb/core/bootup/ServiceInformationCollector.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.core.bootup;
 
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 
 import io.vertx.core.spi.json.JsonCodec;
 
@@ -25,17 +25,17 @@ public class ServiceInformationCollector implements BootUpInformationCollector {
 
   @Override
   public String collect() {
-    return "App ID: " + RegistryUtils.getMicroservice().getAppId()
-        + "\n" + "Service Name: " + RegistryUtils.getMicroservice().getServiceName()
-        + "\n" + "Version: " + RegistryUtils.getMicroservice().getVersion()
-        + "\n" + "Environment: " + RegistryUtils.getMicroservice().getEnvironment()
-        + "\n" + "Service ID: " + RegistryUtils.getMicroserviceInstance().getServiceId()
-        + "\n" + "Instance ID: " + RegistryUtils.getMicroserviceInstance().getInstanceId()
+    return "App ID: " + RegistrationManager.INSTANCE.getMicroservice().getAppId()
+        + "\n" + "Service Name: " + RegistrationManager.INSTANCE.getMicroservice().getServiceName()
+        + "\n" + "Version: " + RegistrationManager.INSTANCE.getMicroservice().getVersion()
+        + "\n" + "Environment: " + RegistrationManager.INSTANCE.getMicroservice().getEnvironment()
+        + "\n" + "Service ID: " + RegistrationManager.INSTANCE.getMicroserviceInstance().getServiceId()
+        + "\n" + "Instance ID: " + RegistrationManager.INSTANCE.getMicroserviceInstance().getInstanceId()
         + "\n" + "Endpoints: " + getEndpoints();
   }
 
   private String getEndpoints() {
-    return JsonCodec.INSTANCE.toString(RegistryUtils.getMicroserviceInstance().getEndpoints());
+    return JsonCodec.INSTANCE.toString(RegistrationManager.INSTANCE.getMicroserviceInstance().getEndpoints());
   }
 
   @Override
diff --git a/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java b/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java
index 8d9f79a..ca9dfe5 100644
--- a/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java
+++ b/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java
@@ -27,7 +27,6 @@ import org.apache.servicecomb.core.Handler;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.foundation.common.event.EnableExceptionPropagation;
 import org.apache.servicecomb.foundation.common.event.SubscriberOrder;
-import org.apache.servicecomb.serviceregistry.api.Const;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersion;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
@@ -88,16 +87,10 @@ public class ServiceRegistryListener {
     MicroserviceVersions microserviceVersions = microserviceVersion.getMicroserviceVersions();
     microserviceMeta.setMicroserviceVersionsMeta(getMicroserviceVersionsMeta(microserviceVersions));
 
-    boolean isServiceCenter = Const.REGISTRY_APP_ID.equals(microservice.getAppId())
-        && Const.REGISTRY_SERVICE_NAME.equals(microservice.getServiceName());
-    // do not load service center schemas, because service center did not provide swagger......
-    // service center better to resolve the problem.
-    if (!isServiceCenter) {
-      // TODO: get schemas from instance
-      for (String schemaId : microservice.getSchemas()) {
-        Swagger swagger = scbEngine.getSwaggerLoader().loadSwagger(microservice, schemaId);
-        microserviceMeta.registerSchemaMeta(schemaId, swagger);
-      }
+    // TODO: service center do not have schema. But this logic expected to work. Deleted old code and comments.
+    for (String schemaId : microservice.getSchemas()) {
+      Swagger swagger = scbEngine.getSwaggerLoader().loadSwagger(microservice, schemaId);
+      microserviceMeta.registerSchemaMeta(schemaId, swagger);
     }
 
     microserviceMeta.putExtData(CORE_MICROSERVICE_VERSION, microserviceVersion);
diff --git a/core/src/main/java/org/apache/servicecomb/core/invocation/InvocationFactory.java b/core/src/main/java/org/apache/servicecomb/core/invocation/InvocationFactory.java
index 6973dc5..0eab6ac 100644
--- a/core/src/main/java/org/apache/servicecomb/core/invocation/InvocationFactory.java
+++ b/core/src/main/java/org/apache/servicecomb/core/invocation/InvocationFactory.java
@@ -26,14 +26,14 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.definition.InvocationRuntimeType;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.provider.consumer.ReferenceConfig;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 
 public final class InvocationFactory {
   private InvocationFactory() {
   }
 
   private static String getMicroserviceName() {
-    return RegistryUtils.getMicroservice().getServiceName();
+    return RegistrationManager.INSTANCE.getMicroservice().getServiceName();
   }
 
   public static Invocation forConsumer(ReferenceConfig referenceConfig, OperationMeta operationMeta,
diff --git a/core/src/main/java/org/apache/servicecomb/core/transport/AbstractTransport.java b/core/src/main/java/org/apache/servicecomb/core/transport/AbstractTransport.java
index 0a215a0..7ee6bbb 100644
--- a/core/src/main/java/org/apache/servicecomb/core/transport/AbstractTransport.java
+++ b/core/src/main/java/org/apache/servicecomb/core/transport/AbstractTransport.java
@@ -17,24 +17,18 @@
 
 package org.apache.servicecomb.core.transport;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLDecoder;
 import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import java.util.stream.Collectors;
 
 import org.apache.http.client.utils.URLEncodedUtils;
 import org.apache.http.message.BasicNameValuePair;
-import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.Transport;
-import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.net.NetUtils;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
 import org.apache.servicecomb.foundation.vertx.SharedVertxFactory;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -78,7 +72,7 @@ public abstract class AbstractTransport implements Transport {
 
     this.endpoint = new Endpoint(this, NetUtils.getRealListenAddress(getName(), addressWithoutSchema));
     if (this.endpoint.getEndpoint() != null) {
-      this.publishEndpoint = new Endpoint(this, RegistryUtils.getPublishAddress(getName(),
+      this.publishEndpoint = new Endpoint(this, RegistrationManager.getPublishAddress(getName(),
           addressWithoutSchema));
     } else {
       this.publishEndpoint = null;
@@ -101,37 +95,8 @@ public abstract class AbstractTransport implements Transport {
       return new BasicNameValuePair(entry.getKey(), entry.getValue());
     }).collect(Collectors.toList()), StandardCharsets.UTF_8.name());
 
-    if (!RegistryUtils.getServiceRegistry().getFeatures().isCanEncodeEndpoint()) {
-      addressWithoutSchema = genAddressWithoutSchemaForOldSC(addressWithoutSchema, encodedQuery);
-    } else {
-      addressWithoutSchema += encodedQuery;
-    }
-
-    return addressWithoutSchema;
-  }
-
-  private String genAddressWithoutSchemaForOldSC(String addressWithoutSchema, String encodedQuery) {
-    // old service center do not support encodedQuery
-    // sdk must query service center's version, and determine if encode query
-    // traced by JAV-307
-    try {
-      LOGGER.warn("Service center do not support encoded query, so we use unencoded query, "
-          + "this caused not support chinese/space (and maybe other char) in query value.");
-      String decodedQuery = URLDecoder.decode(encodedQuery, StandardCharsets.UTF_8.name());
-      addressWithoutSchema += decodedQuery;
-    } catch (UnsupportedEncodingException e) {
-      // never happened
-      throw new ServiceCombException("Failed to decode query.", e);
-    }
+    addressWithoutSchema += encodedQuery;
 
-    try {
-      // make sure consumer can handle this endpoint
-      new URI(Const.RESTFUL + "://" + addressWithoutSchema);
-    } catch (URISyntaxException e) {
-      throw new ServiceCombException(
-          "current service center not support encoded endpoint, please do not use chinese or space or anything need to be encoded.",
-          e);
-    }
     return addressWithoutSchema;
   }
 
diff --git a/core/src/main/java/org/apache/servicecomb/core/transport/TransportManager.java b/core/src/main/java/org/apache/servicecomb/core/transport/TransportManager.java
index a52c93b..53659bd 100644
--- a/core/src/main/java/org/apache/servicecomb/core/transport/TransportManager.java
+++ b/core/src/main/java/org/apache/servicecomb/core/transport/TransportManager.java
@@ -29,8 +29,7 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,10 +60,7 @@ public class TransportManager {
         Endpoint endpoint = transport.getPublishEndpoint();
         if (endpoint != null && endpoint.getEndpoint() != null) {
           LOGGER.info("endpoint to publish: {}", endpoint.getEndpoint());
-          RegistryUtils.executeOnEachServiceRegistry(sr -> {
-            Microservice microservice = sr.getMicroservice();
-            microservice.getInstance().getEndpoints().add(endpoint.getEndpoint());
-          });
+          RegistrationManager.INSTANCE.addEndpoint(endpoint.getEndpoint());
         }
         continue;
       }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
index 30ea1e9..4517c51 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/Discovery.java
@@ -18,10 +18,20 @@
 package org.apache.servicecomb.serviceregistry;
 
 import org.apache.servicecomb.foundation.common.utils.SPIOrder;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
 
 public interface Discovery extends SPIOrder, LifeCycle {
+  // TODO: microservice id may be different in Discovery, maybe better to use appId, serviceName and version.
+  Microservice getMicroservice(String microserviceId);
+
+  // TODO: microservice id may be different in Discovery, maybe better to use appId, serviceName and version.
+  String getSchema(String microserviceId, String schemaId);
+
+  MicroserviceInstance findMicroserviceInstance(String serviceId, String instanceId);
+
   MicroserviceInstances findServiceInstances(String appId, String serviceName,
       String versionRule);
 
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
index ff2975a..3323baa 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/DiscoveryManager.java
@@ -22,6 +22,10 @@ import java.util.List;
 import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.config.archaius.sources.MicroserviceConfigLoader;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager;
+import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManagerNew;
 import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
 import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersions;
@@ -34,6 +38,8 @@ public class DiscoveryManager {
 
   private final AppManager appManager = new AppManager();
 
+  private InstanceCacheManager instanceCacheManager = new InstanceCacheManagerNew(appManager);
+
   private final MicroserviceDefinition microserviceDefinition;
 
   public DiscoveryManager() {
@@ -55,10 +61,44 @@ public class DiscoveryManager {
     return result;
   }
 
+  public InstanceCacheManager getInstanceCacheManager() {
+    return this.instanceCacheManager;
+  }
+
   public AppManager getAppManager() {
     return this.appManager;
   }
 
+  public MicroserviceInstance findMicroserviceInstance(String serviceId, String instanceId) {
+    for (Discovery discovery : discoveryList) {
+      MicroserviceInstance microserviceInstance = discovery.findMicroserviceInstance(serviceId, instanceId);
+      if (microserviceInstance != null) {
+        return microserviceInstance;
+      }
+    }
+    return null;
+  }
+
+  public String getSchema(String microserviceId, String schemaId) {
+    for (Discovery discovery : discoveryList) {
+      String schema = discovery.getSchema(microserviceId, schemaId);
+      if (schema != null) {
+        return schema;
+      }
+    }
+    return null;
+  }
+
+  public Microservice getMicroservice(String microserviceId) {
+    for (Discovery discovery : discoveryList) {
+      Microservice microservice = discovery.getMicroservice(microserviceId);
+      if (microservice != null) {
+        return microservice;
+      }
+    }
+    return null;
+  }
+
   public MicroserviceVersions getOrCreateMicroserviceVersions(String appId, String microserviceName) {
     return appManager.getOrCreateMicroserviceVersions(appId, microserviceName);
   }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
index 1262733..fa6d4c4 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/Registration.java
@@ -34,5 +34,7 @@ public interface Registration extends SPIOrder, LifeCycle {
 
   void addSchema(String schemaId, String content);
 
+  void addEndpoint(String endpoint);
+
   void addBasePath(Collection<BasePath> basePaths);
 }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
index da0bb9e..12aefe6 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/RegistrationManager.java
@@ -17,17 +17,34 @@
 
 package org.apache.servicecomb.serviceregistry;
 
+import java.net.InetSocketAddress;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.servicecomb.foundation.common.net.IpPort;
+import org.apache.servicecomb.foundation.common.net.NetUtils;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.BasePath;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
 import org.apache.servicecomb.serviceregistry.swagger.SwaggerLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.netflix.config.DynamicPropertyFactory;
 
 public class RegistrationManager {
+  private static final Logger LOGGER = LoggerFactory.getLogger(RegistrationManager.class);
+
+  // value is ip or {interface name}
+  public static final String PUBLISH_ADDRESS = "servicecomb.service.publishAddress";
+
+  private static final String PUBLISH_PORT = "servicecomb.{transport_name}.publishPort";
+
   public static RegistrationManager INSTANCE = new RegistrationManager();
 
   private List<Registration> registrationList = SPIServiceUtils.getOrLoadSortedService(Registration.class);
@@ -59,6 +76,11 @@ public class RegistrationManager {
         .forEach(registration -> registration.addSchema(schemaId, content));
   }
 
+  public void addEndpoint(String endpoint) {
+    registrationList
+        .forEach(registration -> registration.addEndpoint(endpoint));
+  }
+
   public void addBasePath(Collection<BasePath> basePaths) {
     registrationList
         .forEach(registration -> registration.addBasePath(basePaths));
@@ -71,4 +93,102 @@ public class RegistrationManager {
   public void run() {
     registrationList.forEach(registration -> registration.run());
   }
+
+  public static String getPublishAddress() {
+    String publicAddressSetting =
+        DynamicPropertyFactory.getInstance().getStringProperty(PUBLISH_ADDRESS, "").get();
+    publicAddressSetting = publicAddressSetting.trim();
+    if (publicAddressSetting.isEmpty()) {
+      return NetUtils.getHostAddress();
+    }
+
+    // placeholder is network interface name
+    if (publicAddressSetting.startsWith("{") && publicAddressSetting.endsWith("}")) {
+      return NetUtils
+          .ensureGetInterfaceAddress(publicAddressSetting.substring(1, publicAddressSetting.length() - 1))
+          .getHostAddress();
+    }
+
+    return publicAddressSetting;
+  }
+
+  public static String getPublishHostName() {
+    String publicAddressSetting =
+        DynamicPropertyFactory.getInstance().getStringProperty(PUBLISH_ADDRESS, "").get();
+    publicAddressSetting = publicAddressSetting.trim();
+    if (publicAddressSetting.isEmpty()) {
+      return NetUtils.getHostName();
+    }
+
+    if (publicAddressSetting.startsWith("{") && publicAddressSetting.endsWith("}")) {
+      return NetUtils
+          .ensureGetInterfaceAddress(publicAddressSetting.substring(1, publicAddressSetting.length() - 1))
+          .getHostName();
+    }
+
+    return publicAddressSetting;
+  }
+
+  /**
+   * In the case that listening address configured as 0.0.0.0, the publish address will be determined
+   * by the query result for the net interfaces.
+   *
+   * @return the publish address, or {@code null} if the param {@code address} is null.
+   */
+  public static String getPublishAddress(String schema, String address) {
+    if (address == null) {
+      return address;
+    }
+
+    try {
+      URI originalURI = new URI(schema + "://" + address);
+      IpPort ipPort = NetUtils.parseIpPort(originalURI);
+      if (ipPort == null) {
+        LOGGER.warn("address {} not valid.", address);
+        return null;
+      }
+
+      IpPort publishIpPort = genPublishIpPort(schema, ipPort);
+      URIBuilder builder = new URIBuilder(originalURI);
+      return builder.setHost(publishIpPort.getHostOrIp()).setPort(publishIpPort.getPort()).build().toString();
+    } catch (URISyntaxException e) {
+      LOGGER.warn("address {} not valid.", address);
+      return null;
+    }
+  }
+
+  private static IpPort genPublishIpPort(String schema, IpPort ipPort) {
+    String publicAddressSetting = DynamicPropertyFactory.getInstance()
+        .getStringProperty(PUBLISH_ADDRESS, "")
+        .get();
+    publicAddressSetting = publicAddressSetting.trim();
+
+    if (publicAddressSetting.isEmpty()) {
+      InetSocketAddress socketAddress = ipPort.getSocketAddress();
+      if (socketAddress.getAddress().isAnyLocalAddress()) {
+        String host = NetUtils.getHostAddress();
+        LOGGER.warn("address {}, auto select a host address to publish {}:{}, maybe not the correct one",
+            socketAddress,
+            host,
+            socketAddress.getPort());
+        return new IpPort(host, ipPort.getPort());
+      }
+
+      return ipPort;
+    }
+
+    if (publicAddressSetting.startsWith("{") && publicAddressSetting.endsWith("}")) {
+      publicAddressSetting = NetUtils
+          .ensureGetInterfaceAddress(
+              publicAddressSetting.substring(1, publicAddressSetting.length() - 1))
+          .getHostAddress();
+    }
+
+    String publishPortKey = PUBLISH_PORT.replace("{transport_name}", schema);
+    int publishPortSetting = DynamicPropertyFactory.getInstance()
+        .getIntProperty(publishPortKey, 0)
+        .get();
+    int publishPort = publishPortSetting == 0 ? ipPort.getPort() : publishPortSetting;
+    return new IpPort(publicAddressSetting, publishPort);
+  }
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManagerNew.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManagerNew.java
similarity index 100%
rename from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManagerNew.java
rename to core/src/main/java/org/apache/servicecomb/serviceregistry/cache/InstanceCacheManagerNew.java
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java
index 80c8fb5..2a111db 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/cache/MicroserviceInstanceCache.java
@@ -21,7 +21,7 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.slf4j.Logger;
@@ -52,7 +52,7 @@ public class MicroserviceInstanceCache {
   public static Microservice getOrCreate(String serviceId) {
     try {
       return microservices.get(serviceId, () -> {
-        Microservice microservice = RegistryUtils.getAggregatedRemoteMicroservice(serviceId);
+        Microservice microservice = DiscoveryManager.INSTANCE.getMicroservice(serviceId);
         if (microservice == null) {
           throw new IllegalArgumentException("service id not exists.");
         }
@@ -71,8 +71,7 @@ public class MicroserviceInstanceCache {
 
         @Override
         public MicroserviceInstance call() {
-          MicroserviceInstance instance = RegistryUtils.getResultFromFirstValidServiceRegistry(
-              sr -> sr.getServiceRegistryClient().findServiceInstance(serviceId, instanceId));
+          MicroserviceInstance instance = DiscoveryManager.INSTANCE.findMicroserviceInstance(serviceId, instanceId);
           if (instance == null) {
             throw new IllegalArgumentException("instance id not exists.");
           }
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java
index 03ae5fe..ad73283 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/MicroserviceVersion.java
@@ -21,7 +21,7 @@ import java.util.Collection;
 import java.util.List;
 
 import org.apache.servicecomb.foundation.common.VendorExtensions;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.event.CreateMicroserviceVersionEvent;
@@ -48,7 +48,7 @@ public class MicroserviceVersion {
   public MicroserviceVersion(MicroserviceVersions microserviceVersions, String microserviceId,
       String microserviceName,
       Collection<MicroserviceInstance> instances) {
-    Microservice microservice = RegistryUtils.getAggregatedRemoteMicroservice(microserviceId);
+    Microservice microservice = DiscoveryManager.INSTANCE.getMicroservice(microserviceId);
     if (microservice == null) {
       throw new IllegalStateException(
           String.format("failed to query by microserviceId '%s' from ServiceCenter.", microserviceId));
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
index ca34f1c..2525409 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/consumer/StaticMicroserviceVersions.java
@@ -20,7 +20,7 @@ package org.apache.servicecomb.serviceregistry.consumer;
 import java.util.List;
 import java.util.UUID;
 
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.response.FindInstancesResponse;
@@ -49,7 +49,7 @@ public class StaticMicroserviceVersions extends MicroserviceVersions {
   public StaticMicroserviceVersions init(Class<?> schemaIntfCls, String version,
       List<MicroserviceInstance> addedInstances) {
     this.schemaIntfCls = schemaIntfCls;
-    Swagger swagger = RegistryUtils.getSwaggerLoader()
+    Swagger swagger = RegistrationManager.INSTANCE.getSwaggerLoader()
         .registerSwagger(appId, shortName, shortName, schemaIntfCls);
     String swaggerContent = SwaggerUtils.swaggerToString(swagger);
     LOGGER.info("generate swagger for 3rd party service [{}]/[{}], swagger: {}",
@@ -89,7 +89,7 @@ public class StaticMicroserviceVersions extends MicroserviceVersions {
   }
 
   private void createMicroservice(String version) {
-    String environment = RegistryUtils.getMicroservice().getEnvironment();
+    String environment = RegistrationManager.INSTANCE.getMicroservice().getEnvironment();
 
     microservice.setAppId(this.getAppId());
     microservice.setServiceName(this.getShortName());
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
index 9bb145e..69a9ded 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/DefinitionConst.java
@@ -45,6 +45,8 @@ public interface DefinitionConst {
 
   String URL_PREFIX = "urlPrefix";
 
+  public static final String INSTANCE_PUBKEY_PRO = "publickey";
+
   public static final String REGISTER_URL_PREFIX = "servicecomb.service.registry.registerUrlPrefix";
 
   public static final String REGISTER_SERVICE_PATH = "servicecomb.service.registry.registerPath";
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java
index 3ce6393..20d31d4 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/definition/MicroserviceNameParser.java
@@ -16,8 +16,6 @@
  */
 package org.apache.servicecomb.serviceregistry.definition;
 
-import org.apache.servicecomb.serviceregistry.api.Const;
-
 /**
  * <pre>
  *   1. if microserviceName format is app:name, then will ignore defaultAppId
@@ -47,7 +45,7 @@ public class MicroserviceNameParser {
   private void parseMicroserviceName(String defaultAppId, String microserviceName) {
     this.microserviceName = microserviceName;
 
-    int idxAt = microserviceName.indexOf(Const.APP_SERVICE_SEPARATOR);
+    int idxAt = microserviceName.indexOf(DefinitionConst.APP_SERVICE_SEPARATOR);
     if (idxAt == -1) {
       this.appId = defaultAppId;
       this.shortName = microserviceName;
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java
index 3180da7..c5fede8 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/discovery/DiscoveryTree.java
@@ -25,7 +25,7 @@ import java.util.List;
 import org.apache.servicecomb.foundation.common.cache.VersionedCache;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -115,7 +115,7 @@ public class DiscoveryTree {
 
   public DiscoveryTreeNode discovery(DiscoveryContext context, String appId, String microserviceName,
       String versionRule) {
-    VersionedCache instanceVersionedCache = RegistryUtils
+    VersionedCache instanceVersionedCache = DiscoveryManager.INSTANCE
         .getInstanceCacheManager()
         .getOrCreateVersionedCache(appId, microserviceName, versionRule);
 
diff --git a/core/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java b/core/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java
index fb07b7e..dec45f3 100644
--- a/core/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java
+++ b/core/src/main/java/org/apache/servicecomb/serviceregistry/swagger/SwaggerLoader.java
@@ -27,7 +27,8 @@ import org.apache.commons.io.FilenameUtils;
 import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import org.apache.servicecomb.foundation.common.utils.JvmUtils;
 import org.apache.servicecomb.foundation.common.utils.ResourceUtil;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.definition.MicroserviceNameParser;
 import org.apache.servicecomb.swagger.SwaggerUtils;
@@ -64,7 +65,7 @@ public class SwaggerLoader {
    * @param swaggersLocation eg. "test/schemas", will load all test/schemas/*.yaml
    */
   public void registerSwaggersInLocation(String swaggersLocation) {
-    String microserviceName = RegistryUtils.getMicroservice().getServiceName();
+    String microserviceName = RegistrationManager.INSTANCE.getMicroservice().getServiceName();
     registerSwaggersInLocation(microserviceName, swaggersLocation);
   }
 
@@ -90,7 +91,7 @@ public class SwaggerLoader {
   }
 
   public void registerSwagger(String schemaId, Swagger swagger) {
-    registerSwagger(RegistryUtils.getMicroservice().getServiceName(), schemaId, swagger);
+    registerSwagger(RegistrationManager.INSTANCE.getMicroservice().getServiceName(), schemaId, swagger);
   }
 
   public void registerSwagger(String microserviceName, String schemaId, String swaggerContent) {
@@ -105,7 +106,8 @@ public class SwaggerLoader {
   }
 
   public void registerSwagger(String microserviceName, String schemaId, Swagger swagger) {
-    MicroserviceNameParser parser = new MicroserviceNameParser(RegistryUtils.getAppId(), microserviceName);
+    MicroserviceNameParser parser = new MicroserviceNameParser(
+        RegistrationManager.INSTANCE.getMicroservice().getAppId(), microserviceName);
     registerSwagger(parser.getAppId(), parser.getShortName(), schemaId, swagger);
   }
 
@@ -157,7 +159,7 @@ public class SwaggerLoader {
   }
 
   private Swagger loadFromResource(String appId, String shortName, String schemaId) {
-    if (appId.equals(RegistryUtils.getAppId())) {
+    if (appId.equals(RegistrationManager.INSTANCE.getMicroservice().getAppId())) {
       Swagger swagger = loadFromResource(String.format("microservices/%s/%s.yaml", shortName, schemaId));
       if (swagger != null) {
         return swagger;
@@ -178,8 +180,7 @@ public class SwaggerLoader {
   }
 
   private Swagger loadFromRemote(Microservice microservice, String schemaId) {
-    String schemaContent = RegistryUtils
-        .getAggregatedSchema(microservice.getServiceId(), schemaId);
+    String schemaContent = DiscoveryManager.INSTANCE.getSchema(microservice.getServiceId(), schemaId);
     if (schemaContent != null) {
       LOGGER.info(
           "load schema from service center, appId={}, microserviceName={}, version={}, serviceId={}, schemaId={}.",
diff --git a/core/src/main/resources/META-INF/spring/scb-core-bean.xml b/core/src/main/resources/META-INF/spring/scb-core-bean.xml
index 7e7049d..a37acb0 100644
--- a/core/src/main/resources/META-INF/spring/scb-core-bean.xml
+++ b/core/src/main/resources/META-INF/spring/scb-core-bean.xml
@@ -19,6 +19,4 @@
 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
-  <!--  <bean class="org.apache.servicecomb.core.bootstrap.SpringBootstrap"/>-->
-
 </beans>
diff --git a/core/src/test/java/org/apache/servicecomb/core/handler/impl/TestSimpleLoadBalanceHandler.java b/core/src/test/java/org/apache/servicecomb/core/handler/impl/TestSimpleLoadBalanceHandler.java
index 8090977..2f77345 100644
--- a/core/src/test/java/org/apache/servicecomb/core/handler/impl/TestSimpleLoadBalanceHandler.java
+++ b/core/src/test/java/org/apache/servicecomb/core/handler/impl/TestSimpleLoadBalanceHandler.java
@@ -27,7 +27,6 @@ import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
 import org.apache.servicecomb.foundation.common.cache.VersionedCache;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.discovery.DiscoveryFilter;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
@@ -68,14 +67,6 @@ public class TestSimpleLoadBalanceHandler {
       }
     };
 
-    new Expectations(RegistryUtils.getInstanceCacheManager()) {
-      {
-        RegistryUtils.getInstanceCacheManager()
-            .getOrCreateVersionedCache(anyString, anyString, anyString);
-        result = instanceVersionedCache;
-      }
-    };
-
     handler = new SimpleLoadBalanceHandler();
     indexMap = Deencapsulation.getField(handler, "indexMap");
   }
diff --git a/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java b/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java
index 2d3658a..e45705d 100644
--- a/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java
+++ b/core/src/test/java/org/apache/servicecomb/core/transport/TestAbstractTransport.java
@@ -27,8 +27,6 @@ import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.foundation.vertx.VertxUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.registry.AbstractServiceRegistry;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.junit.After;
 import org.junit.AfterClass;
@@ -39,8 +37,6 @@ import org.springframework.util.ReflectionUtils;
 
 import com.netflix.config.DynamicProperty;
 
-import mockit.Expectations;
-import mockit.Injectable;
 import mockit.Mocked;
 
 public class TestAbstractTransport {
@@ -69,17 +65,14 @@ public class TestAbstractTransport {
     }
   }
 
-  @Injectable
-  AbstractServiceRegistry serviceRegistry;
-
   @Before
   public void setup() {
-    RegistryUtils.setServiceRegistry(serviceRegistry);
+
   }
 
   @After
   public void teardown() {
-    RegistryUtils.setServiceRegistry(null);
+
   }
 
   @AfterClass
@@ -89,12 +82,6 @@ public class TestAbstractTransport {
 
   @Test
   public void testSetListenAddressWithoutSchemaChineseSpaceNewSC() throws UnsupportedEncodingException {
-    new Expectations() {
-      {
-        serviceRegistry.getFeatures().isCanEncodeEndpoint();
-        result = true;
-      }
-    };
 
     MyAbstractTransport transport = new MyAbstractTransport();
     transport.setListenAddressWithoutSchema("127.0.0.1:9090", Collections.singletonMap("country", "中 国"));
diff --git a/core/src/test/java/org/apache/servicecomb/core/transport/TestTransportManager.java b/core/src/test/java/org/apache/servicecomb/core/transport/TestTransportManager.java
index 275f5a0..e2250a8 100644
--- a/core/src/test/java/org/apache/servicecomb/core/transport/TestTransportManager.java
+++ b/core/src/test/java/org/apache/servicecomb/core/transport/TestTransportManager.java
@@ -25,7 +25,6 @@ import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.junit.Assert;
 import org.junit.Test;
@@ -59,8 +58,7 @@ public class TestTransportManager {
 
   @Test
   public void testTransportManagerInitSucc(@Mocked SCBEngine scbEngine, @Injectable Transport transport,
-      @Injectable Endpoint endpoint,
-      @Mocked RegistryUtils util, @Injectable MicroserviceInstance instance) throws Exception {
+      @Injectable Endpoint endpoint, @Injectable MicroserviceInstance instance) throws Exception {
     new Expectations() {
       {
         transport.getName();
diff --git a/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/Consumer.java b/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/Consumer.java
index 973e556..862c440 100644
--- a/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/Consumer.java
+++ b/demo/demo-edge/consumer/src/main/java/org/apache/servicecomb/demo/edge/consumer/Consumer.java
@@ -34,7 +34,8 @@ import org.apache.servicecomb.demo.edge.model.RecursiveSelfType;
 import org.apache.servicecomb.demo.edge.model.ResultWithInstance;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
 import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
@@ -169,7 +170,7 @@ public class Consumer {
     Assert.isTrue(response == 5, "not get 5.");
 
     try {
-    Map raw = template.getForObject(url + "?x=99&y=3", Map.class);
+      Map raw = template.getForObject(url + "?x=99&y=3", Map.class);
     } catch (HttpServerErrorException e) {
       Assert.isTrue(e.getRawStatusCode() == 500, "x99");
       Assert.isTrue(e.getResponseBodyAsString().contains("Unexpected exception when processing the request"), "x99");
@@ -267,8 +268,8 @@ public class Consumer {
   }
 
   private URIEndpointObject prepareEdge(String prefix) {
-    Microservice microservice = RegistryUtils.getMicroservice();
-    MicroserviceInstance microserviceInstance = (MicroserviceInstance) RegistryUtils
+    Microservice microservice = RegistrationManager.INSTANCE.getMicroservice();
+    MicroserviceInstance microserviceInstance = (MicroserviceInstance) DiscoveryManager.INSTANCE
         .getAppManager()
         .getOrCreateMicroserviceVersionRule(microservice.getAppId(), "edge", DefinitionConst.VERSION_RULE_ALL)
         .getVersionedCache()
diff --git a/demo/demo-edge/model/src/main/java/org/apache/servicecomb/demo/edge/model/ResultWithInstance.java b/demo/demo-edge/model/src/main/java/org/apache/servicecomb/demo/edge/model/ResultWithInstance.java
index d4ca73c..2bf9f7d 100644
--- a/demo/demo-edge/model/src/main/java/org/apache/servicecomb/demo/edge/model/ResultWithInstance.java
+++ b/demo/demo-edge/model/src/main/java/org/apache/servicecomb/demo/edge/model/ResultWithInstance.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.demo.edge.model;
 
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 
 public class ResultWithInstance {
   private int result;
@@ -31,9 +31,9 @@ public class ResultWithInstance {
   public static ResultWithInstance create(int value) {
     ResultWithInstance result = new ResultWithInstance();
     result.setResult(value);
-    result.setInstanceId(RegistryUtils.getMicroserviceInstance().getInstanceId());
-    result.setServiceId(RegistryUtils.getMicroservice().getServiceId());
-    result.setVersion(RegistryUtils.getMicroservice().getVersion());
+    result.setInstanceId(RegistrationManager.INSTANCE.getMicroserviceInstance().getInstanceId());
+    result.setServiceId(RegistrationManager.INSTANCE.getMicroservice().getServiceId());
+    result.setVersion(RegistrationManager.INSTANCE.getMicroservice().getVersion());
 
     return result;
   }
diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java
index 2ff8d0a..3acf283 100644
--- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java
+++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java
@@ -30,7 +30,8 @@ import org.apache.servicecomb.demo.multiErrorCode.MultiResponse400;
 import org.apache.servicecomb.demo.multiErrorCode.MultiResponse500;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
 import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
@@ -77,8 +78,8 @@ public class MultiErrorCodeServiceClient implements CategorizedTestCase {
   }
 
   private static void prepareServerDirectURL() {
-    Microservice microservice = RegistryUtils.getMicroservice();
-    MicroserviceInstance microserviceInstance = (MicroserviceInstance) RegistryUtils
+    Microservice microservice = RegistrationManager.INSTANCE.getMicroservice();
+    MicroserviceInstance microserviceInstance = (MicroserviceInstance) DiscoveryManager.INSTANCE
         .getAppManager()
         .getOrCreateMicroserviceVersionRule(microservice.getAppId(), "jaxrs", DefinitionConst.VERSION_RULE_ALL)
         .getVersionedCache()
diff --git a/demo/demo-pojo/pojo-tests/src/test/java/org/apache/servicecomb/demo/integration/PojoReferenceIntegrationTest.java b/demo/demo-pojo/pojo-tests/src/test/java/org/apache/servicecomb/demo/integration/PojoReferenceIntegrationTest.java
index 9706e33..9efa4f5 100644
--- a/demo/demo-pojo/pojo-tests/src/test/java/org/apache/servicecomb/demo/integration/PojoReferenceIntegrationTest.java
+++ b/demo/demo-pojo/pojo-tests/src/test/java/org/apache/servicecomb/demo/integration/PojoReferenceIntegrationTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.servicecomb.demo.integration;
 
-import static org.apache.servicecomb.serviceregistry.client.LocalServiceRegistryClientImpl.LOCAL_REGISTRY_FILE_KEY;
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertThat;
 
@@ -32,7 +31,8 @@ public class PojoReferenceIntegrationTest {
 
   @BeforeClass
   public static void setUp() throws Exception {
-    System.setProperty(LOCAL_REGISTRY_FILE_KEY, "notExistJustForceLocal");
+//    System.setProperty(LOCAL_REGISTRY_FILE_KEY, "notExistJustForceLocal");
+    // TODO: add local registry
     SomePojoTestMain.main(new String[0]);
   }
 
diff --git a/demo/demo-schema/pom.xml b/demo/demo-schema/pom.xml
index 41c529c..d034ad5 100644
--- a/demo/demo-schema/pom.xml
+++ b/demo/demo-schema/pom.xml
@@ -70,7 +70,10 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>inspector</artifactId>
     </dependency>
-
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
diff --git a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java
index 9e49f24..d3e61ed 100644
--- a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java
+++ b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java
@@ -30,7 +30,7 @@ import org.apache.servicecomb.demo.jaxbbean.JAXBJob;
 import org.apache.servicecomb.demo.jaxbbean.JAXBPerson;
 import org.apache.servicecomb.demo.server.User;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.swagger.invocation.context.ContextUtils;
 import org.apache.servicecomb.swagger.invocation.context.InvocationContext;
 import org.springframework.http.HttpEntity;
@@ -167,7 +167,7 @@ public class CodeFirstRestTemplate {
 
   private void testCseResponse(String targetMicroserviceName, RestTemplate template,
       String cseUrlPrefix) {
-    String srcMicroserviceName = RegistryUtils.getMicroservice().getServiceName();
+    String srcMicroserviceName = RegistrationManager.INSTANCE.getMicroservice().getServiceName();
 
     ResponseEntity<User> responseEntity =
         template.exchange(cseUrlPrefix + "cseResponse", HttpMethod.GET, null, User.class);
diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java
index 8e88096..0a34963 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/CodeFirstRestTemplateSpringmvc.java
@@ -35,7 +35,7 @@ import org.apache.servicecomb.demo.TestMgr;
 import org.apache.servicecomb.foundation.common.part.FilePart;
 import org.apache.servicecomb.provider.pojo.Invoker;
 import org.apache.servicecomb.provider.springmvc.reference.CseHttpEntity;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.core.io.Resource;
 import org.springframework.http.HttpEntity;
@@ -218,7 +218,7 @@ public class CodeFirstRestTemplateSpringmvc extends CodeFirstRestTemplate {
     CseHttpEntity<Map<String, Object>> httpEntity = new CseHttpEntity<>(body);
     httpEntity.addContext("contextKey", "contextValue");
 
-    String srcName = RegistryUtils.getMicroservice().getServiceName();
+    String srcName = RegistrationManager.INSTANCE.getMicroservice().getServiceName();
 
     ResponseEntity<Date> responseEntity =
         template.exchange(cseUrlPrefix + "responseEntity", HttpMethod.POST, httpEntity, Date.class);
diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/ConsumerTestsAfterBootup.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/ConsumerTestsAfterBootup.java
index d89f20d..3bafa25 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/ConsumerTestsAfterBootup.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/ConsumerTestsAfterBootup.java
@@ -18,7 +18,7 @@ package org.apache.servicecomb.demo.springmvc.client;
 
 import org.apache.servicecomb.core.BootListener;
 import org.apache.servicecomb.demo.TestMgr;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.springframework.stereotype.Component;
 
 /**
@@ -27,7 +27,7 @@ import org.springframework.stereotype.Component;
 @Component
 public class ConsumerTestsAfterBootup implements BootListener {
   public void testRegisterPath() {
-    TestMgr.check(RegistryUtils.getMicroservice().getPaths().size(), 0);
+    TestMgr.check(RegistrationManager.INSTANCE.getMicroservice().getPaths().size(), 0);
   }
 
   @Override
diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestResponse.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestResponse.java
index 07e9c63..039bb2e 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestResponse.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestResponse.java
@@ -23,7 +23,7 @@ import org.apache.servicecomb.demo.TestMgr;
 import org.apache.servicecomb.demo.compute.GenericParam;
 import org.apache.servicecomb.demo.compute.Person;
 import org.apache.servicecomb.provider.pojo.Invoker;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.springframework.http.ResponseEntity;
@@ -60,7 +60,7 @@ public class TestResponse {
   }
 
   private void testCseResponse() {
-    String srcName = RegistryUtils.getMicroservice().getServiceName();
+    String srcName = RegistrationManager.INSTANCE.getMicroservice().getServiceName();
     Response cseResponse = intf.cseResponse();
     TestMgr.check("User [name=nameA, age=100, index=0]", cseResponse.getResult());
     TestMgr.check("h1v " + srcName, cseResponse.getHeaders().getFirst("h1"));
@@ -70,7 +70,7 @@ public class TestResponse {
   private void testResponseEntity() {
     Date date = new Date();
 
-    String srcName = RegistryUtils.getMicroservice().getServiceName();
+    String srcName = RegistrationManager.INSTANCE.getMicroservice().getServiceName();
 
     ResponseEntity<Date> responseEntity = intf.responseEntity(date);
     TestMgr.check(date, responseEntity.getBody());
diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ProducerTestsAfterBootup.java b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ProducerTestsAfterBootup.java
index 562d959..fbdc8b2 100644
--- a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ProducerTestsAfterBootup.java
+++ b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/ProducerTestsAfterBootup.java
@@ -21,7 +21,7 @@ import org.apache.servicecomb.core.BootListener;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.demo.TestMgr;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -89,7 +89,7 @@ public class ProducerTestsAfterBootup implements BootListener {
   }
 
   public void testRegisteredBasePath() {
-    TestMgr.check(14, RegistryUtils.getMicroservice().getPaths().size());
+    TestMgr.check(14, RegistrationManager.INSTANCE.getMicroservice().getPaths().size());
   }
 
   private String getSwaggerContent(Swagger swagger) {
diff --git a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java
index f8daa9a..198af23 100644
--- a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java
+++ b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java
@@ -31,7 +31,7 @@ import org.apache.servicecomb.loadbalance.LoadbalanceHandler;
 import org.apache.servicecomb.loadbalance.RuleExt;
 import org.apache.servicecomb.loadbalance.ServiceCombServer;
 import org.apache.servicecomb.loadbalance.filter.ServerDiscoveryFilter;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.discovery.DiscoveryContext;
 import org.apache.servicecomb.serviceregistry.discovery.DiscoveryTree;
 import org.apache.servicecomb.transport.rest.client.Http2TransportHttpClientOptionsSPI;
@@ -166,7 +166,7 @@ public class CommonHttpEdgeDispatcher extends AbstractEdgeDispatcher {
     DiscoveryContext context = new DiscoveryContext();
     context.setInputParameters(invocation);
     VersionedCache serversVersionedCache = discoveryTree.discovery(context,
-        RegistryUtils.getAppId(),
+        RegistrationManager.INSTANCE.getMicroservice().getAppId(),
         microserviceName,
         versionRule);
     invocation.addLocalContext(LoadbalanceHandler.CONTEXT_KEY_SERVER_LIST, serversVersionedCache.data());
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ZoneAwareDiscoveryFilter.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ZoneAwareDiscoveryFilter.java
index c444467..1441394 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ZoneAwareDiscoveryFilter.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ZoneAwareDiscoveryFilter.java
@@ -21,7 +21,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.discovery.AbstractDiscoveryFilter;
 import org.apache.servicecomb.serviceregistry.discovery.DiscoveryContext;
@@ -59,7 +59,7 @@ public class ZoneAwareDiscoveryFilter extends AbstractDiscoveryFilter {
 
   @Override
   protected void init(DiscoveryContext context, DiscoveryTreeNode parent) {
-    MicroserviceInstance myself = RegistryUtils.getMicroserviceInstance();
+    MicroserviceInstance myself = RegistrationManager.INSTANCE.getMicroserviceInstance();
 
     Map<String, MicroserviceInstance> instancesRegionAndAZMatch = new HashMap<>();
     Map<String, MicroserviceInstance> instancesAZMatch = new HashMap<>();
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
index eb3b42a..0c4fc46 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
@@ -43,8 +43,6 @@ import org.apache.servicecomb.loadbalance.event.IsolationServerEvent;
 import org.apache.servicecomb.loadbalance.filter.IsolationDiscoveryFilter;
 import org.apache.servicecomb.loadbalance.filter.ServerDiscoveryFilter;
 import org.apache.servicecomb.loadbalance.filter.ZoneAwareDiscoveryFilter;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 import org.apache.servicecomb.serviceregistry.api.registry.DataCenterInfo;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
@@ -121,7 +119,7 @@ public class TestLoadBalanceHandler2 {
     Invocation invocation = new Invocation(referenceConfig, operationMeta, invocationRuntimeType, new HashMap<>());
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
-    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
+
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -171,10 +169,6 @@ public class TestLoadBalanceHandler2 {
     DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
     scbEngine.setTransportManager(transportManager);
 
-    RegistryUtils.setServiceRegistry(serviceRegistry);
-
-    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
-    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -271,7 +265,6 @@ public class TestLoadBalanceHandler2 {
     Invocation invocation = new Invocation(referenceConfig, operationMeta, invocationRuntimeType, new HashMap<>());
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
-    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -299,10 +292,6 @@ public class TestLoadBalanceHandler2 {
     DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
     scbEngine.setTransportManager(transportManager);
 
-    RegistryUtils.setServiceRegistry(serviceRegistry);
-
-    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
-    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -361,7 +350,6 @@ public class TestLoadBalanceHandler2 {
     Invocation invocation = new Invocation(referenceConfig, operationMeta, invocationRuntimeType, new HashMap<>());
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
-    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -411,10 +399,6 @@ public class TestLoadBalanceHandler2 {
     DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
     scbEngine.setTransportManager(transportManager);
 
-    RegistryUtils.setServiceRegistry(serviceRegistry);
-
-    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
-    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -488,7 +472,6 @@ public class TestLoadBalanceHandler2 {
     });
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
-    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -538,10 +521,6 @@ public class TestLoadBalanceHandler2 {
     DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
     scbEngine.setTransportManager(transportManager);
 
-    RegistryUtils.setServiceRegistry(serviceRegistry);
-
-    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
-    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -631,7 +610,6 @@ public class TestLoadBalanceHandler2 {
     });
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
-    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -682,10 +660,6 @@ public class TestLoadBalanceHandler2 {
     DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
     scbEngine.setTransportManager(transportManager);
 
-    RegistryUtils.setServiceRegistry(serviceRegistry);
-
-    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
-    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -783,7 +757,7 @@ public class TestLoadBalanceHandler2 {
     AsyncResponse asyncResp = Mockito.mock(AsyncResponse.class);
 
     InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
-    ServiceRegistry serviceRegistry = mockUpServiceRegistry();
+
     TransportManager transportManager = Mockito.mock(TransportManager.class);
     Transport transport = Mockito.mock(Transport.class);
     ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
@@ -802,10 +776,6 @@ public class TestLoadBalanceHandler2 {
     scbEngine.setTransportManager(transportManager);
     SCBEngine.getInstance().setTransportManager(transportManager);
 
-    RegistryUtils.setServiceRegistry(serviceRegistry);
-
-    when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
-    mockUpInstanceCacheManager(instanceCacheManager);
     when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
         .thenReturn(parent);
     when(transportManager.findTransport("rest")).thenReturn(transport);
@@ -988,19 +958,4 @@ public class TestLoadBalanceHandler2 {
   private void mockDelayMillis(long delay) {
     mockTimeMillis.value += delay;
   }
-
-  private void mockUpInstanceCacheManager(InstanceCacheManager instanceCacheManager) {
-    new MockUp<RegistryUtils>() {
-      @Mock
-      InstanceCacheManager getInstanceCacheManager() {
-        return instanceCacheManager;
-      }
-    };
-  }
-
-  private ServiceRegistry mockUpServiceRegistry() {
-    ServiceRegistry serviceRegistry = Mockito.mock(ServiceRegistry.class);
-    when(serviceRegistry.getEventBus()).thenReturn(EventManager.getEventBus());
-    return serviceRegistry;
-  }
 }
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java
index 448e454..abe1022 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadbalanceHandler.java
@@ -35,8 +35,6 @@ import org.apache.servicecomb.core.transport.TransportManager;
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.cache.CacheEndpoint;
 import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager;
@@ -69,8 +67,6 @@ import mockit.Mocked;
 public class TestLoadbalanceHandler {
   static SCBEngine scbEngine;
 
-  static ServiceRegistry serviceRegistry;
-
   static InstanceCacheManager instanceCacheManager;
 
   static TransportManager transportManager;
@@ -99,8 +95,6 @@ public class TestLoadbalanceHandler {
   @BeforeClass
   public static void classSetup() {
     scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest().run();
-    serviceRegistry = scbEngine.getServiceRegistry();
-    instanceCacheManager = RegistryUtils.getInstanceCacheManager();
     transportManager = scbEngine.getTransportManager();
   }
 
@@ -224,7 +218,8 @@ public class TestLoadbalanceHandler {
 
     Assert.assertEquals(1,
         loadBalancer.getLoadBalancerStats().getSingleServerStat(server).getSuccessiveConnectionFailureCount());
-    Assert.assertEquals("InvocationException: code=490;msg=CommonExceptionData [message=Unexpected consumer error, please check logs for details]",
+    Assert.assertEquals(
+        "InvocationException: code=490;msg=CommonExceptionData [message=Unexpected consumer error, please check logs for details]",
         result.value.getMessage());
   }
 
diff --git a/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/AuthHandlerBoot.java b/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/AuthHandlerBoot.java
index 897e090..7ec0b37 100644
--- a/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/AuthHandlerBoot.java
+++ b/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/AuthHandlerBoot.java
@@ -20,8 +20,8 @@ import org.apache.servicecomb.core.BootListener;
 import org.apache.servicecomb.foundation.common.utils.RSAKeyPairEntry;
 import org.apache.servicecomb.foundation.common.utils.RSAUtils;
 import org.apache.servicecomb.foundation.token.RSAKeypair4Auth;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.springframework.stereotype.Component;
 
 /**
@@ -41,7 +41,7 @@ public class AuthHandlerBoot implements BootListener {
       RSAKeypair4Auth.INSTANCE.setPrivateKey(rsaKeyPairEntry.getPrivateKey());
       RSAKeypair4Auth.INSTANCE.setPublicKey(rsaKeyPairEntry.getPublicKey());
       RSAKeypair4Auth.INSTANCE.setPublicKeyEncoded(rsaKeyPairEntry.getPublicKeyEncoded());
-      RegistryUtils.getMicroserviceInstance().getProperties().put(Const.INSTANCE_PUBKEY_PRO,
+      RegistrationManager.INSTANCE.getMicroserviceInstance().getProperties().put(DefinitionConst.INSTANCE_PUBKEY_PRO,
           rsaKeyPairEntry.getPublicKeyEncoded());
     }
   }
diff --git a/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/consumer/RSAConsumerTokenManager.java b/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/consumer/RSAConsumerTokenManager.java
index d3c610c..5be7efd 100644
--- a/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/consumer/RSAConsumerTokenManager.java
+++ b/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/consumer/RSAConsumerTokenManager.java
@@ -25,7 +25,7 @@ import java.security.spec.InvalidKeySpecException;
 import org.apache.servicecomb.authentication.RSAAuthenticationToken;
 import org.apache.servicecomb.foundation.common.utils.RSAUtils;
 import org.apache.servicecomb.foundation.token.RSAKeypair4Auth;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,8 +51,8 @@ public class RSAConsumerTokenManager {
 
   public String createToken() {
     PrivateKey privateKey = RSAKeypair4Auth.INSTANCE.getPrivateKey();
-    String instanceId = RegistryUtils.getMicroserviceInstance().getInstanceId();
-    String serviceId = RegistryUtils.getMicroservice().getServiceId();
+    String instanceId = RegistrationManager.INSTANCE.getMicroserviceInstance().getInstanceId();
+    String serviceId = RegistrationManager.INSTANCE.getMicroservice().getServiceId();
     @SuppressWarnings("deprecation")
     String randomCode = org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric(128);
     long generateTime = System.currentTimeMillis();
diff --git a/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/provider/RSAProviderTokenManager.java b/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/provider/RSAProviderTokenManager.java
index cc42567..9b5d0a3 100644
--- a/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/provider/RSAProviderTokenManager.java
+++ b/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/provider/RSAProviderTokenManager.java
@@ -16,21 +16,23 @@
  */
 package org.apache.servicecomb.authentication.provider;
 
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
 import java.security.SignatureException;
 import java.security.spec.InvalidKeySpecException;
 import java.util.concurrent.TimeUnit;
+
 import org.apache.servicecomb.authentication.RSAAuthenticationToken;
 import org.apache.servicecomb.foundation.common.utils.RSAUtils;
-import org.apache.servicecomb.serviceregistry.api.Const;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.cache.MicroserviceInstanceCache;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+
 public class RSAProviderTokenManager {
 
   private final static Logger LOGGER = LoggerFactory.getLogger(RSAProviderTokenManager.class);
@@ -90,7 +92,7 @@ public class RSAProviderTokenManager {
   private String getPublicKey(String instanceId, String serviceId) {
     MicroserviceInstance instances = MicroserviceInstanceCache.getOrCreate(serviceId, instanceId);
     if (instances != null) {
-      return instances.getProperties().get(Const.INSTANCE_PUBKEY_PRO);
+      return instances.getProperties().get(DefinitionConst.INSTANCE_PUBKEY_PRO);
     } else {
       LOGGER.error("not instance found {}-{}, maybe attack", instanceId, serviceId);
       return "";
diff --git a/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestAuthHandlerBoot.java b/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestAuthHandlerBoot.java
index ffec087..5cceb6f 100644
--- a/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestAuthHandlerBoot.java
+++ b/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestAuthHandlerBoot.java
@@ -20,14 +20,11 @@ import org.apache.servicecomb.AuthHandlerBoot;
 import org.apache.servicecomb.core.BootListener;
 import org.apache.servicecomb.core.BootListener.BootEvent;
 import org.apache.servicecomb.foundation.token.RSAKeypair4Auth;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.junit.Assert;
 import org.junit.Test;
 
-import mockit.Expectations;
-
 public class TestAuthHandlerBoot {
 
 
@@ -36,13 +33,6 @@ public class TestAuthHandlerBoot {
     MicroserviceInstance microserviceInstance = new MicroserviceInstance();
     Microservice microservice = new Microservice();
     microservice.setInstance(microserviceInstance);
-    new Expectations(RegistryUtils.class) {
-      {
-
-        RegistryUtils.getMicroserviceInstance();
-        result = microserviceInstance;
-      }
-    };
 
     AuthHandlerBoot authHandlerBoot = new AuthHandlerBoot();
     BootEvent bootEvent = new BootEvent();
diff --git a/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestRSAProviderTokenManager.java b/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestRSAProviderTokenManager.java
index bd9c456..d0ab949 100644
--- a/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestRSAProviderTokenManager.java
+++ b/handlers/handler-publickey-auth/src/test/java/org/apache/servicecomb/authentication/TestRSAProviderTokenManager.java
@@ -16,12 +16,10 @@
  */
 package org.apache.servicecomb.authentication;
 
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
-import mockit.Expectations;
+
 import org.apache.servicecomb.authentication.consumer.RSAConsumerTokenManager;
 import org.apache.servicecomb.authentication.provider.RSAProviderTokenManager;
 import org.apache.servicecomb.config.ConfigUtil;
@@ -29,16 +27,20 @@ import org.apache.servicecomb.foundation.common.utils.RSAKeyPairEntry;
 import org.apache.servicecomb.foundation.common.utils.RSAUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.token.RSAKeypair4Auth;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.api.Const;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.cache.MicroserviceInstanceCache;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+
+import mockit.Expectations;
+
 public class TestRSAProviderTokenManager {
 
 
@@ -60,7 +62,7 @@ public class TestRSAProviderTokenManager {
     MicroserviceInstance microserviceInstance = new MicroserviceInstance();
     Map<String, String> properties = new HashMap<>();
     microserviceInstance.setProperties(properties);
-    properties.put(Const.INSTANCE_PUBKEY_PRO,
+    properties.put(DefinitionConst.INSTANCE_PUBKEY_PRO,
         "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxKl5TNUTec7fL2degQcCk6vKf3c0wsfNK5V6elKzjWxm0MwbRj/UeR20VSnicBmVIOWrBS9LiERPPvjmmWUOSS2vxwr5XfhBhZ07gCAUNxBOTzgMo5nE45DhhZu5Jzt5qSV6o10Kq7+fCCBlDZ1UoWxZceHkUt5AxcrhEDulFjQIDAQAB");
     Assert.assertFalse(tokenManager.valid(tokenStr));
   }
@@ -111,17 +113,9 @@ public class TestRSAProviderTokenManager {
     microserviceInstance.setInstanceId(instanceId);
     Map<String, String> properties = new HashMap<>();
     microserviceInstance.setProperties(properties);
-    properties.put(Const.INSTANCE_PUBKEY_PRO, rsaKeyPairEntry.getPublicKeyEncoded());
+    properties.put(DefinitionConst.INSTANCE_PUBKEY_PRO, rsaKeyPairEntry.getPublicKeyEncoded());
     Microservice microservice = new Microservice();
     microservice.setServiceId(serviceId);
-    new Expectations(RegistryUtils.class) {
-      {
-        RegistryUtils.getMicroservice();
-        result = microservice;
-        RegistryUtils.getMicroserviceInstance();
-        result = microserviceInstance;
-      }
-    };
 
     //Test Consumer first create token
     String token = rsaConsumerTokenManager.getToken();
diff --git a/handlers/handler-router/src/main/java/org/apache/servicecomb/router/custom/MicroserviceCache.java b/handlers/handler-router/src/main/java/org/apache/servicecomb/router/custom/MicroserviceCache.java
index 6bae943..b92c486 100644
--- a/handlers/handler-router/src/main/java/org/apache/servicecomb/router/custom/MicroserviceCache.java
+++ b/handlers/handler-router/src/main/java/org/apache/servicecomb/router/custom/MicroserviceCache.java
@@ -19,12 +19,13 @@ package org.apache.servicecomb.router.custom;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 
 public final class MicroserviceCache {
 
   private static MicroserviceCache instance = new MicroserviceCache();
+
   private Map<String, Microservice> services = new HashMap<>();
 
   private MicroserviceCache() {
@@ -36,7 +37,7 @@ public final class MicroserviceCache {
 
   public Microservice getService(String serviceId) {
     return services.computeIfAbsent(serviceId, (k) ->
-        RegistryUtils.getMicroservice(serviceId)
+        DiscoveryManager.INSTANCE.getMicroservice(serviceId)
     );
   }
 }
diff --git a/huawei-cloud/servicestage/pom.xml b/huawei-cloud/servicestage/pom.xml
index af87940..a337632 100644
--- a/huawei-cloud/servicestage/pom.xml
+++ b/huawei-cloud/servicestage/pom.xml
@@ -32,6 +32,10 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>java-chassis-core</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+    </dependency>
   </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorBootListener.java b/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorBootListener.java
index 94728ac..f5ec8c5 100644
--- a/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorBootListener.java
+++ b/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorBootListener.java
@@ -17,7 +17,7 @@
 package org.apache.servicecomb.inspector.internal;
 
 import org.apache.servicecomb.core.BootListener;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,7 +42,7 @@ public class InspectorBootListener implements BootListener {
     LOGGER.info("inspector is enabled.");
     // will not register this schemas to service registry
     InspectorImpl inspector = new InspectorImpl(event.getScbEngine(), inspectorConfig,
-        RegistryUtils.getServiceRegistry().getMicroservice().getSchemaMap());
+        RegistrationManager.INSTANCE.getMicroservice().getSchemaMap());
     inspector.setPriorityPropertyManager(event.getScbEngine().getPriorityPropertyManager());
     event.getScbEngine().getProducerProviderManager().registerSchema("inspector", inspector);
   }
diff --git a/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorImpl.java b/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorImpl.java
index 6b94691..1fdb55a 100644
--- a/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorImpl.java
+++ b/inspector/src/main/java/org/apache/servicecomb/inspector/internal/InspectorImpl.java
@@ -16,8 +16,6 @@
  */
 package org.apache.servicecomb.inspector.internal;
 
-import static org.apache.servicecomb.serviceregistry.api.Const.URL_PREFIX;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -54,13 +52,13 @@ import org.apache.servicecomb.config.priority.PriorityPropertyManager;
 import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
-import org.apache.servicecomb.deployment.Deployment;
 import org.apache.servicecomb.foundation.common.part.InputStreamPart;
 import org.apache.servicecomb.inspector.internal.model.DynamicPropertyView;
 import org.apache.servicecomb.inspector.internal.model.PriorityPropertyView;
 import org.apache.servicecomb.inspector.internal.swagger.AppendStyleProcessor;
 import org.apache.servicecomb.inspector.internal.swagger.SchemaFormat;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
@@ -131,7 +129,7 @@ public class InspectorImpl {
       return;
     }
 
-    String urlPrefix = Deployment.getClassLoaderScopeProperty(URL_PREFIX);
+    String urlPrefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     if (StringUtils.isEmpty(urlPrefix)) {
       return;
     }
@@ -187,7 +185,8 @@ public class InspectorImpl {
     }
 
     Part part = new InputStreamPart(null, new ByteArrayInputStream(os.toByteArray()))
-        .setSubmittedFileName(RegistryUtils.getMicroservice().getServiceName() + format.getSuffix() + ".zip");
+        .setSubmittedFileName(
+            RegistrationManager.INSTANCE.getMicroservice().getServiceName() + format.getSuffix() + ".zip");
     return Response.ok(part);
   }
 
diff --git a/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorImpl.java b/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorImpl.java
index 9f8646a..f28e51b 100644
--- a/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorImpl.java
+++ b/inspector/src/test/java/org/apache/servicecomb/inspector/internal/TestInspectorImpl.java
@@ -17,7 +17,6 @@
 package org.apache.servicecomb.inspector.internal;
 
 import static org.apache.servicecomb.core.Const.RESTFUL;
-import static org.apache.servicecomb.serviceregistry.api.Const.URL_PREFIX;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -44,15 +43,14 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
 import org.apache.servicecomb.core.definition.CoreMetaUtils;
-import org.apache.servicecomb.deployment.Deployment;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.foundation.test.scaffolding.exception.RuntimeExceptionWithoutStackTrace;
 import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector;
 import org.apache.servicecomb.inspector.internal.model.DynamicPropertyView;
 import org.apache.servicecomb.inspector.internal.model.PriorityPropertyView;
 import org.apache.servicecomb.inspector.internal.swagger.SchemaFormat;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.engine.SwaggerProducer;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData;
@@ -93,7 +91,7 @@ public class TestInspectorImpl {
     if (StringUtils.isNotEmpty(urlPrefix)) {
       Map<String, Transport> transportMap = Deencapsulation.getField(scbEngine.getTransportManager(), "transportMap");
       transportMap.put(RESTFUL, new ServletRestTransport());
-      Deployment.setClassLoaderScopeProperty(URL_PREFIX, urlPrefix);
+      SCBEngine.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, urlPrefix);
     }
 
     scbEngine.run();
@@ -107,7 +105,7 @@ public class TestInspectorImpl {
   public static void teardown() {
     ArchaiusUtils.resetConfig();
     SCBEngine.getInstance().destroy();
-    Deployment.clearClassLoaderScopeProperty();
+    SCBEngine.clearClassLoaderScopeProperty();
   }
 
   private Map<String, String> unzip(InputStream is) throws IOException {
@@ -140,15 +138,6 @@ public class TestInspectorImpl {
   }
 
   private void testDownloadSchemasSwagger(Microservice microservice, SchemaFormat format) throws IOException {
-    new Expectations(RegistryUtils.class) {
-      {
-        RegistryUtils.getMicroservice();
-        result = microservice;
-        microservice.getServiceName();
-        result = "ms";
-      }
-    };
-
     Response response = inspector.downloadSchemas(format);
     Part part = response.getResult();
     Assert.assertEquals("ms.yaml.zip", part.getSubmittedFileName());
@@ -164,14 +153,6 @@ public class TestInspectorImpl {
 
   @Test
   public void downloadSchemas_html(@Mocked Microservice microservice) throws IOException {
-    new Expectations(RegistryUtils.class) {
-      {
-        RegistryUtils.getMicroservice();
-        result = microservice;
-        microservice.getServiceName();
-        result = "ms";
-      }
-    };
 
     Response response = inspector.downloadSchemas(SchemaFormat.HTML);
     Part part = response.getResult();
diff --git a/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/CommandReceiver.java b/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/CommandReceiver.java
index 55d9e66..2bc1f25 100644
--- a/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/CommandReceiver.java
+++ b/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/CommandReceiver.java
@@ -24,7 +24,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.SCBStatus;
 import org.apache.servicecomb.foundation.common.utils.JsonUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -87,7 +87,7 @@ public class CommandReceiver {
       for (; ; ) {
         SCBEngine.getInstance().destroy();
         if (ITBootListener.isDone() && SCBStatus.DOWN.equals(SCBEngine.getInstance().getStatus())) {
-          LOGGER.info("succeed to close " + RegistryUtils.getMicroservice().getServiceName());
+          LOGGER.info("succeed to close " + RegistrationManager.INSTANCE.getMicroservice().getServiceName());
           break;
         }
         ITUtils.forceWait(TimeUnit.SECONDS, 1);
@@ -95,7 +95,6 @@ public class CommandReceiver {
 
       //make sure kill for servlet
       System.exit(0);
-
     }, "it-stop").start();
   }
 }
diff --git a/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/ITUtils.java b/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/ITUtils.java
index f57e835..bcb99cb 100644
--- a/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/ITUtils.java
+++ b/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/ITUtils.java
@@ -25,7 +25,7 @@ import java.util.stream.Collectors;
 import org.apache.commons.lang3.reflect.MethodUtils;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.SCBStatus;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersionRule;
 import org.slf4j.Logger;
@@ -77,7 +77,7 @@ public final class ITUtils {
 
     Map<String, MicroserviceInstance> instances;
     for (; ; ) {
-      MicroserviceVersionRule microserviceVersionRule = RegistryUtils
+      MicroserviceVersionRule microserviceVersionRule = DiscoveryManager.INSTANCE
           .getAppManager()
           .getOrCreateMicroserviceVersionRule(appId, microserviceName, strVersionRule);
       instances = microserviceVersionRule.getInstances();
@@ -92,7 +92,7 @@ public final class ITUtils {
           minInstanceCount,
           instances.size());
       // pull at once
-      RegistryUtils.getAppManager().pullInstances();
+      DiscoveryManager.INSTANCE.getAppManager().pullInstances();
       forceWait(TimeUnit.SECONDS, 1);
     }
 
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/MicroserviceDeploy.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/MicroserviceDeploy.java
index 4988caf..0507aa9 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/MicroserviceDeploy.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/MicroserviceDeploy.java
@@ -18,7 +18,8 @@ package org.apache.servicecomb.it.deploy;
 
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.servicecomb.it.ITUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersionRule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,13 +50,13 @@ public class MicroserviceDeploy extends NormalDeploy {
   protected String[] addArgs(String[] cmds) {
     // add jar
     return ArrayUtils.addAll(super.addArgs(cmds),
-        "-DselfController=" + RegistryUtils.getMicroserviceInstance().getInstanceId(),
+        "-DselfController=" + RegistrationManager.INSTANCE.getMicroserviceInstance().getInstanceId(),
         "-Dservice_description.name=" + microserviceDeployDefinition.getMicroserviceName(),
         deployDefinition.getCmd());
   }
 
   public void ensureReady() throws Throwable {
-    MicroserviceVersionRule microserviceVersionRule = RegistryUtils.getAppManager()
+    MicroserviceVersionRule microserviceVersionRule = DiscoveryManager.INSTANCE.getAppManager()
         .getOrCreateMicroserviceVersionRule(microserviceDeployDefinition.getAppId(),
             microserviceDeployDefinition.getMicroserviceName(),
             microserviceDeployDefinition.getVersion());
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/GateRestTemplate.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/GateRestTemplate.java
index c9ea374..b5ff7f9 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/GateRestTemplate.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/GateRestTemplate.java
@@ -24,7 +24,8 @@ import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.core.provider.consumer.MicroserviceReferenceConfig;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
 import org.apache.servicecomb.it.junit.ITJUnitUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersionRule;
 import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
@@ -70,8 +71,8 @@ public class GateRestTemplate extends RestTemplate {
   }
 
   private String getUrlPrefix(String gateName, String producerName, String schemaId) {
-    MicroserviceVersionRule microserviceVersionRule = RegistryUtils.getAppManager()
-        .getOrCreateMicroserviceVersionRule(RegistryUtils.getAppId(), gateName,
+    MicroserviceVersionRule microserviceVersionRule = DiscoveryManager.INSTANCE.getAppManager()
+        .getOrCreateMicroserviceVersionRule(RegistrationManager.INSTANCE.getMicroservice().getAppId(), gateName,
             DefinitionConst.VERSION_RULE_ALL);
     MicroserviceInstance microserviceInstance = microserviceVersionRule.getInstances().values().stream().findFirst()
         .get();
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/ITSCBAsyncRestTemplate.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/ITSCBAsyncRestTemplate.java
index 21f55a8..3b68d71 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/ITSCBAsyncRestTemplate.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/ITSCBAsyncRestTemplate.java
@@ -26,7 +26,8 @@ import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.it.junit.ITJUnitUtils;
 import org.apache.servicecomb.provider.springmvc.reference.async.CseAsyncRestTemplate;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceManager;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersion;
@@ -51,8 +52,8 @@ public class ITSCBAsyncRestTemplate extends CseAsyncRestTemplate {
     ensureProviderBasePath(producerName);
 
     urlPrefix = String.format("cse://%s%s", producerName, basePath);
-    instance = RegistryUtils.getAppManager()
-        .getOrCreateMicroserviceManager(RegistryUtils.getAppId())
+    instance = DiscoveryManager.INSTANCE.getAppManager()
+        .getOrCreateMicroserviceManager(RegistrationManager.INSTANCE.getMicroservice().getAppId())
         .getOrCreateMicroserviceVersions(producerName).getPulledInstances().get(0);
 
     setUriTemplateHandler(new ITUriTemplateHandler(urlPrefix));
@@ -78,7 +79,8 @@ public class ITSCBAsyncRestTemplate extends CseAsyncRestTemplate {
 
   private void ensureProviderBasePath(String producerName) {
     MicroserviceManager microserviceManager =
-        RegistryUtils.getAppManager().getOrCreateMicroserviceManager(RegistryUtils.getAppId());
+        DiscoveryManager.INSTANCE.getAppManager()
+            .getOrCreateMicroserviceManager(RegistrationManager.INSTANCE.getMicroservice().getAppId());
     MicroserviceVersions producerMicroserviceVersions =
         microserviceManager.getOrCreateMicroserviceVersions(producerName);
     Optional<MicroserviceVersion> latestMicroserviceVersion =
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/ITSCBRestTemplate.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/ITSCBRestTemplate.java
index f37d139..223bf56 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/ITSCBRestTemplate.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/extend/engine/ITSCBRestTemplate.java
@@ -24,7 +24,8 @@ import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.core.provider.consumer.MicroserviceReferenceConfig;
 import org.apache.servicecomb.it.junit.ITJUnitUtils;
 import org.apache.servicecomb.provider.springmvc.reference.CseRestTemplate;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 
 public class ITSCBRestTemplate extends CseRestTemplate {
@@ -48,8 +49,8 @@ public class ITSCBRestTemplate extends CseRestTemplate {
     SchemaMeta schemaMeta = microserviceMeta.ensureFindSchemaMeta(schemaId);
     basePath = schemaMeta.getSwagger().getBasePath();
     urlPrefix = String.format("cse://%s%s", producerName, basePath);
-    instance = RegistryUtils.getAppManager()
-        .getOrCreateMicroserviceManager(RegistryUtils.getAppId())
+    instance = DiscoveryManager.INSTANCE.getAppManager()
+        .getOrCreateMicroserviceManager(RegistrationManager.INSTANCE.getMicroservice().getAppId())
         .getOrCreateMicroserviceVersions(producerName).getPulledInstances().get(0);
 
     setUriTemplateHandler(new ITUriTemplateHandler(urlPrefix));
diff --git a/integration-tests/it-edge/src/main/java/org/apache/servicecomb/it/edge/PreLoadBootListener.java b/integration-tests/it-edge/src/main/java/org/apache/servicecomb/it/edge/PreLoadBootListener.java
index b047ffa..2d27d20 100644
--- a/integration-tests/it-edge/src/main/java/org/apache/servicecomb/it/edge/PreLoadBootListener.java
+++ b/integration-tests/it-edge/src/main/java/org/apache/servicecomb/it/edge/PreLoadBootListener.java
@@ -18,7 +18,8 @@
 package org.apache.servicecomb.it.edge;
 
 import org.apache.servicecomb.core.BootListener;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.consumer.MicroserviceVersionRule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,8 +37,9 @@ public class PreLoadBootListener implements BootListener {
   @Override
   public void onBootEvent(BootEvent bootEvent) {
     if (bootEvent.getEventType() == EventType.BEFORE_REGISTRY) {
-      MicroserviceVersionRule rule = RegistryUtils.getAppManager()
-          .getOrCreateMicroserviceVersionRule(RegistryUtils.getAppId(), "it-producer", "0+");
+      MicroserviceVersionRule rule = DiscoveryManager.INSTANCE.getAppManager()
+          .getOrCreateMicroserviceVersionRule(RegistrationManager.INSTANCE.getMicroservice().getAppId(), "it-producer",
+              "0+");
       if (rule.getInstances().size() == 0) {
         LOGGER.warn("Prefetch not successful, maybe the provider not started.");
       }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ReactiveWithIntfSchema.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ReactiveWithIntfSchema.java
index 9c82695..95628d0 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ReactiveWithIntfSchema.java
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/ReactiveWithIntfSchema.java
@@ -24,18 +24,7 @@ import org.apache.servicecomb.provider.pojo.RpcSchema;
  * verify https://issues.apache.org/jira/browse/SCB-858
  */
 @RpcSchema(schemaId = "reactiveWithIntf")
-public class ReactiveWithIntfSchema implements ReactiveHelloIntf {//}, BootListener {
-//  @ApiOperation(value = "", hidden = true)
-//  @Override
-//  public void onAfterProducerProvider(BootEvent event) {
-//    Microservice microservice = RegistryUtils.getMicroservice();
-//    MicroserviceMeta microserviceMeta = SCBEngine.getInstance().getProducerMicroserviceMeta();
-//    SchemaMeta schemaMeta = microserviceMeta.findSchemaMeta("reactiveWithIntf");
-//    schemaMeta.getSwagger().getInfo()
-//        .setVendorExtension(SwaggerConst.EXT_JAVA_INTF, ReactiveHelloIntf.class.getName());
-//    String content = SwaggerUtils.swaggerToString(schemaMeta.getSwagger());
-//    microservice.getSchemaMap().put(schemaMeta.getSchemaId(), content);
-//  }
+public class ReactiveWithIntfSchema implements ReactiveHelloIntf {
 
   @Override
   public CompletableFuture<String> hello(String name) {
diff --git a/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/JaxrsIntegrationTestBase.java b/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/JaxrsIntegrationTestBase.java
index 485ea67..70b4560 100644
--- a/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/JaxrsIntegrationTestBase.java
+++ b/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/JaxrsIntegrationTestBase.java
@@ -145,16 +145,11 @@ public class JaxrsIntegrationTestBase {
 
   @Test
   public void getsJaxrsResponse() {
-    //    String srcMicroserviceName = RegistryUtils.getMicroservice().getServiceName();
-    //    String context = String.format("{x-cse-src-microservice=%s}", srcMicroserviceName);
-
     ResponseEntity<User> responseEntity = restTemplate
         .getForEntity(codeFirstUrl + "response", User.class);
 
     assertEquals(202, responseEntity.getStatusCode().value());
     assertEquals("User [name=nameA, age=100, index=0]", responseEntity.getBody().toString());
-    //      assertEquals("h1v " + context, responseEntity.getHeaders().getFirst("h1"));
-    //      assertEquals("h2v " + context, responseEntity.getHeaders().getFirst("h2"));
   }
 
   @Test
diff --git a/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/RawJaxrsIntegrationTest.java b/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/RawJaxrsIntegrationTest.java
index 74fb18e..113aec7 100644
--- a/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/RawJaxrsIntegrationTest.java
+++ b/integration-tests/jaxrs-tests/src/test/java/org/apache/servicecomb/demo/jaxrs/tests/RawJaxrsIntegrationTest.java
@@ -17,15 +17,14 @@
 
 package org.apache.servicecomb.demo.jaxrs.tests;
 
-import static org.apache.servicecomb.serviceregistry.client.LocalServiceRegistryClientImpl.LOCAL_REGISTRY_FILE_KEY;
-
 import org.junit.BeforeClass;
 
 public class RawJaxrsIntegrationTest extends JaxrsIntegrationTestBase {
 
   @BeforeClass
   public static void setUp() throws Exception {
-    System.setProperty(LOCAL_REGISTRY_FILE_KEY, "notExistJustForceLocal");
+    // TODO : local test
+//    System.setProperty(LOCAL_REGISTRY_FILE_KEY, "notExistJustForceLocal");
     JaxrsTestMain.main(new String[0]);
   }
 }
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 63e98c1..7c9fb26 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -131,7 +131,10 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>metrics-core</artifactId>
     </dependency>
-
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>service-registry</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.hamcrest</groupId>
       <artifactId>hamcrest-core</artifactId>
diff --git a/integration-tests/test-common/src/test/java/org/apache/servicecomb/tests/tracing/TracingTestBase.java b/integration-tests/test-common/src/test/java/org/apache/servicecomb/tests/tracing/TracingTestBase.java
index 5198e13..d0670a7 100644
--- a/integration-tests/test-common/src/test/java/org/apache/servicecomb/tests/tracing/TracingTestBase.java
+++ b/integration-tests/test-common/src/test/java/org/apache/servicecomb/tests/tracing/TracingTestBase.java
@@ -18,7 +18,6 @@
 package org.apache.servicecomb.tests.tracing;
 
 import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.CONFIG_TRACING_COLLECTOR_ADDRESS;
-import static org.apache.servicecomb.serviceregistry.client.LocalServiceRegistryClientImpl.LOCAL_REGISTRY_FILE_KEY;
 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
 import static org.junit.Assert.assertThat;
 
@@ -58,7 +57,8 @@ public class TracingTestBase {
   }
 
   private static void setUpLocalRegistry() {
-    System.setProperty(LOCAL_REGISTRY_FILE_KEY, "notExistJustForceLocal");
+    // TODO : local registry
+//    System.setProperty(LOCAL_REGISTRY_FILE_KEY, "notExistJustForceLocal");
   }
 
   protected void assertThatSpansReceivedByZipkin(Collection<String> logs, String... values) {
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java
index cad992f..4b4301d 100644
--- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestMetricsBootListener.java
@@ -19,7 +19,7 @@ package org.apache.servicecomb.metrics.core;
 import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.junit.Before;
 import org.junit.Test;
@@ -35,7 +35,7 @@ public class TestMetricsBootListener {
   public void registerSchemas() {
     new SCBBootstrap().useLocalRegistry().createSCBEngineForTest().run();
 
-    Microservice microservice = RegistryUtils.getMicroservice();
+    Microservice microservice = RegistrationManager.INSTANCE.getMicroservice();
     microservice.getSchemas().contains("healthEndpoint");
     microservice.getSchemaMap().containsKey("healthEndpoint");
 
diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
index cf48701..7db5147 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
@@ -25,7 +25,7 @@ import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
 import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -105,7 +105,7 @@ public class PrometheusPublisher extends Collector implements Collector.Describa
     List<String> labelValues = new ArrayList<>();
 
     labelNames.add("appId");
-    labelValues.add(RegistryUtils.getAppId());
+    labelValues.add(RegistrationManager.INSTANCE.getMicroservice().getAppId());
 
     for (Tag tag : measurement.id().tags()) {
       labelNames.add(tag.key());
diff --git a/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java b/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java
index 597c39a..c48c688 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java
@@ -28,7 +28,6 @@ import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Rule;
@@ -42,7 +41,6 @@ import com.netflix.spectator.api.Registry;
 import com.sun.net.httpserver.HttpServer;
 
 import io.prometheus.client.exporter.HTTPServer;
-import mockit.Expectations;
 
 @SuppressWarnings("restriction")
 public class TestPrometheusPublisher {
@@ -84,12 +82,6 @@ public class TestPrometheusPublisher {
 
   @Test
   public void collect() throws IllegalAccessException, IOException {
-    new Expectations(RegistryUtils.class) {
-      {
-        RegistryUtils.getAppId();
-        result = "testAppId";
-      }
-    };
     ArchaiusUtils.setProperty(PrometheusPublisher.METRICS_PROMETHEUS_ADDRESS, "localhost:0");
     publisher.init(globalRegistry, null, null);
 
diff --git a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java
index ed6a0a4..1521689 100644
--- a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java
+++ b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/async/CseAsyncClientHttpRequestTest.java
@@ -25,8 +25,6 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.bootstrap.SCBBootstrap;
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.provider.springmvc.reference.CseClientHttpResponse;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -40,14 +38,11 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
-import mockit.Deencapsulation;
-
 public class CseAsyncClientHttpRequestTest {
   static SCBEngine scbEngine;
 
   @BeforeClass
   public static void classSetup() {
-    Deencapsulation.setField(RegistryUtils.class, "appManager", new AppManager());
     scbEngine = new SCBBootstrap().useLocalRegistry().createSCBEngineForTest()
         .addProducerMeta("sid1", new CseAsyncClientHttpRequestTestSchema()).run();
   }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/Features.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/Features.java
deleted file mode 100644
index 48f6db4..0000000
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/Features.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.serviceregistry;
-
-public class Features {
-  private boolean canEncodeEndpoint;
-
-  public boolean isCanEncodeEndpoint() {
-    return canEncodeEndpoint;
-  }
-
-  public void setCanEncodeEndpoint(boolean canEncodeEndpoint) {
-    this.canEncodeEndpoint = canEncodeEndpoint;
-  }
-}
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
index 9e02945..9fc917b 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/RegistryUtils.java
@@ -17,9 +17,6 @@
 
 package org.apache.servicecomb.serviceregistry;
 
-import java.net.InetSocketAddress;
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -30,13 +27,10 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.regex.Matcher;
 
-import org.apache.http.client.utils.URIBuilder;
 import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.config.archaius.sources.MicroserviceConfigLoader;
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.common.event.EventManager;
-import org.apache.servicecomb.foundation.common.net.IpPort;
-import org.apache.servicecomb.foundation.common.net.NetUtils;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.api.response.FindInstancesResponse;
@@ -45,14 +39,12 @@ import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManagerNew;
 import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
 import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
 import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
-import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.apache.servicecomb.serviceregistry.definition.MicroserviceDefinition;
 import org.apache.servicecomb.serviceregistry.registry.ServiceRegistryFactory;
 import org.apache.servicecomb.serviceregistry.registry.cache.AggregateServiceRegistryCache;
 import org.apache.servicecomb.serviceregistry.registry.cache.MicroserviceCache;
 import org.apache.servicecomb.serviceregistry.registry.cache.MicroserviceCache.MicroserviceCacheStatus;
 import org.apache.servicecomb.serviceregistry.registry.cache.MicroserviceCacheKey;
-import org.apache.servicecomb.serviceregistry.swagger.SwaggerLoader;
 import org.apache.servicecomb.serviceregistry.task.MicroserviceInstanceRegisterTask;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -61,7 +53,6 @@ import org.springframework.util.StringUtils;
 import com.google.common.base.Charsets;
 import com.google.common.eventbus.Subscribe;
 import com.google.common.hash.Hashing;
-import com.netflix.config.DynamicPropertyFactory;
 
 public final class RegistryUtils {
   private static final Logger LOGGER = LoggerFactory.getLogger(RegistryUtils.class);
@@ -71,12 +62,9 @@ public final class RegistryUtils {
    */
   private static volatile ServiceRegistry serviceRegistry;
 
-  // value is ip or {interface name}
-  public static final String PUBLISH_ADDRESS = "servicecomb.service.publishAddress";
 
-  private static final String PUBLISH_PORT = "servicecomb.{transport_name}.publishPort";
-
-  private static InstanceCacheManager instanceCacheManager = new InstanceCacheManagerNew(DiscoveryManager.INSTANCE.getAppManager());
+  private static InstanceCacheManager instanceCacheManager = new InstanceCacheManagerNew(
+      DiscoveryManager.INSTANCE.getAppManager());
 
   private static final Map<String, ServiceRegistryConfig> EXTRA_SERVICE_REGISTRY_CONFIGS = new LinkedHashMap<>();
 
@@ -103,7 +91,8 @@ public final class RegistryUtils {
     ArrayList<ServiceRegistry> serviceRegistries = new ArrayList<>();
     executeOnEachServiceRegistry(serviceRegistries::add);
     aggregateServiceRegistryCache = new AggregateServiceRegistryCache(serviceRegistries);
-    aggregateServiceRegistryCache.setCacheRefreshedWatcher(refreshedCaches -> appManager.pullInstances());
+    aggregateServiceRegistryCache
+        .setCacheRefreshedWatcher(refreshedCaches -> DiscoveryManager.INSTANCE.getAppManager().pullInstances());
 
     executeOnEachServiceRegistry(
         serviceRegistry -> serviceRegistry
@@ -168,103 +157,6 @@ public final class RegistryUtils {
     return serviceRegistry.getMicroserviceInstance();
   }
 
-  public static String getPublishAddress() {
-    String publicAddressSetting =
-        DynamicPropertyFactory.getInstance().getStringProperty(PUBLISH_ADDRESS, "").get();
-    publicAddressSetting = publicAddressSetting.trim();
-    if (publicAddressSetting.isEmpty()) {
-      return NetUtils.getHostAddress();
-    }
-
-    // placeholder is network interface name
-    if (publicAddressSetting.startsWith("{") && publicAddressSetting.endsWith("}")) {
-      return NetUtils
-          .ensureGetInterfaceAddress(publicAddressSetting.substring(1, publicAddressSetting.length() - 1))
-          .getHostAddress();
-    }
-
-    return publicAddressSetting;
-  }
-
-  public static String getPublishHostName() {
-    String publicAddressSetting =
-        DynamicPropertyFactory.getInstance().getStringProperty(PUBLISH_ADDRESS, "").get();
-    publicAddressSetting = publicAddressSetting.trim();
-    if (publicAddressSetting.isEmpty()) {
-      return NetUtils.getHostName();
-    }
-
-    if (publicAddressSetting.startsWith("{") && publicAddressSetting.endsWith("}")) {
-      return NetUtils
-          .ensureGetInterfaceAddress(publicAddressSetting.substring(1, publicAddressSetting.length() - 1))
-          .getHostName();
-    }
-
-    return publicAddressSetting;
-  }
-
-  /**
-   * In the case that listening address configured as 0.0.0.0, the publish address will be determined
-   * by the query result for the net interfaces.
-   *
-   * @return the publish address, or {@code null} if the param {@code address} is null.
-   */
-  public static String getPublishAddress(String schema, String address) {
-    if (address == null) {
-      return address;
-    }
-
-    try {
-      URI originalURI = new URI(schema + "://" + address);
-      IpPort ipPort = NetUtils.parseIpPort(originalURI);
-      if (ipPort == null) {
-        LOGGER.warn("address {} not valid.", address);
-        return null;
-      }
-
-      IpPort publishIpPort = genPublishIpPort(schema, ipPort);
-      URIBuilder builder = new URIBuilder(originalURI);
-      return builder.setHost(publishIpPort.getHostOrIp()).setPort(publishIpPort.getPort()).build().toString();
-    } catch (URISyntaxException e) {
-      LOGGER.warn("address {} not valid.", address);
-      return null;
-    }
-  }
-
-  private static IpPort genPublishIpPort(String schema, IpPort ipPort) {
-    String publicAddressSetting = DynamicPropertyFactory.getInstance()
-        .getStringProperty(PUBLISH_ADDRESS, "")
-        .get();
-    publicAddressSetting = publicAddressSetting.trim();
-
-    if (publicAddressSetting.isEmpty()) {
-      InetSocketAddress socketAddress = ipPort.getSocketAddress();
-      if (socketAddress.getAddress().isAnyLocalAddress()) {
-        String host = NetUtils.getHostAddress();
-        LOGGER.warn("address {}, auto select a host address to publish {}:{}, maybe not the correct one",
-            socketAddress,
-            host,
-            socketAddress.getPort());
-        return new IpPort(host, ipPort.getPort());
-      }
-
-      return ipPort;
-    }
-
-    if (publicAddressSetting.startsWith("{") && publicAddressSetting.endsWith("}")) {
-      publicAddressSetting = NetUtils
-          .ensureGetInterfaceAddress(
-              publicAddressSetting.substring(1, publicAddressSetting.length() - 1))
-          .getHostAddress();
-    }
-
-    String publishPortKey = PUBLISH_PORT.replace("{transport_name}", schema);
-    int publishPortSetting = DynamicPropertyFactory.getInstance()
-        .getIntProperty(publishPortKey, 0)
-        .get();
-    int publishPort = publishPortSetting == 0 ? ipPort.getPort() : publishPortSetting;
-    return new IpPort(publicAddressSetting, publishPort);
-  }
 
   public static List<MicroserviceInstance> findServiceInstance(String appId, String serviceName,
       String versionRule) {
@@ -338,6 +230,7 @@ public final class RegistryUtils {
         sr -> sr.getServiceRegistryClient().getAggregatedSchema(microserviceId, schemaId));
   }
 
+  // TODO : rename to getMiscroservice and delete original getMiscroservice
   public static Microservice getAggregatedRemoteMicroservice(String microserviceId) {
     return getResultFromFirstValidServiceRegistry(
         sr -> sr.getAggregatedRemoteMicroservice(microserviceId));
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceRegistry.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceRegistry.java
index 2de3e83..bd10bcd 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceRegistry.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/ServiceRegistry.java
@@ -94,8 +94,6 @@ public interface ServiceRegistry {
    */
   Microservice getAggregatedRemoteMicroservice(String microserviceId);
 
-  Features getFeatures();
-
   /**
    * <p>
    * Register a third party service if not registered before, and set it's instances into
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java
index 697f16a..26ac8ee 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/api/Const.java
@@ -189,8 +189,6 @@ public final class Const {
 
 
 
-  public static final String INSTANCE_PUBKEY_PRO = "publickey";
-
   public static final String SERVICECENTER_FRAMEWORK_VERSION = "1.0.0";
 
 
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/InstanceCacheCheckTask.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/InstanceCacheCheckTask.java
index 21e0a90..a107a48 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/InstanceCacheCheckTask.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/InstanceCacheCheckTask.java
@@ -20,8 +20,7 @@ import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.consumer.AppManager;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.registry.RemoteServiceRegistry;
 import org.apache.servicecomb.serviceregistry.registry.ServiceRegistryTaskInitializer;
 import org.slf4j.Logger;
@@ -48,8 +47,6 @@ public class InstanceCacheCheckTask implements ServiceRegistryTaskInitializer {
   // auto task
   private ScheduledFuture<?> scheduledFuture;
 
-  private AppManager appManager;
-
   private ScheduledThreadPoolExecutor taskPool;
 
   private EventBus eventBus;
@@ -65,10 +62,6 @@ public class InstanceCacheCheckTask implements ServiceRegistryTaskInitializer {
     this.timeUnit = timeUnit;
   }
 
-  public void setAppManager(AppManager appManager) {
-    this.appManager = appManager;
-  }
-
   public void setTaskPool(ScheduledThreadPoolExecutor taskPool) {
     this.taskPool = taskPool;
   }
@@ -87,7 +80,6 @@ public class InstanceCacheCheckTask implements ServiceRegistryTaskInitializer {
 
   @Override
   public void init(RemoteServiceRegistry remoteServiceRegistry) {
-    appManager = RegistryUtils.getAppManager();
     taskPool = remoteServiceRegistry.getTaskPool();
     eventBus = remoteServiceRegistry.getEventBus();
 
@@ -128,7 +120,7 @@ public class InstanceCacheCheckTask implements ServiceRegistryTaskInitializer {
 
   protected void runTask() {
     try {
-      InstanceCacheChecker checker = new InstanceCacheChecker(appManager);
+      InstanceCacheChecker checker = new InstanceCacheChecker(DiscoveryManager.INSTANCE.getAppManager());
       InstanceCacheSummary instanceCacheSummary = checker.check();
       eventBus.post(instanceCacheSummary);
 
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/AbstractServiceRegistry.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/AbstractServiceRegistry.java
index a8c4bc3..0baf705 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/AbstractServiceRegistry.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/AbstractServiceRegistry.java
@@ -28,7 +28,7 @@ import java.util.Set;
 import java.util.concurrent.ExecutorService;
 
 import org.apache.servicecomb.foundation.common.concurrency.SuppressedRunnableWrapper;
-import org.apache.servicecomb.serviceregistry.Features;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 import org.apache.servicecomb.serviceregistry.api.Const;
@@ -66,8 +66,6 @@ import com.google.common.util.concurrent.MoreExecutors;
 public abstract class AbstractServiceRegistry implements ServiceRegistry {
   private static final Logger LOGGER = LoggerFactory.getLogger(AbstractServiceRegistry.class);
 
-  private Features features = new Features();
-
   private MicroserviceFactory microserviceFactory = new MicroserviceFactory();
 
   protected EventBus eventBus;
@@ -118,11 +116,6 @@ public abstract class AbstractServiceRegistry implements ServiceRegistry {
   }
 
   @Override
-  public Features getFeatures() {
-    return features;
-  }
-
-  @Override
   public EventBus getEventBus() {
     return eventBus;
   }
@@ -269,14 +262,15 @@ public abstract class AbstractServiceRegistry implements ServiceRegistry {
   }
 
   @Override
+  // TODO: this is for 3rd party invocation, and a better way can be provided
   public void registerMicroserviceMapping(String microserviceName, String version,
       List<MicroserviceInstance> instances, Class<?> schemaIntfCls) {
     MicroserviceNameParser parser = new MicroserviceNameParser(microservice.getAppId(), microserviceName);
-    MicroserviceManager microserviceManager = RegistryUtils.getAppManager()
+    MicroserviceManager microserviceManager = DiscoveryManager.INSTANCE.getAppManager()
         .getOrCreateMicroserviceManager(parser.getAppId());
     microserviceManager.getVersionsByName()
         .computeIfAbsent(microserviceName,
-            svcName -> new StaticMicroserviceVersions(RegistryUtils.getAppManager(), parser.getAppId(),
+            svcName -> new StaticMicroserviceVersions(DiscoveryManager.INSTANCE.getAppManager(), parser.getAppId(),
                 microserviceName)
                 .init(schemaIntfCls, version, instances)
         );
@@ -321,7 +315,7 @@ public abstract class AbstractServiceRegistry implements ServiceRegistry {
     executorService.execute(new SuppressedRunnableWrapper(
         () -> {
           serviceRegistryCache.onMicroserviceInstanceChanged(changedEvent);
-          RegistryUtils.getAppManager().onMicroserviceInstanceChanged(changedEvent);
+          DiscoveryManager.INSTANCE.getAppManager().onMicroserviceInstanceChanged(changedEvent);
         }));
   }
 
@@ -330,7 +324,7 @@ public abstract class AbstractServiceRegistry implements ServiceRegistry {
   public void serviceRegistryRecovery(RecoveryEvent event) {
     executorService.execute(() -> {
       serviceRegistryCache.forceRefreshCache();
-      RegistryUtils.getAppManager().pullInstances();
+      DiscoveryManager.INSTANCE.getAppManager().pullInstances();
     });
   }
 
@@ -339,7 +333,7 @@ public abstract class AbstractServiceRegistry implements ServiceRegistry {
     executorService.execute(() -> {
       LOGGER.warn("receive SafeModeChangeEvent, current mode={}", modeChangeEvent.getCurrentMode());
       serviceRegistryCache.onSafeModeChanged(modeChangeEvent);
-      RegistryUtils.getAppManager().onSafeModeChanged(modeChangeEvent);
+      DiscoveryManager.INSTANCE.getAppManager().onSafeModeChanged(modeChangeEvent);
     });
   }
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/MicroserviceInstanceRegisterTask.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/MicroserviceInstanceRegisterTask.java
index 438fbce..4effbd3 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/MicroserviceInstanceRegisterTask.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/task/MicroserviceInstanceRegisterTask.java
@@ -16,12 +16,12 @@
  */
 package org.apache.servicecomb.serviceregistry.task;
 
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
+import org.apache.servicecomb.serviceregistry.adapter.EnvAdapterManager;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
 import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
-import org.apache.servicecomb.serviceregistry.adapter.EnvAdapterManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.util.StringUtils;
@@ -60,9 +60,9 @@ public class MicroserviceInstanceRegisterTask extends AbstractRegisterTask {
     LOGGER.info("running microservice instance register task.");
     String hostName = "";
     if (serviceRegistryConfig.isPreferIpAddress()) {
-      hostName = RegistryUtils.getPublishAddress();
+      hostName = RegistrationManager.getPublishAddress();
     } else {
-      hostName = RegistryUtils.getPublishHostName();
+      hostName = RegistrationManager.getPublishHostName();
     }
     microserviceInstance.setHostName(hostName);
     microserviceInstance.getHealthCheck().setInterval(serviceRegistryConfig.getHeartbeatInterval());
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistry.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistry.java
index af713bc..ff7b4b6 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistry.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistry.java
@@ -17,8 +17,6 @@
 
 package org.apache.servicecomb.serviceregistry;
 
-import static org.apache.servicecomb.serviceregistry.RegistryUtils.PUBLISH_ADDRESS;
-
 import java.net.InetAddress;
 import java.net.URI;
 import java.nio.charset.StandardCharsets;
@@ -126,20 +124,20 @@ public class TestRegistry {
         result = "1.1.1.1";
       }
     };
-    String address = RegistryUtils.getPublishAddress();
+    String address = RegistrationManager.getPublishAddress();
     Assert.assertEquals("1.1.1.1", address);
 
     new Expectations(DynamicPropertyFactory.getInstance()) {
       {
-        DynamicPropertyFactory.getInstance().getStringProperty(PUBLISH_ADDRESS, "");
-        result = new DynamicStringProperty(PUBLISH_ADDRESS, "") {
+        DynamicPropertyFactory.getInstance().getStringProperty(RegistrationManager.PUBLISH_ADDRESS, "");
+        result = new DynamicStringProperty(RegistrationManager.PUBLISH_ADDRESS, "") {
           public String get() {
             return "127.0.0.1";
           }
         };
       }
     };
-    Assert.assertEquals("127.0.0.1", RegistryUtils.getPublishAddress());
+    Assert.assertEquals("127.0.0.1", RegistrationManager.getPublishAddress());
 
     new Expectations(DynamicPropertyFactory.getInstance()) {
       {
@@ -147,15 +145,15 @@ public class TestRegistry {
         result = "1.1.1.1";
         NetUtils.ensureGetInterfaceAddress("eth100");
         result = ethAddress;
-        DynamicPropertyFactory.getInstance().getStringProperty(PUBLISH_ADDRESS, "");
-        result = new DynamicStringProperty(PUBLISH_ADDRESS, "") {
+        DynamicPropertyFactory.getInstance().getStringProperty(RegistrationManager.PUBLISH_ADDRESS, "");
+        result = new DynamicStringProperty(RegistrationManager.PUBLISH_ADDRESS, "") {
           public String get() {
             return "{eth100}";
           }
         };
       }
     };
-    Assert.assertEquals("1.1.1.1", RegistryUtils.getPublishAddress());
+    Assert.assertEquals("1.1.1.1", RegistrationManager.getPublishAddress());
   }
 
   @Test
@@ -166,11 +164,11 @@ public class TestRegistry {
         result = "testHostName";
       }
     };
-    String host = RegistryUtils.getPublishHostName();
+    String host = RegistrationManager.getPublishHostName();
     Assert.assertEquals("testHostName", host);
 
-    inMemoryConfig.addProperty(PUBLISH_ADDRESS, "127.0.0.1");
-    Assert.assertEquals("127.0.0.1", RegistryUtils.getPublishHostName());
+    inMemoryConfig.addProperty(RegistrationManager.PUBLISH_ADDRESS, "127.0.0.1");
+    Assert.assertEquals("127.0.0.1", RegistrationManager.getPublishHostName());
 
     new Expectations(DynamicPropertyFactory.getInstance()) {
       {
@@ -180,8 +178,8 @@ public class TestRegistry {
         result = ethAddress;
       }
     };
-    inMemoryConfig.addProperty(PUBLISH_ADDRESS, "{eth100}");
-    Assert.assertEquals("testHostName", RegistryUtils.getPublishHostName());
+    inMemoryConfig.addProperty(RegistrationManager.PUBLISH_ADDRESS, "{eth100}");
+    Assert.assertEquals("testHostName", RegistrationManager.getPublishHostName());
   }
 
   @Test
@@ -193,23 +191,23 @@ public class TestRegistry {
       }
     };
 
-    Assert.assertEquals("rest://172.0.0.0:8080", RegistryUtils.getPublishAddress("rest", "172.0.0.0:8080"));
-    Assert.assertNull(RegistryUtils.getPublishAddress("rest", null));
+    Assert.assertEquals("rest://172.0.0.0:8080", RegistrationManager.getPublishAddress("rest", "172.0.0.0:8080"));
+    Assert.assertNull(RegistrationManager.getPublishAddress("rest", null));
 
-    URI uri = new URI(RegistryUtils.getPublishAddress("rest", "0.0.0.0:8080"));
+    URI uri = new URI(RegistrationManager.getPublishAddress("rest", "0.0.0.0:8080"));
     Assert.assertEquals("1.1.1.1:8080", uri.getAuthority());
 
     new Expectations(DynamicPropertyFactory.getInstance()) {
       {
-        DynamicPropertyFactory.getInstance().getStringProperty(PUBLISH_ADDRESS, "");
-        result = new DynamicStringProperty(PUBLISH_ADDRESS, "") {
+        DynamicPropertyFactory.getInstance().getStringProperty(RegistrationManager.PUBLISH_ADDRESS, "");
+        result = new DynamicStringProperty(RegistrationManager.PUBLISH_ADDRESS, "") {
           public String get() {
             return "1.1.1.1";
           }
         };
       }
     };
-    Assert.assertEquals("rest://1.1.1.1:8080", RegistryUtils.getPublishAddress("rest", "172.0.0.0:8080"));
+    Assert.assertEquals("rest://1.1.1.1:8080", RegistrationManager.getPublishAddress("rest", "172.0.0.0:8080"));
 
     InetAddress ethAddress = Mockito.mock(InetAddress.class);
     Mockito.when(ethAddress.getHostAddress()).thenReturn("1.1.1.1");
@@ -217,8 +215,8 @@ public class TestRegistry {
       {
         NetUtils.ensureGetInterfaceAddress("eth20");
         result = ethAddress;
-        DynamicPropertyFactory.getInstance().getStringProperty(PUBLISH_ADDRESS, "");
-        result = new DynamicStringProperty(PUBLISH_ADDRESS, "") {
+        DynamicPropertyFactory.getInstance().getStringProperty(RegistrationManager.PUBLISH_ADDRESS, "");
+        result = new DynamicStringProperty(RegistrationManager.PUBLISH_ADDRESS, "") {
           public String get() {
             return "{eth20}";
           }
@@ -228,6 +226,6 @@ public class TestRegistry {
     String query = URLEncodedUtils.format(Collections.singletonList(new BasicNameValuePair("country", "中 国")),
         StandardCharsets.UTF_8.name());
     Assert.assertEquals("rest://1.1.1.1:8080?" + query,
-        RegistryUtils.getPublishAddress("rest", "172.0.0.0:8080?" + query));
+        RegistrationManager.getPublishAddress("rest", "172.0.0.0:8080?" + query));
   }
 }
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java
index 183a123..31535af 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/TestRegistryBase.java
@@ -34,7 +34,7 @@ import mockit.Mock;
 import mockit.MockUp;
 
 public class TestRegistryBase {
-  private AppManager originalAppManager = RegistryUtils.getAppManager();
+  private AppManager originalAppManager = DiscoveryManager.INSTANCE.getAppManager();
 
   protected ServiceRegistry serviceRegistry;
 
@@ -72,11 +72,11 @@ public class TestRegistryBase {
 
     Deencapsulation.setField(RegistryUtils.class, "appManager", new AppManager());
 
-    appManager = RegistryUtils.getAppManager();
+    appManager = DiscoveryManager.INSTANCE.getAppManager();
     microserviceManager = appManager.getOrCreateMicroserviceManager(appId);
     eventBus = serviceRegistry.getEventBus();
 
-    RegistryUtils.getSwaggerLoader().registerSwagger(appId, serviceName, schemaId, Hello.class);
+    RegistrationManager.INSTANCE.getSwaggerLoader().registerSwagger(appId, serviceName, schemaId, Hello.class);
 
     RegistryUtils.setServiceRegistry(serviceRegistry);
 
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/config/TestConfigurePropertyUtils.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/config/TestConfigurePropertyUtils.java
index ac4dcb3..f6bd52f 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/config/TestConfigurePropertyUtils.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/config/TestConfigurePropertyUtils.java
@@ -23,16 +23,18 @@ import java.util.Map;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.servicecomb.config.ConfigUtil;
+import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.deployment.Deployment;
 import org.apache.servicecomb.serviceregistry.api.Const;
 import org.apache.servicecomb.serviceregistry.api.registry.BasePath;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class TestConfigurePropertyUtils {
   @Test
   public void testGetPropertiesWithPrefix() {
-    Deployment.clearClassLoaderScopeProperty();
+    SCBEngine.clearClassLoaderScopeProperty();
     Configuration configuration = ConfigUtil.createLocalConfig();
 
     String prefix = "service_description.properties";
@@ -46,11 +48,11 @@ public class TestConfigurePropertyUtils {
     Assert.assertEquals(paths.get(0).getPath(), "/test1/testpath");
     Assert.assertEquals(paths.get(0).getProperty().get("checksession"), false);
 
-    Deployment.setClassLoaderScopeProperty(Const.URL_PREFIX, "/webroot");
+    SCBEngine.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, "/webroot");
     paths = ConfigurePropertyUtils.getMicroservicePaths(configuration);
     Assert.assertEquals(2, paths.size());
     Assert.assertEquals(paths.get(0).getPath(), "/webroot/test1/testpath");
     Assert.assertEquals(paths.get(0).getProperty().get("checksession"), false);
-    Deployment.clearClassLoaderScopeProperty();
+    SCBEngine.clearClassLoaderScopeProperty();
   }
 }
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckTask.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckTask.java
index 2a792d7..8f39c1f 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckTask.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckTask.java
@@ -24,7 +24,6 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
-import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -37,11 +36,8 @@ import io.vertx.core.json.Json;
 import mockit.Deencapsulation;
 import mockit.Mock;
 import mockit.MockUp;
-import mockit.Mocked;
 
 public class TestInstanceCacheCheckTask {
-  @Mocked
-  AppManager appManager;
 
   ScheduledThreadPoolExecutor taskPool = new ScheduledThreadPoolExecutor(2,
       task -> new Thread(task, "Service Center Task test thread"),
@@ -55,7 +51,6 @@ public class TestInstanceCacheCheckTask {
 
   @Before
   public void setUp() {
-    task.setAppManager(appManager);
     task.setTaskPool(taskPool);
     task.setEventBus(eventBus);
     task.setTimeUnit(TimeUnit.MILLISECONDS);
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerMock.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerMock.java
index 8df0ebb..e2f8af1 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerMock.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerMock.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.common.testing.MockClock;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
@@ -46,7 +47,7 @@ import mockit.MockUp;
 public class TestInstanceCacheCheckerMock {
   private static final Logger LOGGER = LoggerFactory.getLogger(TestInstanceCacheCheckerWithoutMock.class);
 
-  AppManager originalAppManager = RegistryUtils.getAppManager();
+  AppManager originalAppManager = DiscoveryManager.INSTANCE.getAppManager();
 
   ServiceRegistry serviceRegistry = ServiceRegistryFactory.createLocal();
 
@@ -65,7 +66,7 @@ public class TestInstanceCacheCheckerMock {
     serviceRegistry.init();
     RegistryUtils.setServiceRegistry(serviceRegistry);
 
-    checker = new InstanceCacheChecker(RegistryUtils.getAppManager());
+    checker = new InstanceCacheChecker(DiscoveryManager.INSTANCE.getAppManager());
     checker.clock = new MockClock(new Holder<>(1L));
     expectedSummary.setStatus(Status.NORMAL);
     expectedSummary.setTimestamp(1);
@@ -73,8 +74,7 @@ public class TestInstanceCacheCheckerMock {
 
   @After
   public void tearDown() throws Exception {
-    Deencapsulation.setField(RegistryUtils.class, "appManager", originalAppManager);
-    RegistryUtils.setServiceRegistry(null);
+
   }
 
   private Holder<MicroserviceInstances> createFindServiceInstancesResult() {
@@ -113,7 +113,7 @@ public class TestInstanceCacheCheckerMock {
 
     registerMicroservice(appId, microserviceName);
 
-    RegistryUtils.getAppManager()
+    DiscoveryManager.INSTANCE.getAppManager()
         .getOrCreateMicroserviceVersionRule(appId, microserviceName, DefinitionConst.VERSION_RULE_ALL);
 
     findHolder.value = null;
@@ -150,7 +150,7 @@ public class TestInstanceCacheCheckerMock {
 
     registerMicroservice(appId, microserviceName);
 
-    RegistryUtils.getAppManager()
+    DiscoveryManager.INSTANCE.getAppManager()
         .getOrCreateMicroserviceVersionRule(appId, microserviceName, DefinitionConst.VERSION_RULE_ALL);
 
     findHolder.value.setMicroserviceNotExist(true);
@@ -187,7 +187,7 @@ public class TestInstanceCacheCheckerMock {
 
     registerMicroservice(appId, microserviceName);
 
-    RegistryUtils.getAppManager()
+    DiscoveryManager.INSTANCE.getAppManager()
         .getOrCreateMicroserviceVersionRule(appId, microserviceName, DefinitionConst.VERSION_RULE_ALL);
 
     findHolder.value.setRevision("second");
@@ -220,7 +220,7 @@ public class TestInstanceCacheCheckerMock {
 
     registerMicroservice(appId, microserviceName);
 
-    MicroserviceVersions microserviceVersions = RegistryUtils.getAppManager()
+    MicroserviceVersions microserviceVersions = DiscoveryManager.INSTANCE.getAppManager()
         .getOrCreateMicroserviceVersions(appId, microserviceName);
     microserviceVersions.setRevision("first");
     microserviceVersions.getOrCreateMicroserviceVersionRule(DefinitionConst.VERSION_RULE_ALL);
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerWithoutMock.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerWithoutMock.java
index 6edc0b2..fe05c6f 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerWithoutMock.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/diagnosis/instance/TestInstanceCacheCheckerWithoutMock.java
@@ -20,6 +20,7 @@ import java.util.Arrays;
 
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.common.testing.MockClock;
+import org.apache.servicecomb.serviceregistry.DiscoveryManager;
 import org.apache.servicecomb.serviceregistry.RegistryUtils;
 import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 import org.apache.servicecomb.serviceregistry.consumer.AppManager;
@@ -40,7 +41,7 @@ import mockit.Deencapsulation;
 public class TestInstanceCacheCheckerWithoutMock {
   private static final Logger LOGGER = LoggerFactory.getLogger(TestInstanceCacheCheckerWithoutMock.class);
 
-  AppManager originalAppManager = RegistryUtils.getAppManager();
+  AppManager originalAppManager = DiscoveryManager.INSTANCE.getAppManager();
 
   ServiceRegistry serviceRegistry = ServiceRegistryFactory.createLocal();
 
@@ -59,7 +60,7 @@ public class TestInstanceCacheCheckerWithoutMock {
     serviceRegistry.init();
     RegistryUtils.setServiceRegistry(serviceRegistry);
 
-    checker = new InstanceCacheChecker(RegistryUtils.getAppManager());
+    checker = new InstanceCacheChecker(DiscoveryManager.INSTANCE.getAppManager());
     checker.clock = new MockClock(new Holder<>(1L));
     expectedSummary.setStatus(Status.NORMAL);
     expectedSummary.setTimestamp(1);
@@ -82,7 +83,7 @@ public class TestInstanceCacheCheckerWithoutMock {
   public void check_microserviceManager_empty() {
     try {
       appId = "notExist";
-      RegistryUtils.getAppManager().getOrCreateMicroserviceVersions(appId, microserviceName);
+      DiscoveryManager.INSTANCE.getAppManager().getOrCreateMicroserviceVersions(appId, microserviceName);
       InstanceCacheSummary instanceCacheSummary = checker.check();
       Assert.assertEquals(Json.encode(expectedSummary), Json.encode(instanceCacheSummary));
     } catch (Exception e) {
@@ -99,7 +100,7 @@ public class TestInstanceCacheCheckerWithoutMock {
         Arrays.asList("rest://localhost:8080"),
         ThirdPartyServiceForUT.class);
 
-    MicroserviceVersionRule microserviceVersionRule = RegistryUtils.getAppManager()
+    MicroserviceVersionRule microserviceVersionRule = DiscoveryManager.INSTANCE.getAppManager()
         .getOrCreateMicroserviceVersionRule(appId, microserviceName, DefinitionConst.VERSION_RULE_ALL);
     Assert.assertEquals(microserviceName, microserviceVersionRule.getLatestMicroserviceVersion().getMicroserviceName());
 
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/registry/EmptyMockServiceRegistry.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/registry/EmptyMockServiceRegistry.java
index d14532e..f30443b 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/registry/EmptyMockServiceRegistry.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/registry/EmptyMockServiceRegistry.java
@@ -21,7 +21,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.servicecomb.serviceregistry.Features;
 import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
@@ -121,11 +120,6 @@ public class EmptyMockServiceRegistry implements ServiceRegistry {
   }
 
   @Override
-  public Features getFeatures() {
-    return null;
-  }
-
-  @Override
   public void registerMicroserviceMapping(String microserviceName, String version, List<MicroserviceInstance> instances,
       Class<?> schemaIntfCls) {
 
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/swagger/TestSwaggerLoader.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/swagger/TestSwaggerLoader.java
index 48623f0..1fe9309 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/swagger/TestSwaggerLoader.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/swagger/TestSwaggerLoader.java
@@ -40,7 +40,7 @@ import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.utils.JvmUtils;
 import org.apache.servicecomb.foundation.common.utils.ResourceUtil;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.RegistrationManager;
 import org.apache.servicecomb.serviceregistry.TestRegistryBase;
 import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
 import org.apache.servicecomb.swagger.SwaggerUtils;
@@ -63,11 +63,11 @@ public class TestSwaggerLoader extends TestRegistryBase {
   @Test
   public void registerSwagger() {
     Swagger swagger = SwaggerGenerator.generate(Hello.class);
-    RegistryUtils.getSwaggerLoader().registerSwagger("default:ms2", schemaId, swagger);
+    RegistrationManager.INSTANCE.getSwaggerLoader().registerSwagger("default:ms2", schemaId, swagger);
 
     Microservice microservice = appManager.getOrCreateMicroserviceVersions(appId, serviceName)
         .getVersions().values().iterator().next().getMicroservice();
-    Assert.assertSame(swagger, RegistryUtils.getSwaggerLoader().loadSwagger(microservice, schemaId));
+    Assert.assertSame(swagger, RegistrationManager.INSTANCE.getSwaggerLoader().loadSwagger(microservice, schemaId));
   }
 
   @Test
@@ -80,11 +80,11 @@ public class TestSwaggerLoader extends TestRegistryBase {
       }
     };
 
-    RegistryUtils.getSwaggerLoader().unregisterSwagger(appId, serviceName, schemaId);
+    RegistrationManager.INSTANCE.getSwaggerLoader().unregisterSwagger(appId, serviceName, schemaId);
 
     Microservice microservice = appManager.getOrCreateMicroserviceVersions(appId, serviceName)
         .getVersions().values().iterator().next().getMicroservice();
-    Swagger loadedSwagger = RegistryUtils.getSwaggerLoader().loadSwagger(microservice, schemaId);
+    Swagger loadedSwagger = RegistrationManager.INSTANCE.getSwaggerLoader().loadSwagger(microservice, schemaId);
     Assert.assertNotSame(swagger, loadedSwagger);
     Assert.assertEquals(swagger, loadedSwagger);
   }
@@ -94,11 +94,11 @@ public class TestSwaggerLoader extends TestRegistryBase {
     Swagger swagger = SwaggerGenerator.generate(Hello.class);
     mockLocalResource(swagger, String.format("microservices/%s/%s.yaml", serviceName, schemaId));
 
-    RegistryUtils.getSwaggerLoader().unregisterSwagger(appId, serviceName, schemaId);
+    RegistrationManager.INSTANCE.getSwaggerLoader().unregisterSwagger(appId, serviceName, schemaId);
 
     Microservice microservice = appManager.getOrCreateMicroserviceVersions(appId, serviceName)
         .getVersions().values().iterator().next().getMicroservice();
-    Swagger loadedSwagger = RegistryUtils.getSwaggerLoader().loadSwagger(microservice, schemaId);
+    Swagger loadedSwagger = RegistrationManager.INSTANCE.getSwaggerLoader().loadSwagger(microservice, schemaId);
     Assert.assertNotSame(swagger, loadedSwagger);
     Assert.assertEquals(swagger, loadedSwagger);
   }
@@ -108,11 +108,11 @@ public class TestSwaggerLoader extends TestRegistryBase {
     Swagger swagger = SwaggerGenerator.generate(Hello.class);
     mockLocalResource(swagger, String.format("applications/%s/%s/%s.yaml", appId, serviceName, schemaId));
 
-    RegistryUtils.getSwaggerLoader().unregisterSwagger(appId, serviceName, schemaId);
+    RegistrationManager.INSTANCE.getSwaggerLoader().unregisterSwagger(appId, serviceName, schemaId);
 
     Microservice microservice = appManager.getOrCreateMicroserviceVersions(appId, serviceName)
         .getVersions().values().iterator().next().getMicroservice();
-    Swagger loadedSwagger = RegistryUtils.getSwaggerLoader().loadSwagger(microservice, schemaId);
+    Swagger loadedSwagger = RegistrationManager.INSTANCE.getSwaggerLoader().loadSwagger(microservice, schemaId);
     Assert.assertNotSame(swagger, loadedSwagger);
     Assert.assertEquals(swagger, loadedSwagger);
   }
@@ -128,7 +128,7 @@ public class TestSwaggerLoader extends TestRegistryBase {
     expectedException.expect(IllegalStateException.class);
     expectedException.expectMessage(
         "no schema in local, and can not get schema from service center, appId=other, microserviceName=ms3, version=1.0, serviceId=003, schemaId=hello.");
-    RegistryUtils.getSwaggerLoader().loadSwagger(microservice, schemaId);
+    RegistrationManager.INSTANCE.getSwaggerLoader().loadSwagger(microservice, schemaId);
   }
 
   @Test
@@ -138,7 +138,7 @@ public class TestSwaggerLoader extends TestRegistryBase {
 
     Microservice microservice = appManager.getOrCreateMicroserviceVersions("other", "ms3")
         .getVersions().values().iterator().next().getMicroservice();
-    Swagger loadedSwagger = RegistryUtils.getSwaggerLoader().loadSwagger(microservice, schemaId);
+    Swagger loadedSwagger = RegistrationManager.INSTANCE.getSwaggerLoader().loadSwagger(microservice, schemaId);
     Assert.assertNotSame(swagger, loadedSwagger);
     Assert.assertEquals(swagger, loadedSwagger);
   }
@@ -196,16 +196,16 @@ public class TestSwaggerLoader extends TestRegistryBase {
 
   @Test
   public void should_ignore_not_exist_location_when_register_swagger_in_location() {
-    Map<String, Object> apps = Deencapsulation.getField(RegistryUtils.getSwaggerLoader(), "apps");
+    Map<String, Object> apps = Deencapsulation.getField(RegistrationManager.INSTANCE.getSwaggerLoader(), "apps");
     apps.clear();
-    RegistryUtils.getSwaggerLoader().registerSwaggersInLocation("notExistPath");
+    RegistrationManager.INSTANCE.getSwaggerLoader().registerSwaggersInLocation("notExistPath");
     assertThat(apps).isEmpty();
   }
 
   @Test
   public void should_ignore_non_yaml_file_when_register_swagger_in_location() {
-    RegistryUtils.getSwaggerLoader().registerSwaggersInLocation("swagger-del");
-    assertThat(RegistryUtils.getSwaggerLoader().loadFromMemory(appId, serviceName, "other")).isNull();
+    RegistrationManager.INSTANCE.getSwaggerLoader().registerSwaggersInLocation("swagger-del");
+    assertThat(RegistrationManager.INSTANCE.getSwaggerLoader().loadFromMemory(appId, serviceName, "other")).isNull();
   }
 
   @Test
@@ -249,12 +249,12 @@ public class TestSwaggerLoader extends TestRegistryBase {
       }
     };
 
-    RegistryUtils.getSwaggerLoader().registerSwaggersInLocation("location");
+    RegistrationManager.INSTANCE.getSwaggerLoader().registerSwaggersInLocation("location");
   }
 
   @Test
   public void should_correct_register_swagger_in_location() {
-    RegistryUtils.getSwaggerLoader().registerSwaggersInLocation("swagger-del");
-    assertThat(RegistryUtils.getSwaggerLoader().loadFromMemory(appId, serviceName, "hello")).isNotNull();
+    RegistrationManager.INSTANCE.getSwaggerLoader().registerSwaggersInLocation("swagger-del");
+    assertThat(RegistrationManager.INSTANCE.getSwaggerLoader().loadFromMemory(appId, serviceName, "hello")).isNotNull();
   }
 }
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceInstanceRegisterTask.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceInstanceRegisterTask.java
index 897e409..ff7119a 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceInstanceRegisterTask.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/task/TestMicroserviceInstanceRegisterTask.java
@@ -90,8 +90,6 @@ public class TestMicroserviceInstanceRegisterTask {
     MicroserviceInstance instance = microservice.getInstance();
     new Expectations(RegistryUtils.class) {
       {
-        RegistryUtils.getPublishAddress();
-        result = "127.0.0.1";
         serviceRegistryConfig.isPreferIpAddress();
         result = true;
         serviceRegistryConfig.getHeartbeatInterval();
@@ -120,8 +118,6 @@ public class TestMicroserviceInstanceRegisterTask {
     MicroserviceInstance instance = microservice.getInstance();
     new Expectations(RegistryUtils.class) {
       {
-        RegistryUtils.getPublishHostName();
-        result = "hostName";
         serviceRegistryConfig.isPreferIpAddress();
         result = false;
         serviceRegistryConfig.getHeartbeatInterval();
@@ -150,8 +146,6 @@ public class TestMicroserviceInstanceRegisterTask {
     MicroserviceInstance instance = microservice.getInstance();
     new Expectations(RegistryUtils.class) {
       {
-        RegistryUtils.getPublishAddress();
-        result = "127.0.0.1";
         serviceRegistryConfig.isPreferIpAddress();
         result = true;
         serviceRegistryConfig.getHeartbeatInterval();
diff --git a/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayCodec.java b/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayCodec.java
index 55f29d9..a990eca 100644
--- a/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayCodec.java
+++ b/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayCodec.java
@@ -32,9 +32,6 @@ import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.definition.SchemaMeta;
 import org.apache.servicecomb.foundation.vertx.server.TcpParser;
 import org.apache.servicecomb.foundation.vertx.tcp.TcpOutputStream;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.ServiceRegistry;
-import org.apache.servicecomb.serviceregistry.registry.ServiceRegistryFactory;
 import org.apache.servicecomb.transport.highway.message.RequestHeader;
 import org.junit.After;
 import org.junit.Assert;
@@ -75,9 +72,6 @@ public class TestHighwayCodec {
 
   @Before
   public void setUp() {
-    ServiceRegistry serviceRegistry = ServiceRegistryFactory.createLocal();
-    serviceRegistry.init();
-    RegistryUtils.setServiceRegistry(serviceRegistry);
 
     operationProtobuf = Mockito.mock(OperationProtobuf.class);
 
diff --git a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/RestClientInvocation.java b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/RestClientInvocation.java
index 97bdd55..ef362fe 100644
--- a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/RestClientInvocation.java
+++ b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/http/RestClientInvocation.java
@@ -41,7 +41,7 @@ import org.apache.servicecomb.foundation.vertx.http.ReadStreamPart;
 import org.apache.servicecomb.foundation.vertx.http.VertxClientRequestToHttpServletRequest;
 import org.apache.servicecomb.foundation.vertx.http.VertxClientResponseToHttpServletResponse;
 import org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultHttpSocketMetric;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
@@ -305,7 +305,7 @@ public class RestClientInvocation {
 
   protected String createRequestPath(RestOperationMeta swaggerRestOperation) throws Exception {
     URIEndpointObject address = (URIEndpointObject) invocation.getEndpoint().getAddress();
-    String urlPrefix = address.getFirst(Const.URL_PREFIX);
+    String urlPrefix = address.getFirst(DefinitionConst.URL_PREFIX);
 
     String path = (String) invocation.getHandlerContext().get(RestConst.REST_CLIENT_REQUEST_PATH);
     if (path == null) {
diff --git a/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestRestClientInvocation.java b/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestRestClientInvocation.java
index ebcfe01..a88acb6 100644
--- a/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestRestClientInvocation.java
+++ b/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/http/TestRestClientInvocation.java
@@ -49,7 +49,7 @@ import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector;
 import org.apache.servicecomb.foundation.vertx.client.http.HttpClientWithContext;
 import org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultEndpointMetric;
 import org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultHttpSocketMetric;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
@@ -442,7 +442,7 @@ public class TestRestClientInvocation {
 
   @Test
   public void createRequestPath_NoUrlPrefixNoPath() throws Exception {
-    when(address.getFirst(Const.URL_PREFIX)).thenReturn(null);
+    when(address.getFirst(DefinitionConst.URL_PREFIX)).thenReturn(null);
 
     when(urlPathBuilder.createRequestPath(any())).thenReturn("/path");
 
@@ -453,7 +453,7 @@ public class TestRestClientInvocation {
   @Test
   public void createRequestPath_noUrlPrefixHavePath() throws Exception {
     handlerContext.put(RestConst.REST_CLIENT_REQUEST_PATH, "/client/path");
-    when(address.getFirst(Const.URL_PREFIX)).thenReturn(null);
+    when(address.getFirst(DefinitionConst.URL_PREFIX)).thenReturn(null);
 
     String path = restClientInvocation.createRequestPath(swaggerRestOperation);
     Assert.assertEquals("/client/path", path);
@@ -461,7 +461,7 @@ public class TestRestClientInvocation {
 
   @Test
   public void createRequestPath_haveUrlPrefixNoPath() throws Exception {
-    when(address.getFirst(Const.URL_PREFIX)).thenReturn("/prefix");
+    when(address.getFirst(DefinitionConst.URL_PREFIX)).thenReturn("/prefix");
 
     when(urlPathBuilder.createRequestPath(any())).thenReturn("/path");
 
@@ -471,7 +471,7 @@ public class TestRestClientInvocation {
 
   @Test
   public void createRequestPath_haveUrlPrefixHavePath() throws Exception {
-    when(address.getFirst(Const.URL_PREFIX)).thenReturn("/prefix");
+    when(address.getFirst(DefinitionConst.URL_PREFIX)).thenReturn("/prefix");
     handlerContext.put(RestConst.REST_CLIENT_REQUEST_PATH, "/client/path");
 
     String path = restClientInvocation.createRequestPath(swaggerRestOperation);
@@ -480,7 +480,7 @@ public class TestRestClientInvocation {
 
   @Test
   public void createRequestPath_haveUrlPrefixHavePathAndStartWith() throws Exception {
-    when(address.getFirst(Const.URL_PREFIX)).thenReturn("/prefix");
+    when(address.getFirst(DefinitionConst.URL_PREFIX)).thenReturn("/prefix");
     handlerContext.put(RestConst.REST_CLIENT_REQUEST_PATH, "/prefix/client/path");
 
     String path = restClientInvocation.createRequestPath(swaggerRestOperation);
diff --git a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletRestTransport.java b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletRestTransport.java
index 0c36950..1af687e 100644
--- a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletRestTransport.java
+++ b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletRestTransport.java
@@ -21,9 +21,9 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.transport.AbstractTransport;
-import org.apache.servicecomb.deployment.Deployment;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.apache.servicecomb.transport.rest.client.RestTransportClient;
 import org.apache.servicecomb.transport.rest.client.RestTransportClientManager;
@@ -59,10 +59,10 @@ public class ServletRestTransport extends AbstractTransport {
 
   @Override
   public boolean init() {
-    String urlPrefix = Deployment.getClassLoaderScopeProperty(Const.URL_PREFIX);
+    String urlPrefix = SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX);
     Map<String, String> queryMap = new HashMap<>();
     if (!StringUtils.isEmpty(urlPrefix)) {
-      queryMap.put(Const.URL_PREFIX, urlPrefix);
+      queryMap.put(DefinitionConst.URL_PREFIX, urlPrefix);
     }
 
     String listenAddress = ServletConfig.getLocalServerAddress();
diff --git a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java
index 98f5830..c4418d9 100644
--- a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java
+++ b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java
@@ -29,11 +29,11 @@ import javax.servlet.ServletRegistration;
 import javax.servlet.ServletRegistration.Dynamic;
 
 import org.apache.servicecomb.common.rest.UploadConfig;
-import org.apache.servicecomb.deployment.Deployment;
+import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.foundation.common.net.NetUtils;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.util.StringUtils;
@@ -133,7 +133,7 @@ public class ServletUtils {
       return;
     }
 
-    Deployment.setClassLoaderScopeProperty(Const.URL_PREFIX, urlPrefix);
+    SCBEngine.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, urlPrefix);
     LOGGER.info("UrlPrefix of this instance is \"{}\".", urlPrefix);
   }
 
diff --git a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestTransport.java b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestTransport.java
index a6a3a4b..95872ca 100644
--- a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestTransport.java
+++ b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletRestTransport.java
@@ -20,11 +20,8 @@ package org.apache.servicecomb.transport.rest.servlet;
 import java.io.IOException;
 import java.net.ServerSocket;
 
-import org.apache.servicecomb.deployment.Deployment;
-import org.apache.servicecomb.serviceregistry.Features;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.ServiceRegistry;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.core.SCBEngine;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.apache.servicecomb.transport.rest.client.RestTransportClient;
 import org.apache.servicecomb.transport.rest.client.RestTransportClientManager;
 import org.junit.After;
@@ -41,7 +38,7 @@ public class TestServletRestTransport {
 
   @After
   public void tearDown() {
-    Deployment.clearClassLoaderScopeProperty();
+    SCBEngine.clearClassLoaderScopeProperty();
   }
 
   @Test
@@ -83,17 +80,7 @@ public class TestServletRestTransport {
   }
 
   @Test
-  public void testInitPublishWithUrlPrefix(@Mocked RestTransportClient restTransportClient,
-      @Mocked ServiceRegistry serviceRegistry) {
-    Features features = new Features();
-    new Expectations(RegistryUtils.class) {
-      {
-        RegistryUtils.getServiceRegistry();
-        result = serviceRegistry;
-        serviceRegistry.getFeatures();
-        result = features;
-      }
-    };
+  public void testInitPublishWithUrlPrefix(@Mocked RestTransportClient restTransportClient) {
 
     new MockUp<RestTransportClientManager>() {
       @Mock
@@ -108,7 +95,7 @@ public class TestServletRestTransport {
         result = "1.1.1.1:1234";
       }
     };
-    Deployment.setClassLoaderScopeProperty(Const.URL_PREFIX, "/root");
+    SCBEngine.setClassLoaderScopeProperty(DefinitionConst.URL_PREFIX, "/root");
 
     Assert.assertTrue(transport.init());
     Assert.assertEquals("rest://1.1.1.1:1234?urlPrefix=/root", transport.getPublishEndpoint().getEndpoint());
diff --git a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java
index 8eb0f26..d36f16b 100644
--- a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java
+++ b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java
@@ -36,10 +36,10 @@ import javax.servlet.ServletRegistration.Dynamic;
 import javax.servlet.http.HttpServlet;
 
 import org.apache.servicecomb.common.rest.RestConst;
-import org.apache.servicecomb.deployment.Deployment;
+import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
-import org.apache.servicecomb.serviceregistry.api.Const;
+import org.apache.servicecomb.serviceregistry.definition.DefinitionConst;
 import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.Assert;
@@ -175,18 +175,18 @@ public class TestServletUtils {
 
   @Test
   public void testSaveUrlPrefixNull(@Mocked ServletContext servletContext) {
-    Deployment.clearClassLoaderScopeProperty();
+    SCBEngine.clearClassLoaderScopeProperty();
 
     ServletUtils.saveUrlPrefix(servletContext);
 
-    Assert.assertNull(Deployment.getClassLoaderScopeProperty(Const.URL_PREFIX));
-    Deployment.clearClassLoaderScopeProperty();
+    Assert.assertNull(SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX));
+    SCBEngine.clearClassLoaderScopeProperty();
   }
 
   @Test
   public void testSaveUrlPrefixNormal(@Mocked ServletContext servletContext,
       @Mocked ServletRegistration servletRegistration) {
-    Deployment.clearClassLoaderScopeProperty();
+    SCBEngine.clearClassLoaderScopeProperty();
     new Expectations() {
       {
         servletContext.getContextPath();
@@ -202,8 +202,8 @@ public class TestServletUtils {
 
     ServletUtils.saveUrlPrefix(servletContext);
 
-    Assert.assertThat(Deployment.getClassLoaderScopeProperty(Const.URL_PREFIX), Matchers.is("/root/rest"));
-    Deployment.clearClassLoaderScopeProperty();
+    Assert.assertThat(SCBEngine.getClassLoaderScopeProperty(DefinitionConst.URL_PREFIX), Matchers.is("/root/rest"));
+    SCBEngine.clearClassLoaderScopeProperty();
   }
 
   @Test


[servicecomb-java-chassis] 07/09: [SCB-1876] part-7: fix get versions may be different in windows and linux

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 5145610c63303cdc2d5e52d57f8e35ecff295c0c
Author: liubao <bi...@qq.com>
AuthorDate: Wed May 13 19:09:14 2020 +0800

    [SCB-1876] part-7: fix get versions may be different in windows and linux
---
 .../serviceregistry/api/registry/TestFrameworkVersions.java           | 4 +++-
 .../serviceregistry/api/registry/TestServiceCombVersion.java          | 4 +++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/api/registry/TestFrameworkVersions.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/api/registry/TestFrameworkVersions.java
index e0dde1a..7af3d09 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/api/registry/TestFrameworkVersions.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/api/registry/TestFrameworkVersions.java
@@ -23,6 +23,8 @@ import org.junit.Test;
 public class TestFrameworkVersions {
   @Test
   public void testFrameworkVersions() {
-    Assert.assertEquals("ServiceComb:null", FrameworkVersions.allVersions());
+    // this.getClass().getPackage().getImplementationVersion()
+    // is not stable, may get null or 2.0.1-SNAPSHOT
+    Assert.assertTrue(FrameworkVersions.allVersions().contains("ServiceComb"));
   }
 }
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/api/registry/TestServiceCombVersion.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/api/registry/TestServiceCombVersion.java
index 62e722c..6ceac65 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/api/registry/TestServiceCombVersion.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/api/registry/TestServiceCombVersion.java
@@ -25,6 +25,8 @@ public class TestServiceCombVersion {
   @Test
   public void testServiceCombVersion() {
     ServiceCombVersion version = new ServiceCombVersion();
-    Assert.assertEquals("{ServiceComb=null}", version.loadVersion().toString());
+    // this.getClass().getPackage().getImplementationVersion()
+    // is not stable, may get null or 2.0.1-SNAPSHOT
+    Assert.assertTrue(version.loadVersion().toString().contains("ServiceComb"));
   }
 }