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:28 UTC

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

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