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/12/26 08:42:53 UTC

[servicecomb-java-chassis] branch 1.3.x updated: [SCB-2167]isolation recovery should be immediatly after success (#2172)

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

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


The following commit(s) were added to refs/heads/1.3.x by this push:
     new 5959cb4  [SCB-2167]isolation recovery should be immediatly after success (#2172)
5959cb4 is described below

commit 5959cb4ac1d8d148160275fa6fa1ff1792fb23b0
Author: bao liu <bi...@qq.com>
AuthorDate: Sat Dec 26 16:42:43 2020 +0800

    [SCB-2167]isolation recovery should be immediatly after success (#2172)
---
 .../core/filter/EndpointDiscoveryFilter.java       |  5 +-
 .../core/filter/TestEndpointDiscoveryFilter.java   |  4 +-
 .../servicecomb/loadbalance/Configuration.java     |  8 +++
 .../loadbalance/ServiceCombLoadBalancerStats.java  | 35 ++++-------
 .../servicecomb/loadbalance/ServiceCombServer.java | 13 +++-
 .../loadbalance/ServiceCombServerStats.java        | 70 ++++++++++++++--------
 .../loadbalance/event/IsolationServerEvent.java    |  2 +-
 .../filter/IsolationDiscoveryFilter.java           |  5 +-
 .../loadbalance/filter/ServerDiscoveryFilter.java  |  9 ++-
 .../loadbalance/TestLoadBalanceCreator.java        | 16 ++---
 .../loadbalance/TestLoadBalanceHandler2.java       | 16 ++---
 .../loadbalance/TestLoadbalanceHandler.java        |  6 +-
 .../TestServiceCombLoadBalancerStats.java          | 10 ++--
 .../loadbalance/TestServiceCombServer.java         |  6 +-
 .../loadbalance/TestServiceCombServerStats.java    | 10 ++--
 .../loadbalance/TestSessionSticknessRule.java      |  8 +--
 .../filter/IsolationDiscoveryFilterTest.java       | 10 ++--
 .../filter/TestServerDiscoveryFilter.java          | 14 ++++-
 .../ScbRibbonEndpointDiscoveryFilter.java          |  2 +-
 .../ScbRibbonEndpointDiscoveryFilter.java          |  3 +-
 .../discovery/AbstractEndpointDiscoveryFilter.java |  5 +-
 .../TestAbstractTransportDiscoveryFilter.java      |  3 +-
 22 files changed, 153 insertions(+), 107 deletions(-)

diff --git a/core/src/main/java/org/apache/servicecomb/core/filter/EndpointDiscoveryFilter.java b/core/src/main/java/org/apache/servicecomb/core/filter/EndpointDiscoveryFilter.java
index d05c59d..31724eb 100644
--- a/core/src/main/java/org/apache/servicecomb/core/filter/EndpointDiscoveryFilter.java
+++ b/core/src/main/java/org/apache/servicecomb/core/filter/EndpointDiscoveryFilter.java
@@ -33,7 +33,7 @@ public class EndpointDiscoveryFilter extends AbstractEndpointDiscoveryFilter {
 
   @Override
   public int getOrder() {
-    return (int) Short.MAX_VALUE;
+    return Short.MAX_VALUE;
   }
 
   @Override
@@ -43,7 +43,8 @@ public class EndpointDiscoveryFilter extends AbstractEndpointDiscoveryFilter {
   }
 
   @Override
-  protected Object createEndpoint(String transportName, String endpoint, MicroserviceInstance instance) {
+  protected Object createEndpoint(DiscoveryContext context, String transportName, String endpoint,
+      MicroserviceInstance instance) {
     Transport transport = CseContext.getInstance().getTransportManager().findTransport(transportName);
     if (transport == null) {
       LOGGER.info("not deployed transport {}, ignore {}.", transportName, endpoint);
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 2c443be..81ea097 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
@@ -81,7 +81,7 @@ public class TestEndpointDiscoveryFilter {
       }
     };
 
-    Assert.assertNull(filter.createEndpoint(Const.RESTFUL, "", null));
+    Assert.assertNull(filter.createEndpoint(null, Const.RESTFUL, "", null));
   }
 
   @Test
@@ -98,7 +98,7 @@ public class TestEndpointDiscoveryFilter {
       }
     };
 
-    Endpoint ep = (Endpoint) filter.createEndpoint(Const.RESTFUL, endpoint, instance);
+    Endpoint ep = (Endpoint) filter.createEndpoint(null, Const.RESTFUL, endpoint, instance);
     Assert.assertSame(transport, ep.getTransport());
     Assert.assertSame(address, ep.getAddress());
     Assert.assertSame(instance, ep.getMicroserviceInstance());
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/Configuration.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/Configuration.java
index 905d09d..f7b57d4 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/Configuration.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/Configuration.java
@@ -63,6 +63,7 @@ public final class Configuration {
   public static final String FILTER_ERROR_PERCENTAGE = "errorThresholdPercentage";
 
   public static final String FILTER_ENABLE_REQUEST = "enableRequestThreshold";
+  public static final String FILTER_RECOVER_IMMEDIATELY_WHEN_SUCCESS = "recoverImmediatelyWhenSuccess";
 
   public static final String FILTER_SINGLE_TEST = "singleTestTime";
 
@@ -241,6 +242,13 @@ public final class Configuration {
     }
   }
 
+  public boolean isRecoverImmediatelyWhenSuccess(String microservice) {
+    String p = getStringProperty("true",
+        PROP_ROOT + microservice + "." + FILTER_ISOLATION + FILTER_RECOVER_IMMEDIATELY_WHEN_SUCCESS,
+        PROP_ROOT + FILTER_ISOLATION + FILTER_RECOVER_IMMEDIATELY_WHEN_SUCCESS);
+    return Boolean.parseBoolean(p);
+  }
+
   public Map<String, String> getFlowsplitFilterOptions(String microservice) {
     String keyPrefix = String.format(TRANSACTIONCONTROL_OPTIONS_PREFIX_PATTERN, microservice);
     return ConfigurePropertyUtils.getPropertiesWithPrefix(keyPrefix);
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
index b724cf9..95dc9b0 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombLoadBalancerStats.java
@@ -108,23 +108,14 @@ public class ServiceCombLoadBalancerStats {
     return serviceCombServers.get(instance.getInstanceId());
   }
 
-  public ServiceCombServer getServiceCombServerOld(MicroserviceInstance instance) {
-    for (ServiceCombServer server : serverStatsCache.asMap().keySet()) {
-      if (server.getInstance().equals(instance)) {
-        return server;
-      }
-    }
-    return null;
-  }
-
   @VisibleForTesting
   void setServerExpireInSeconds(int sec) {
     this.serverExpireInSeconds = sec;
   }
 
   @VisibleForTesting
-  void setTimerIntervalInMillis(int milis) {
-    this.timerIntervalInMillis = milis;
+  void setTimerIntervalInMillis(int millis) {
+    this.timerIntervalInMillis = millis;
   }
 
   @VisibleForTesting
@@ -141,23 +132,23 @@ public class ServiceCombLoadBalancerStats {
       serverStatsCache.cleanUp();
     }
 
+    pingView.clear();
+
     serverStatsCache =
         CacheBuilder.newBuilder()
             .expireAfterAccess(serverExpireInSeconds, TimeUnit.SECONDS)
-            .removalListener(new RemovalListener<ServiceCombServer, ServiceCombServerStats>() {
-              @Override
-              public void onRemoval(RemovalNotification<ServiceCombServer, ServiceCombServerStats> notification) {
-                ServiceCombServer server = notification.getKey();
-                LOGGER.info("stats of instance {} removed. host is {}",
-                    server.getInstance().getInstanceId(), server.getHost());
-                pingView.remove(notification.getKey());
-                serviceCombServers.remove(notification.getKey());
-              }
-            })
+            .removalListener(
+                (RemovalListener<ServiceCombServer, ServiceCombServerStats>) notification -> {
+                  ServiceCombServer server = notification.getKey();
+                  LOGGER.info("stats of instance {} removed, host is {}",
+                      server.getInstance().getInstanceId(), server.getHost());
+                  pingView.remove(notification.getKey());
+                  serviceCombServers.remove(notification.getKey());
+                })
             .build(
                 new CacheLoader<ServiceCombServer, ServiceCombServerStats>() {
                   public ServiceCombServerStats load(ServiceCombServer server) {
-                    ServiceCombServerStats stats = new ServiceCombServerStats();
+                    ServiceCombServerStats stats = new ServiceCombServerStats(server.getMicroserviceName());
                     pingView.put(server, stats);
                     serviceCombServers.put(server.getInstance().getInstanceId(), server);
                     return stats;
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServer.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServer.java
index e780b8b..b31e759 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServer.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServer.java
@@ -39,11 +39,14 @@ public class ServiceCombServer extends Server {
   // 所属服务实例
   private final MicroserviceInstance instance;
 
+  private final String microserviceName;
+
   @VisibleForTesting
-  ServiceCombServer(Endpoint endpoint, MicroserviceInstance instance) {
+  ServiceCombServer(String microserviceName, Endpoint endpoint, MicroserviceInstance instance) {
     super(null);
     this.endpoint = endpoint;
     this.instance = instance;
+    this.microserviceName = microserviceName;
 
     // Different types of Robin Component Rule have different usages for server status and list.
     // e.g. RoundRobinRule using getAllServers & alive & readyToServe
@@ -54,9 +57,9 @@ public class ServiceCombServer extends Server {
     this.setReadyToServe(true);
   }
 
-  public ServiceCombServer(Transport transport, CacheEndpoint cacheEndpoint) {
+  public ServiceCombServer(String microserviceName, Transport transport, CacheEndpoint cacheEndpoint) {
     super(null);
-
+    this.microserviceName = microserviceName;
     endpoint = new Endpoint(transport, cacheEndpoint.getEndpoint(), cacheEndpoint.getInstance());
     instance = cacheEndpoint.getInstance();
 
@@ -75,6 +78,10 @@ public class ServiceCombServer extends Server {
     }
   }
 
+  public String getMicroserviceName() {
+    return this.microserviceName;
+  }
+
   public Endpoint getEndpoint() {
     return endpoint;
   }
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServerStats.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServerStats.java
index 5ad7624..d867da3 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServerStats.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/ServiceCombServerStats.java
@@ -45,31 +45,35 @@ public class ServiceCombServerStats {
    */
   static AtomicReference<TryingIsolatedServerMarker> globalAllowIsolatedServerTryingFlag = new AtomicReference<>();
 
-  private long lastWindow = System.currentTimeMillis();
-
   Clock clock;
 
-  private AtomicLong continuousFailureCount = new AtomicLong(0);
+  private long lastWindow;
+
+  private AtomicLong continuousFailureCount;
+
+  private long lastVisitTime;
 
-  private long lastVisitTime = System.currentTimeMillis();
+  private long lastActiveTime;
 
-  private long lastActiveTime = System.currentTimeMillis();
+  private long isolatedTime;
 
-  private AtomicLong totalRequests = new AtomicLong(0L);
+  private AtomicLong totalRequests;
 
-  private AtomicLong successRequests = new AtomicLong(0L);
+  private AtomicLong successRequests;
 
-  private AtomicLong failedRequests = new AtomicLong(0L);
+  private AtomicLong failedRequests;
 
   private boolean isolated = false;
 
-  public ServiceCombServerStats() {
-    this.clock = TimeUtils.getSystemDefaultZoneClock();
-    init();
+  private String microserviceName;
+
+  public ServiceCombServerStats(String microserviceName) {
+    this(microserviceName, TimeUtils.getSystemDefaultZoneClock());
   }
 
-  public ServiceCombServerStats(Clock clock) {
+  public ServiceCombServerStats(String microserviceName, Clock clock) {
     this.clock = clock;
+    this.microserviceName = microserviceName;
     init();
   }
 
@@ -117,23 +121,33 @@ public class ServiceCombServerStats {
 
   public void markIsolated(boolean isolated) {
     this.isolated = isolated;
+    this.isolatedTime = System.currentTimeMillis();
   }
 
   public void markSuccess() {
-    long time = System.currentTimeMillis();
+    long time = clock.millis();
     ensureWindow(time);
-    lastVisitTime = time;
-    lastActiveTime = time;
+
+    if (isolated) {
+      if (Configuration.INSTANCE.isRecoverImmediatelyWhenSuccess(microserviceName)
+          && time - this.isolatedTime > Configuration.INSTANCE
+          .getMinIsolationTime(microserviceName)) {
+        resetStats();
+        LOGGER.info("trying server invocation success, and reset stats.");
+      } else {
+        LOGGER.info("trying server invocation success!");
+      }
+    }
+
     totalRequests.incrementAndGet();
     successRequests.incrementAndGet();
     continuousFailureCount.set(0);
-    if (isolated) {
-      LOGGER.info("trying server invocation success!");
-    }
+    lastVisitTime = time;
+    lastActiveTime = time;
   }
 
   public void markFailure() {
-    long time = System.currentTimeMillis();
+    long time = clock.millis();
     ensureWindow(time);
     lastVisitTime = time;
 
@@ -150,10 +164,7 @@ public class ServiceCombServerStats {
       synchronized (lock) {
         if (time - lastWindow > TIME_WINDOW_IN_MILLISECONDS) {
           if (!isolated) {
-            continuousFailureCount.set(0);
-            totalRequests.set(0);
-            successRequests.set(0);
-            failedRequests.set(0);
+            resetStats();
           }
           lastWindow = time;
         }
@@ -161,15 +172,26 @@ public class ServiceCombServerStats {
     }
   }
 
+  private void resetStats() {
+    continuousFailureCount.set(0);
+    totalRequests.set(0);
+    successRequests.set(0);
+    failedRequests.set(0);
+  }
+
   public long getLastVisitTime() {
     return lastVisitTime;
   }
 
+  public long getIsolatedTime() {
+    return isolatedTime;
+  }
+
   public long getLastActiveTime() {
     return lastActiveTime;
   }
 
-  public long getCountinuousFailureCount() {
+  public long getContinuousFailureCount() {
     return continuousFailureCount.get();
   }
 
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java
index a48e6d4..45c7ba0 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java
@@ -57,7 +57,7 @@ public class IsolationServerEvent extends AlarmEvent {
     this.microserviceName = invocation.getMicroserviceName();
     this.endpoint = endpoint;
     this.currentTotalRequest = serverStats.getTotalRequests();
-    this.currentCountinuousFailureCount = serverStats.getCountinuousFailureCount();
+    this.currentCountinuousFailureCount = serverStats.getContinuousFailureCount();
     this.currentErrorPercentage = serverStats.getFailedRate();
     this.minIsolationTime = settings.minIsolationTime;
     this.enableRequestThreshold = settings.enableRequestThreshold;
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java
index d6feeac..b81d2e2 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java
@@ -147,6 +147,7 @@ public class IsolationDiscoveryFilter implements DiscoveryFilter {
         return ServiceCombServerStats.applyForTryingChance(invocation);
       }
       if (!serverStats.isIsolated()) {
+        // checkThresholdAllowed is not concurrent control, may print several logs/events in current access.
         serverStats.markIsolated(true);
         eventBus.post(
             new IsolationServerEvent(invocation, instance, serverStats,
@@ -159,7 +160,7 @@ public class IsolationDiscoveryFilter implements DiscoveryFilter {
     if (serverStats.isIsolated()) {
       // [2] so that we add a feature to isolate for at least a minimal time, and we can avoid
       // high volume of concurrent requests with a percentage of error(e.g. 50%) scenario with no isolation
-      if ((System.currentTimeMillis() - serverStats.getLastVisitTime()) <= settings.minIsolationTime) {
+      if ((System.currentTimeMillis() - serverStats.getIsolatedTime()) <= settings.minIsolationTime) {
         return false;
       }
       serverStats.markIsolated(false);
@@ -178,7 +179,7 @@ public class IsolationDiscoveryFilter implements DiscoveryFilter {
 
     if (settings.continuousFailureThreshold > 0) {
       // continuousFailureThreshold has higher priority to decide the result
-      if (serverStats.getCountinuousFailureCount() >= settings.continuousFailureThreshold) {
+      if (serverStats.getContinuousFailureCount() >= settings.continuousFailureThreshold) {
         return false;
       }
     }
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ServerDiscoveryFilter.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ServerDiscoveryFilter.java
index 3f95915..b1abe2e 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ServerDiscoveryFilter.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ServerDiscoveryFilter.java
@@ -18,11 +18,13 @@
 package org.apache.servicecomb.loadbalance.filter;
 
 import org.apache.servicecomb.core.CseContext;
+import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.core.filter.EndpointDiscoveryFilter;
 import org.apache.servicecomb.loadbalance.ServiceCombServer;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
 import org.apache.servicecomb.serviceregistry.cache.CacheEndpoint;
+import org.apache.servicecomb.serviceregistry.discovery.DiscoveryContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,13 +32,14 @@ public class ServerDiscoveryFilter extends EndpointDiscoveryFilter {
   private static final Logger LOGGER = LoggerFactory.getLogger(ServerDiscoveryFilter.class);
 
   @Override
-  protected Object createEndpoint(String transportName, String endpoint, MicroserviceInstance instance) {
+  protected Object createEndpoint(DiscoveryContext context, String transportName, String endpoint,
+      MicroserviceInstance instance) {
     Transport transport = CseContext.getInstance().getTransportManager().findTransport(transportName);
     if (transport == null) {
       LOGGER.info("not deployed transport {}, ignore {}.", transportName, endpoint);
       return null;
     }
-
-    return new ServiceCombServer(transport, new CacheEndpoint(endpoint, instance));
+    Invocation invocation = context.getInputParameters();
+    return new ServiceCombServer(invocation.getMicroserviceName(), transport, new CacheEndpoint(endpoint, instance));
   }
 }
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceCreator.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceCreator.java
index e0019b7..b192923 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceCreator.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceCreator.java
@@ -44,12 +44,12 @@ public class TestLoadBalanceCreator {
     Endpoint host1 = new Endpoint(transport, "host1");
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("instance1");
-    ServiceCombServer server = new ServiceCombServer(host1, instance1);
+    ServiceCombServer server = new ServiceCombServer(null, host1, instance1);
 
     Endpoint host2 = new Endpoint(transport, "host2");
     MicroserviceInstance instance2 = new MicroserviceInstance();
     instance2.setInstanceId("instance2");
-    ServiceCombServer server2 = new ServiceCombServer(host2, instance2);
+    ServiceCombServer server2 = new ServiceCombServer(null, host2, instance2);
 
     servers.add(server);
     servers.add(server2);
@@ -98,12 +98,12 @@ public class TestLoadBalanceCreator {
     Endpoint host1 = new Endpoint(transport, "host1");
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("instance1");
-    ServiceCombServer server = new ServiceCombServer(host1, instance1);
+    ServiceCombServer server = new ServiceCombServer(null, host1, instance1);
 
     Endpoint host2 = new Endpoint(transport, "host2");
     MicroserviceInstance instance2 = new MicroserviceInstance();
     instance2.setInstanceId("instance2");
-    ServiceCombServer server2 = new ServiceCombServer(host2, instance2);
+    ServiceCombServer server2 = new ServiceCombServer(null, host2, instance2);
 
     servers.add(server);
     servers.add(server2);
@@ -150,8 +150,8 @@ public class TestLoadBalanceCreator {
     instance1.setInstanceId("ii01");
     MicroserviceInstance instance2 = new MicroserviceInstance();
     instance2.setInstanceId("ii02");
-    ServiceCombServer server = new ServiceCombServer(endpoint1, instance1);
-    ServiceCombServer server2 = new ServiceCombServer(endpoint2, instance2);
+    ServiceCombServer server = new ServiceCombServer(null, endpoint1, instance1);
+    ServiceCombServer server2 = new ServiceCombServer(null, endpoint2, instance2);
 
     new Expectations() {
       {
@@ -203,12 +203,12 @@ public class TestLoadBalanceCreator {
     List<ServiceCombServer> servers = new ArrayList<>();
     Endpoint host1 = new Endpoint(transport, "host1");
     MicroserviceInstance instance1 = new MicroserviceInstance();
-    ServiceCombServer server = new ServiceCombServer(host1, instance1);
+    ServiceCombServer server = new ServiceCombServer(null, host1, instance1);
     instance1.setInstanceId("instance1");
 
     Endpoint host2 = new Endpoint(transport, "host2");
     MicroserviceInstance instance2 = new MicroserviceInstance();
-    ServiceCombServer server2 = new ServiceCombServer(host2, instance2);
+    ServiceCombServer server2 = new ServiceCombServer(null, host2, instance2);
     instance2.setInstanceId("instance2");
 
     servers.add(server);
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 6d71b47..fd3effe 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
@@ -849,7 +849,7 @@ public class TestLoadBalanceHandler2 {
         (inv, aysnc) -> {
           Assert.assertEquals("rest://127.0.0.1:8080", inv.getEndpoint().getEndpoint());
           Assert.assertTrue(serviceCombServerStats.isIsolated());
-          Assert.assertEquals(5, serviceCombServerStats.getCountinuousFailureCount());
+          Assert.assertEquals(5, serviceCombServerStats.getContinuousFailureCount());
           Assert.assertFalse(ServiceCombServerStats.isolatedServerCanTry());
           aysnc.success("OK");
         });
@@ -863,7 +863,7 @@ public class TestLoadBalanceHandler2 {
     }
     Assert.assertEquals("rest://127.0.0.1:8080", invocation.getEndpoint().getEndpoint());
     Assert.assertTrue(serviceCombServerStats.isIsolated());
-    Assert.assertEquals(0, serviceCombServerStats.getCountinuousFailureCount());
+    Assert.assertEquals(0, serviceCombServerStats.getContinuousFailureCount());
     Assert.assertTrue(ServiceCombServerStats.isolatedServerCanTry());
   }
 
@@ -894,16 +894,16 @@ public class TestLoadBalanceHandler2 {
         (inv, aysnc) -> {
           Assert.assertFalse(stats0.isIsolated());
           Assert.assertTrue(stats1.isIsolated());
-          Assert.assertEquals(5, stats1.getCountinuousFailureCount());
+          Assert.assertEquals(5, stats1.getContinuousFailureCount());
           Assert.assertFalse(ServiceCombServerStats.isolatedServerCanTry());
           if (counter.value == 0) {
             Assert.assertEquals("rest://127.0.0.1:8080", inv.getEndpoint().getEndpoint());
-            Assert.assertEquals(0, stats0.getCountinuousFailureCount());
+            Assert.assertEquals(0, stats0.getContinuousFailureCount());
             counter.value++;
             aysnc.producerFail(new InvocationException(503, "RETRY", "retry to next instance"));
           } else if (counter.value == 1) {
             Assert.assertEquals("rest://127.0.0.1:8081", inv.getEndpoint().getEndpoint());
-            Assert.assertEquals(1, stats0.getCountinuousFailureCount());
+            Assert.assertEquals(1, stats0.getContinuousFailureCount());
             counter.value++;
             aysnc.success("OK");
           } else {
@@ -920,9 +920,9 @@ public class TestLoadBalanceHandler2 {
     }
     Assert.assertEquals("rest://127.0.0.1:8081", invocation.getEndpoint().getEndpoint());
     Assert.assertFalse(stats0.isIsolated());
-    Assert.assertEquals(1, stats0.getCountinuousFailureCount());
+    Assert.assertEquals(1, stats0.getContinuousFailureCount());
     Assert.assertTrue(stats1.isIsolated());
-    Assert.assertEquals(0, stats1.getCountinuousFailureCount());
+    Assert.assertEquals(0, stats1.getContinuousFailureCount());
     Assert.assertTrue(ServiceCombServerStats.isolatedServerCanTry());
   }
 
@@ -947,7 +947,7 @@ public class TestLoadBalanceHandler2 {
   private ServiceCombServer createMockedServer(String microserviceInstanceId, String endpoint) {
     MicroserviceInstance microserviceInstance = new MicroserviceInstance();
     microserviceInstance.setInstanceId(microserviceInstanceId);
-    return new ServiceCombServer(
+    return new ServiceCombServer(null,
         new Endpoint(Mockito.mock(Transport.class), endpoint),
         microserviceInstance);
   }
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 c009f64..1b1f159 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
@@ -174,7 +174,7 @@ public class TestLoadbalanceHandler {
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
     CacheEndpoint cacheEndpoint = new CacheEndpoint("rest://localhost:8080", instance1);
-    ServiceCombServer server = new ServiceCombServer(restTransport, cacheEndpoint);
+    ServiceCombServer server = new ServiceCombServer(null, restTransport, cacheEndpoint);
     LoadBalancerStats stats = new LoadBalancerStats("test");
     new Expectations(loadBalancer) {
       {
@@ -203,7 +203,7 @@ public class TestLoadbalanceHandler {
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
     CacheEndpoint cacheEndpoint = new CacheEndpoint("rest://localhost:8080", instance1);
-    ServiceCombServer server = new ServiceCombServer(restTransport, cacheEndpoint);
+    ServiceCombServer server = new ServiceCombServer(null, restTransport, cacheEndpoint);
     LoadBalancerStats stats = new LoadBalancerStats("test");
     new Expectations(loadBalancer) {
       {
@@ -231,7 +231,7 @@ public class TestLoadbalanceHandler {
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
     CacheEndpoint cacheEndpoint = new CacheEndpoint("rest://localhost:8080", instance1);
-    ServiceCombServer server = new ServiceCombServer(restTransport, cacheEndpoint);
+    ServiceCombServer server = new ServiceCombServer(null, restTransport, cacheEndpoint);
     LoadBalancerStats stats = new LoadBalancerStats("test");
     new Expectations(loadBalancer) {
       {
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
index 79fec89..fa495f7 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombLoadBalancerStats.java
@@ -77,7 +77,7 @@ public class TestServiceCombLoadBalancerStats {
     serviceCombLoadBalancerStats.setTimerIntervalInMillis(500);
     serviceCombLoadBalancerStats.init();
 
-    ServiceCombServer serviceCombServer = new ServiceCombServer(transport,
+    ServiceCombServer serviceCombServer = new ServiceCombServer(null, transport,
         new CacheEndpoint("rest://localhost:8080", instance));
     serviceCombLoadBalancerStats.markSuccess(serviceCombServer);
     ServiceCombServerStats stats = serviceCombLoadBalancerStats.getServiceCombServerStats(serviceCombServer);
@@ -94,16 +94,16 @@ public class TestServiceCombLoadBalancerStats {
     long time = System.currentTimeMillis();
     MicroserviceInstance instance = new MicroserviceInstance();
     instance.setInstanceId("instance1");
-    ServiceCombServer serviceCombServer = new ServiceCombServer(transport,
+    ServiceCombServer serviceCombServer = new ServiceCombServer(null, transport,
         new CacheEndpoint("rest://localhost:8080", instance));
     ServiceCombLoadBalancerStats.INSTANCE.markFailure(serviceCombServer);
     ServiceCombLoadBalancerStats.INSTANCE.markFailure(serviceCombServer);
     Assert.assertEquals(
-        ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(serviceCombServer).getCountinuousFailureCount(),
+        ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(serviceCombServer).getContinuousFailureCount(),
         2);
     ServiceCombLoadBalancerStats.INSTANCE.markSuccess(serviceCombServer);
     Assert.assertEquals(
-        ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(serviceCombServer).getCountinuousFailureCount(),
+        ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(serviceCombServer).getContinuousFailureCount(),
         0);
     ServiceCombLoadBalancerStats.INSTANCE.markSuccess(serviceCombServer);
     Assert
@@ -125,7 +125,7 @@ public class TestServiceCombLoadBalancerStats {
     long time = System.currentTimeMillis();
     MicroserviceInstance instance = new MicroserviceInstance();
     instance.setInstanceId("instance2");
-    ServiceCombServer serviceCombServer = new ServiceCombServer(transport,
+    ServiceCombServer serviceCombServer = new ServiceCombServer(null, transport,
         new CacheEndpoint("rest://localhost:8080", instance));
 
     CountDownLatch latch = new CountDownLatch(10);
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServer.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServer.java
index 1b2e599..4ec72b1 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServer.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServer.java
@@ -41,7 +41,7 @@ public class TestServiceCombServer {
   public void setUp() {
     MicroserviceInstance instance = new MicroserviceInstance();
     instance.setInstanceId("123456");
-    cs = new ServiceCombServer(transport, new CacheEndpoint("abcd", instance));
+    cs = new ServiceCombServer(null, transport, new CacheEndpoint("abcd", instance));
   }
 
   @Test
@@ -61,12 +61,12 @@ public class TestServiceCombServer {
 
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
-    ServiceCombServer other = new ServiceCombServer(transport, new CacheEndpoint("1234", instance1));
+    ServiceCombServer other = new ServiceCombServer(null, transport, new CacheEndpoint("1234", instance1));
     Assert.assertFalse(cs.equals(other));
 
     MicroserviceInstance instance2 = new MicroserviceInstance();
     instance2.setInstanceId("123456");
-    other = new ServiceCombServer(transport, new CacheEndpoint("abcd", instance2));
+    other = new ServiceCombServer(null, transport, new CacheEndpoint("abcd", instance2));
     Assert.assertTrue(cs.equals(other));
   }
 
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServerStats.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServerStats.java
index ef1fd61..68db539 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServerStats.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestServiceCombServerStats.java
@@ -46,12 +46,12 @@ public class TestServiceCombServerStats {
   @Test
   public void testSimpleThread() {
     long time = System.currentTimeMillis();
-    ServiceCombServerStats stats = new ServiceCombServerStats();
+    ServiceCombServerStats stats = new ServiceCombServerStats(null);
     stats.markFailure();
     stats.markFailure();
-    Assert.assertEquals(stats.getCountinuousFailureCount(), 2);
+    Assert.assertEquals(stats.getContinuousFailureCount(), 2);
     stats.markSuccess();
-    Assert.assertEquals(stats.getCountinuousFailureCount(), 0);
+    Assert.assertEquals(stats.getContinuousFailureCount(), 0);
     stats.markSuccess();
     Assert.assertEquals(stats.getTotalRequests(), 4);
     Assert.assertEquals(stats.getFailedRate(), 50);
@@ -63,7 +63,7 @@ public class TestServiceCombServerStats {
   @Test
   public void testMiltiThread() throws Exception {
     long time = System.currentTimeMillis();
-    ServiceCombServerStats stats = new ServiceCombServerStats();
+    ServiceCombServerStats stats = new ServiceCombServerStats(null);
     CountDownLatch latch = new CountDownLatch(10);
     for (int i = 0; i < 10; i++) {
       new Thread() {
@@ -92,7 +92,7 @@ public class TestServiceCombServerStats {
         return 1000;
       }
     };
-    ServiceCombServerStats stats = new ServiceCombServerStats();
+    ServiceCombServerStats stats = new ServiceCombServerStats(null);
     Assert.assertEquals(stats.getLastVisitTime(), 1000);
     stats.markSuccess();
     stats.markFailure();
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestSessionSticknessRule.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestSessionSticknessRule.java
index 228e973..01262b9 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestSessionSticknessRule.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestSessionSticknessRule.java
@@ -50,7 +50,7 @@ public class TestSessionSticknessRule {
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
     ServiceCombServer mockedServer =
-        new ServiceCombServer(transport, new CacheEndpoint("rest:127.0.0.1:8889", instance1));
+        new ServiceCombServer(null, transport, new CacheEndpoint("rest:127.0.0.1:8889", instance1));
     Invocation invocation = mock(Invocation.class);
     LoadBalancerStats stats = mock(LoadBalancerStats.class);
     Mockito.when(mockedLb.getLoadBalancerStats()).thenReturn(stats);
@@ -60,7 +60,6 @@ public class TestSessionSticknessRule {
     List<ServiceCombServer> allServers = Arrays.asList(mockedServer);
     rule.setLoadBalancer(mockedLb);
 
-
     Server s = rule.choose(allServers, invocation);
     Assert.assertEquals(s, mockedServer);
 
@@ -242,7 +241,7 @@ public class TestSessionSticknessRule {
     MicroserviceInstance instance1 = new MicroserviceInstance();
     instance1.setInstanceId("1234");
     ServiceCombServer mockedServer =
-        new ServiceCombServer(transport, new CacheEndpoint("rest:127.0.0.1:8890", instance1));
+        new ServiceCombServer(null, transport, new CacheEndpoint("rest:127.0.0.1:8890", instance1));
     mockedServer.setAlive(true);
     mockedServer.setReadyToServe(true);
     mockedServer.setId("mockedServer");
@@ -250,7 +249,8 @@ public class TestSessionSticknessRule {
     LoadBalancer lb = new LoadBalancer(rule, "mockedServer");
     when(invocation.getLocalContext(LoadbalanceHandler.CONTEXT_KEY_SERVER_LIST)).thenReturn(allServers);
     rule.setLoadBalancer(lb);
-    ServiceCombServer server = new ServiceCombServer(transport, new CacheEndpoint("rest:127.0.0.1:8890", instance1));
+    ServiceCombServer server = new ServiceCombServer(null, transport,
+        new CacheEndpoint("rest:127.0.0.1:8890", instance1));
     Deencapsulation.setField(rule, "lastServer", server);
 
     new MockUp<SessionStickinessRule>(rule) {
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilterTest.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilterTest.java
index d4c0acd..0e16acb 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilterTest.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilterTest.java
@@ -75,7 +75,8 @@ public class IsolationDiscoveryFilterTest {
       String endpoint = "rest://127.0.0.1:" + i;
       instance.setEndpoints(Collections.singletonList(endpoint));
       data.put(instance.getInstanceId(), instance);
-      ServiceCombServer serviceCombServer = new ServiceCombServer(transport, new CacheEndpoint(endpoint, instance));
+      ServiceCombServer serviceCombServer = new ServiceCombServer(null, transport,
+          new CacheEndpoint(endpoint, instance));
       ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(serviceCombServer);
     }
     discoveryTreeNode.data(data);
@@ -214,7 +215,7 @@ public class IsolationDiscoveryFilterTest {
 
     ServiceCombServerStats serviceCombServerStats = ServiceCombLoadBalancerStats.INSTANCE
         .getServiceCombServerStats(server0);
-    Deencapsulation.setField(serviceCombServerStats, "lastVisitTime",
+    Deencapsulation.setField(serviceCombServerStats, "isolatedTime",
         System.currentTimeMillis() - Configuration.INSTANCE.getMinIsolationTime(invocation.getMicroserviceName()) - 1);
     childNode = filter.discovery(discoveryContext, discoveryTreeNode);
     childNodeData = childNode.data();
@@ -230,10 +231,11 @@ public class IsolationDiscoveryFilterTest {
     ServiceCombLoadBalancerStats.INSTANCE.markSuccess(server0);
     ServiceCombServerStats serviceCombServerStats = ServiceCombLoadBalancerStats.INSTANCE
         .getServiceCombServerStats(server0);
-    Deencapsulation.setField(serviceCombServerStats, "lastVisitTime",
-        System.currentTimeMillis() - Configuration.INSTANCE.getMinIsolationTime(invocation.getMicroserviceName()) - 1);
 
     ServiceCombLoadBalancerStats.INSTANCE.markIsolated(server0, true);
+    Deencapsulation.setField(serviceCombServerStats, "isolatedTime",
+        System.currentTimeMillis() - Configuration.INSTANCE.getMinIsolationTime(invocation.getMicroserviceName()) - 1);
+
     DiscoveryTreeNode childNode = filter.discovery(discoveryContext, discoveryTreeNode);
     Map<String, MicroserviceInstance> childNodeData = childNode.data();
     Assert.assertThat(childNodeData.keySet(), Matchers.containsInAnyOrder("i0", "i1", "i2"));
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 5dbd6a4..1c6d9e8 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
@@ -19,16 +19,19 @@ package org.apache.servicecomb.loadbalance.filter;
 
 import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.CseContext;
+import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.core.transport.TransportManager;
 import org.apache.servicecomb.loadbalance.ServiceCombServer;
 import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.discovery.DiscoveryContext;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
 import mockit.Expectations;
+import mockit.Injectable;
 import mockit.Mocked;
 
 public class TestServerDiscoveryFilter {
@@ -59,22 +62,27 @@ public class TestServerDiscoveryFilter {
       }
     };
 
-    ServiceCombServer server = (ServiceCombServer) filter.createEndpoint(Const.RESTFUL, null, null);
+    ServiceCombServer server = (ServiceCombServer) filter.createEndpoint(null, Const.RESTFUL, null, null);
     Assert.assertNull(server);
   }
 
   @Test
-  public void createEndpointNormal() {
+  public void createEndpointNormal(@Injectable DiscoveryContext context, @Injectable Invocation invocation) {
     new Expectations() {
       {
         transportManager.findTransport(anyString);
         result = trasport;
+        context.getInputParameters();
+        result = invocation;
+        invocation.getMicroserviceName();
+        result = "test";
       }
     };
     MicroserviceInstance instance = new MicroserviceInstance();
     instance.setInstanceId("0000001");
 
-    ServiceCombServer server = (ServiceCombServer) filter.createEndpoint(Const.RESTFUL, "rest://localhost:8080", instance);
+    ServiceCombServer server = (ServiceCombServer) filter
+        .createEndpoint(context, Const.RESTFUL, "rest://localhost:8080", instance);
     Assert.assertSame(instance, server.getInstance());
     Assert.assertSame(trasport, server.getEndpoint().getTransport());
     Assert.assertEquals("rest://localhost:8080", server.getEndpoint().getEndpoint());
diff --git a/java-chassis-spring-boot/spring-boot-starter/spring-boot-starter-discovery/src/main/java/org/apache/servicecomb/springboot/starter/discovery/ScbRibbonEndpointDiscoveryFilter.java b/java-chassis-spring-boot/spring-boot-starter/spring-boot-starter-discovery/src/main/java/org/apache/servicecomb/springboot/starter/discovery/ScbRibbonEndpointDiscoveryFilter.java
index a9a4de5..07a1bdb 100644
--- a/java-chassis-spring-boot/spring-boot-starter/spring-boot-starter-discovery/src/main/java/org/apache/servicecomb/springboot/starter/discovery/ScbRibbonEndpointDiscoveryFilter.java
+++ b/java-chassis-spring-boot/spring-boot-starter/spring-boot-starter-discovery/src/main/java/org/apache/servicecomb/springboot/starter/discovery/ScbRibbonEndpointDiscoveryFilter.java
@@ -33,7 +33,7 @@ public class ScbRibbonEndpointDiscoveryFilter extends AbstractEndpointDiscoveryF
   }
 
   @Override
-  protected Object createEndpoint(String transportName, String endpoint, MicroserviceInstance instance) {
+  protected Object createEndpoint(DiscoveryContext context, String transportName, String endpoint, MicroserviceInstance instance) {
     URIEndpointObject uri = new URIEndpointObject(endpoint);
     return new Server(uri.getHostOrIp(), uri.getPort());
   }
diff --git a/java-chassis-spring-boot/spring-boot2-starter-parent/spring-boot2-starter-discovery/src/main/java/org/apache/servicecomb/springboot2/starter/discovery/ScbRibbonEndpointDiscoveryFilter.java b/java-chassis-spring-boot/spring-boot2-starter-parent/spring-boot2-starter-discovery/src/main/java/org/apache/servicecomb/springboot2/starter/discovery/ScbRibbonEndpointDiscoveryFilter.java
index 1f17df5..81d9351 100644
--- a/java-chassis-spring-boot/spring-boot2-starter-parent/spring-boot2-starter-discovery/src/main/java/org/apache/servicecomb/springboot2/starter/discovery/ScbRibbonEndpointDiscoveryFilter.java
+++ b/java-chassis-spring-boot/spring-boot2-starter-parent/spring-boot2-starter-discovery/src/main/java/org/apache/servicecomb/springboot2/starter/discovery/ScbRibbonEndpointDiscoveryFilter.java
@@ -33,7 +33,8 @@ public class ScbRibbonEndpointDiscoveryFilter extends AbstractEndpointDiscoveryF
   }
 
   @Override
-  protected Object createEndpoint(String transportName, String endpoint, MicroserviceInstance instance) {
+  protected Object createEndpoint(DiscoveryContext context, String transportName, String endpoint,
+      MicroserviceInstance instance) {
     URIEndpointObject uri = new URIEndpointObject(endpoint);
     return new Server(uri.getHostOrIp(), uri.getPort());
   }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java
index dd471af..bba630a 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/discovery/AbstractEndpointDiscoveryFilter.java
@@ -56,7 +56,7 @@ public abstract class AbstractEndpointDiscoveryFilter implements DiscoveryFilter
             continue;
           }
 
-          Object objEndpoint = createEndpoint(transportName, endpoint, instance);
+          Object objEndpoint = createEndpoint(context, transportName, endpoint, instance);
           if (objEndpoint == null) {
             continue;
           }
@@ -79,5 +79,6 @@ public abstract class AbstractEndpointDiscoveryFilter implements DiscoveryFilter
 
   protected abstract String findTransportName(DiscoveryContext context, DiscoveryTreeNode parent);
 
-  protected abstract Object createEndpoint(String transportName, String endpoint, MicroserviceInstance instance);
+  protected abstract Object createEndpoint(DiscoveryContext context, String transportName, String endpoint,
+      MicroserviceInstance instance);
 }
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/discovery/TestAbstractTransportDiscoveryFilter.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/discovery/TestAbstractTransportDiscoveryFilter.java
index df3292c..c237baa 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/discovery/TestAbstractTransportDiscoveryFilter.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/discovery/TestAbstractTransportDiscoveryFilter.java
@@ -42,7 +42,8 @@ public class TestAbstractTransportDiscoveryFilter {
     }
 
     @Override
-    protected Object createEndpoint(String transportName, String endpoint, MicroserviceInstance instance) {
+    protected Object createEndpoint(DiscoveryContext context, String transportName, String endpoint,
+        MicroserviceInstance instance) {
       if (disableCreate) {
         return null;
       }