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 2018/08/27 06:33:31 UTC
[incubator-servicecomb-java-chassis] 05/08: [SBC-870] change
loadbalancer to meet invocation level
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/incubator-servicecomb-java-chassis.git
commit b92c25060ee4335a921aa535758cfd2892e1779a
Author: liubao <ba...@huawei.com>
AuthorDate: Sat Aug 25 14:53:27 2018 +0800
[SBC-870] change loadbalancer to meet invocation level
---
.../servicecomb/loadbalance/LoadBalancer.java | 24 ++++----
.../loadbalance/LoadBalancerCreator.java | 69 ----------------------
.../loadbalance/LoadbalanceHandler.java | 31 +++++-----
.../loadbalance/TestLoadBalanceCreator.java | 50 +++++++++++-----
.../loadbalance/TestLoadBalanceHandler2.java | 31 +++++++---
.../servicecomb/loadbalance/TestLoadBalancer.java | 10 ++--
.../loadbalance/TestLoadbalanceHandler.java | 30 +---------
.../loadbalance/TestSessionSticknessRule.java | 4 +-
8 files changed, 95 insertions(+), 154 deletions(-)
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancer.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancer.java
index 3a96b59..463ea19 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancer.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancer.java
@@ -20,7 +20,9 @@ package org.apache.servicecomb.loadbalance;
import java.util.List;
import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
+import com.google.common.annotations.VisibleForTesting;
import com.netflix.loadbalancer.LoadBalancerStats;
/**
@@ -35,25 +37,22 @@ public class LoadBalancer {
private List<ServerListFilterExt> filters;
- private List<ServiceCombServer> servers;
-
- public LoadBalancer(RuleExt rule, String microServiceName,
- LoadBalancerStats stats, List<ServerListFilterExt> filters, List<ServiceCombServer> servers) {
+ public LoadBalancer(RuleExt rule, String microServiceName) {
this.microServiceName = microServiceName;
this.rule = rule;
- this.lbStats = stats;
- this.filters = filters;
- this.servers = servers;
+ this.lbStats = new LoadBalancerStats(null);
+ // load new instances, because filters work on service information
+ this.filters = SPIServiceUtils.loadSortedService(ServerListFilterExt.class);
this.rule.setLoadBalancer(this);
this.filters.forEach((item) -> item.setLoadBalancer(this));
}
public ServiceCombServer chooseServer(Invocation invocation) {
- List<ServiceCombServer> temp = this.servers;
+ List<ServiceCombServer> servers = invocation.getLocalContext(LoadbalanceHandler.CONTEXT_KEY_SERVER_LIST);
for (ServerListFilterExt filterExt : filters) {
- temp = filterExt.getFilteredListOfServers(temp, invocation);
+ servers = filterExt.getFilteredListOfServers(servers, invocation);
}
- return rule.choose(temp, invocation);
+ return rule.choose(servers, invocation);
}
public LoadBalancerStats getLoadBalancerStats() {
@@ -63,4 +62,9 @@ public class LoadBalancer {
public String getMicroServiceName() {
return microServiceName;
}
+
+ @VisibleForTesting
+ void setFilters(List<ServerListFilterExt> filters) {
+ this.filters = filters;
+ }
}
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancerCreator.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancerCreator.java
deleted file mode 100644
index 5cb18dc..0000000
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadBalancerCreator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.loadbalance;
-
-import java.util.List;
-
-import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.netflix.loadbalancer.LoadBalancerStats;
-
-/**
- * Create a suitable load balancer for each invocation.
- *
- * Robin components work good in service level state, and we want to reuse its IRule components and other
- * facilities, but they are not good for operation
- * level filters, so write a custom load balance process.
- *
- * Load balance instance is created for each microservice(plus version rule), thus it is service level,
- * it only can contains stateful information with service. e.g. LoadBalancerStats.
- *
- * ServerListFilter may choose available servers according to invocation information, IRule will work
- * on the result of ServerListFilter, they should not contain operation level state information in instance fields.
- */
-public class LoadBalancerCreator {
- private RuleExt rule;
-
- private LoadBalancerStats lbStats;
-
- private List<ServerListFilterExt> filters;
-
- private String microServiceName;
-
- public LoadBalancerCreator(RuleExt rule, String microServiceName) {
- this.rule = rule;
- this.microServiceName = microServiceName;
- this.lbStats = new LoadBalancerStats(null);
- // load new instances, because filters work on service information
- this.filters = SPIServiceUtils.loadSortedService(ServerListFilterExt.class);
- }
-
- public void shutdown() {
- // nothing to do now
- }
-
- @VisibleForTesting
- void setFilters(List<ServerListFilterExt> filters) {
- this.filters = filters;
- }
-
- public LoadBalancer createLoadBalancer(List<ServiceCombServer> servers) {
- return new LoadBalancer(rule, microServiceName, lbStats, filters, servers);
- }
-}
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
index 06f4b10..9055672 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
@@ -58,6 +58,8 @@ import rx.Observable;
* Load balance handler.
*/
public class LoadbalanceHandler implements Handler {
+ public static final String CONTEXT_KEY_SERVER_LIST = "x-context-server-list";
+
// just a wrapper to make sure in retry mode to choose a different server.
class RetryLoadBalancer implements ILoadBalancer {
// Enough times to make sure to choose a different server in high volume.
@@ -67,9 +69,7 @@ public class LoadbalanceHandler implements Handler {
LoadBalancer delegate;
- Invocation invocation;
-
- RetryLoadBalancer(LoadBalancer delegate, Invocation invocation) {
+ RetryLoadBalancer(LoadBalancer delegate) {
this.delegate = delegate;
}
@@ -81,7 +81,7 @@ public class LoadbalanceHandler implements Handler {
@Override
public Server chooseServer(Object key) {
for (int i = 0; i < COUNT; i++) {
- Server s = delegate.chooseServer(invocation);
+ Server s = delegate.chooseServer((Invocation) key);
if (s != null && !s.equals(lastServer)) {
lastServer = s;
break;
@@ -131,7 +131,7 @@ public class LoadbalanceHandler implements Handler {
private DiscoveryTree discoveryTree = new DiscoveryTree();
// key为grouping filter qualified name
- private volatile Map<String, LoadBalancerCreator> loadBalancerMap = new ConcurrentHashMapEx<>();
+ private volatile Map<String, LoadBalancer> loadBalancerMap = new ConcurrentHashMapEx<>();
private final Object lock = new Object();
@@ -154,6 +154,7 @@ public class LoadbalanceHandler implements Handler {
}
}
this.strategy = strategy;
+
LoadBalancer loadBalancer = getOrCreateLoadBalancer(invocation);
if (!Configuration.INSTANCE.isRetryEnabled(invocation.getMicroserviceName())) {
@@ -164,9 +165,6 @@ public class LoadbalanceHandler implements Handler {
}
private void clearLoadBalancer() {
- for (LoadBalancerCreator creator : loadBalancerMap.values()) {
- creator.shutdown();
- }
loadBalancerMap.clear();
}
@@ -282,7 +280,7 @@ public class LoadbalanceHandler implements Handler {
ExecutionContext<Invocation> context = new ExecutionContext<>(invocation, null, null, null);
LoadBalancerCommand<Response> command = LoadBalancerCommand.<Response>builder()
- .withLoadBalancer(new RetryLoadBalancer(chosenLB, invocation))
+ .withLoadBalancer(new RetryLoadBalancer(chosenLB))
.withServerLocator(invocation)
.withRetryHandler(ExtensionsManager.createRetryHandler(invocation.getMicroserviceName()))
.withListeners(listeners)
@@ -350,22 +348,23 @@ public class LoadbalanceHandler implements Handler {
invocation.getAppId(),
invocation.getMicroserviceName(),
invocation.getMicroserviceVersionRule());
+ invocation.addLocalContext(CONTEXT_KEY_SERVER_LIST, serversVersionedCache.data());
- LoadBalancerCreator loadBalancerCreator = loadBalancerMap.computeIfAbsent(serversVersionedCache.name(), name -> {
- return createLoadBalancerCreator(invocation.getMicroserviceName());
- });
+ LoadBalancer loadBalancer = loadBalancerMap
+ .computeIfAbsent(serversVersionedCache.name(), name -> {
+ return createLoadBalancer(invocation.getMicroserviceName());
+ });
// Nothing to do just help users to deal with incompatible changes.
setTransactionControlFilter(invocation.getMicroserviceName());
loadServerListFilters();
- return loadBalancerCreator.createLoadBalancer(serversVersionedCache.data());
+ return loadBalancer;
}
- private LoadBalancerCreator createLoadBalancerCreator(String microserviceName) {
+ private LoadBalancer createLoadBalancer(String microserviceName) {
RuleExt rule = ExtensionsManager.createLoadBalancerRule(microserviceName);
- LoadBalancerCreator creator = new LoadBalancerCreator(rule, microserviceName);
- return creator;
+ return new LoadBalancer(rule, microserviceName);
}
private void loadServerListFilters() {
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 4c5373a..e0019b7 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
@@ -33,7 +33,6 @@ import com.netflix.loadbalancer.Server;
import mockit.Deencapsulation;
import mockit.Expectations;
import mockit.Injectable;
-import mockit.Mocked;
public class TestLoadBalanceCreator {
@Test
@@ -54,7 +53,7 @@ public class TestLoadBalanceCreator {
servers.add(server);
servers.add(server2);
- LoadBalancerCreator lbCreator = new LoadBalancerCreator(rule, "test");
+ LoadBalancer lb = new LoadBalancer(rule, "test");
List<ServerListFilterExt> filters = new ArrayList<>();
@@ -72,9 +71,14 @@ public class TestLoadBalanceCreator {
return filteredServers;
}
});
- lbCreator.setFilters(filters);
+ lb.setFilters(filters);
- LoadBalancer lb = lbCreator.createLoadBalancer(servers);
+ new Expectations() {
+ {
+ invocation.getLocalContext(LoadbalanceHandler.CONTEXT_KEY_SERVER_LIST);
+ result = servers;
+ }
+ };
Server s = lb.chooseServer(invocation);
Assert.assertEquals(server2, s);
s = lb.chooseServer(invocation);
@@ -88,7 +92,7 @@ public class TestLoadBalanceCreator {
@Injectable Transport transport) {
// Robin components implementations require getReachableServers & getServerList have the same size, we add a test case for this.
RandomRuleExt rule = new RandomRuleExt();
- LoadBalancerCreator lbCreator = new LoadBalancerCreator(rule, "service");
+ LoadBalancer lb = new LoadBalancer(rule, "service");
List<ServiceCombServer> servers = new ArrayList<>();
Endpoint host1 = new Endpoint(transport, "host1");
@@ -119,8 +123,13 @@ public class TestLoadBalanceCreator {
return filteredServers;
}
});
- lbCreator.setFilters(filters);
- LoadBalancer lb = lbCreator.createLoadBalancer(servers);
+ lb.setFilters(filters);
+ new Expectations() {
+ {
+ invocation.getLocalContext(LoadbalanceHandler.CONTEXT_KEY_SERVER_LIST);
+ result = servers;
+ }
+ };
Server s = lb.chooseServer(invocation);
Assert.assertEquals(server2, s);
s = lb.chooseServer(invocation);
@@ -130,11 +139,11 @@ public class TestLoadBalanceCreator {
}
@Test
- public void testLoadBalanceWithWeightedResponseTimeRuleAndFilter(@Injectable Endpoint endpoint1, @Injectable Endpoint endpoint2, @Injectable Invocation invocation) {
+ public void testLoadBalanceWithWeightedResponseTimeRuleAndFilter(@Injectable Endpoint endpoint1,
+ @Injectable Endpoint endpoint2, @Injectable Invocation invocation) {
// Robin components implementations require getReachableServers & getServerList have the same size, we add a test case for this.
WeightedResponseTimeRuleExt rule = new WeightedResponseTimeRuleExt();
- LoadBalancerCreator lbCreator = new LoadBalancerCreator(rule, "service");
-
+ LoadBalancer lb = new LoadBalancer(rule, "service");
List<ServiceCombServer> servers = new ArrayList<>();
MicroserviceInstance instance1 = new MicroserviceInstance();
@@ -170,8 +179,13 @@ public class TestLoadBalanceCreator {
return filteredServers;
}
});
- lbCreator.setFilters(filters);
- LoadBalancer lb = lbCreator.createLoadBalancer(servers);
+ lb.setFilters(filters);
+ new Expectations() {
+ {
+ invocation.getLocalContext(LoadbalanceHandler.CONTEXT_KEY_SERVER_LIST);
+ result = servers;
+ }
+ };
Server s = lb.chooseServer(invocation);
Assert.assertEquals(server2, s);
s = lb.chooseServer(invocation);
@@ -184,7 +198,7 @@ public class TestLoadBalanceCreator {
public void testLoadBalanceWithSessionSticknessRule(@Injectable Invocation invocation,
@Injectable Transport transport) {
SessionStickinessRule rule = new SessionStickinessRule();
- LoadBalancerCreator lbCreator = new LoadBalancerCreator(rule, "service");
+ LoadBalancer lb = new LoadBalancer(rule, "service");
List<ServiceCombServer> servers = new ArrayList<>();
Endpoint host1 = new Endpoint(transport, "host1");
@@ -200,8 +214,14 @@ public class TestLoadBalanceCreator {
servers.add(server);
servers.add(server2);
- lbCreator.setFilters(new ArrayList<>());
- LoadBalancer lb = lbCreator.createLoadBalancer(servers);
+ lb.setFilters(new ArrayList<>());
+ new Expectations() {
+ {
+ invocation.getLocalContext(LoadbalanceHandler.CONTEXT_KEY_SERVER_LIST);
+ result = servers;
+ }
+ };
+
Server s = lb.chooseServer(invocation);
Assert.assertEquals(server, s);
s = lb.chooseServer(invocation);
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 906529f..3dbfa32 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
@@ -17,6 +17,8 @@
package org.apache.servicecomb.loadbalance;
+import static org.mockito.Mockito.when;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -25,6 +27,10 @@ import java.util.Map;
import org.apache.servicecomb.core.CseContext;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.Transport;
+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.provider.consumer.ReferenceConfig;
import org.apache.servicecomb.core.transport.TransportManager;
import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
import org.apache.servicecomb.serviceregistry.RegistryUtils;
@@ -58,7 +64,18 @@ public class TestLoadBalanceHandler2 {
@Test
public void testZoneAwareAndIsolationFilterWorks() {
- Invocation invocation = Mockito.mock(Invocation.class);
+ ReferenceConfig referenceConfig = Mockito.mock(ReferenceConfig.class);
+ OperationMeta operationMeta = Mockito.mock(OperationMeta.class);
+ SchemaMeta schemaMeta = Mockito.mock(SchemaMeta.class);
+ when(operationMeta.getSchemaMeta()).thenReturn(schemaMeta);
+ MicroserviceMeta microserviceMeta = Mockito.mock(MicroserviceMeta.class);
+ when(schemaMeta.getMicroserviceMeta()).thenReturn(microserviceMeta);
+ when(schemaMeta.getMicroserviceName()).thenReturn("testMicroserviceName");
+ when(microserviceMeta.getAppId()).thenReturn("testApp");
+ when(referenceConfig.getVersionRule()).thenReturn("0.0.0+");
+ when(referenceConfig.getTransport()).thenReturn("rest");
+ Invocation invocation = new Invocation(referenceConfig, operationMeta, new Object[0]);
+
InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
ServiceRegistry serviceRegistry = Mockito.mock(ServiceRegistry.class);
TransportManager transportManager = Mockito.mock(TransportManager.class);
@@ -112,15 +129,11 @@ public class TestLoadBalanceHandler2 {
RegistryUtils.setServiceRegistry(serviceRegistry);
- Mockito.when(invocation.getAppId()).thenReturn("testApp");
- Mockito.when(invocation.getMicroserviceName()).thenReturn("testMicroserviceName");
- Mockito.when(invocation.getMicroserviceVersionRule()).thenReturn("0.0.0+");
- Mockito.when(invocation.getConfigTransportName()).thenReturn("rest");
- Mockito.when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
- Mockito.when(serviceRegistry.getInstanceCacheManager()).thenReturn(instanceCacheManager);
- Mockito.when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
+ when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
+ when(serviceRegistry.getInstanceCacheManager()).thenReturn(instanceCacheManager);
+ when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
.thenReturn(parent);
- Mockito.when(transportManager.findTransport("rest")).thenReturn(transport);
+ when(transportManager.findTransport("rest")).thenReturn(transport);
LoadbalanceHandler handler = null;
LoadBalancer loadBalancer = null;
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalancer.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalancer.java
index 7b26368..761c23c 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalancer.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalancer.java
@@ -17,6 +17,8 @@
package org.apache.servicecomb.loadbalance;
+import static org.mockito.Mockito.when;
+
import java.util.ArrayList;
import java.util.List;
@@ -34,14 +36,14 @@ public class TestLoadBalancer {
ServiceCombServer server = Mockito.mock(ServiceCombServer.class);
Invocation invocation = Mockito.mock(Invocation.class);
newServers.add(server);
- List<ServerListFilterExt> filterExts = new ArrayList<>();
- LoadBalancer loadBalancer = new LoadBalancer(rule, "test", null, filterExts, newServers);
+ when(invocation.getLocalContext(LoadbalanceHandler.CONTEXT_KEY_SERVER_LIST)).thenReturn(newServers);
+ LoadBalancer loadBalancer = new LoadBalancer(rule, "test");
loadBalancer.chooseServer(invocation);
- Mockito.when(rule.choose(newServers, invocation)).thenReturn(server);
+ when(rule.choose(newServers, invocation)).thenReturn(server);
Assert.assertEquals(server, loadBalancer.chooseServer(invocation));
- Assert.assertEquals(null, loadBalancer.getLoadBalancerStats());
+ Assert.assertNotNull(loadBalancer.getLoadBalancerStats());
Assert.assertEquals("test", loadBalancer.getMicroServiceName());
}
}
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 468e482..eedf60c 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
@@ -74,7 +74,7 @@ public class TestLoadbalanceHandler {
LoadbalanceHandler handler;
- Map<String, LoadBalancerCreator> loadBalancerMap;
+ Map<String, LoadBalancer> loadBalancerMap;
@Injectable
Invocation invocation;
@@ -154,34 +154,6 @@ public class TestLoadbalanceHandler {
}
@Test
- public void getOrCreateLoadBalancer() throws Exception {
- LoadbalanceHandler handler = new LoadbalanceHandler();
-
- MicroserviceInstance instance = new MicroserviceInstance();
- instance.setInstanceId("id");
- instance.getEndpoints().add("rest://localhost:8080");
-
- Map<String, MicroserviceInstance> instanceMap = new HashMap<>();
- instanceMap.put(instance.getInstanceId(), instance);
-
- VersionedCache instanceVersionedCache =
- new VersionedCache().autoCacheVersion().name("instanceCache").data(instanceMap);
-
- new Expectations() {
- {
- invocation.getConfigTransportName();
- result = "rest";
- instanceCacheManager.getOrCreateVersionedCache(anyString, anyString, anyString);
- result = instanceVersionedCache;
- }
- };
-
- LoadBalancer lb = handler.getOrCreateLoadBalancer(invocation);
-
- Assert.assertEquals("[rest://localhost:8080]", Deencapsulation.getField(lb, "servers").toString());
- }
-
- @Test
public void send_noEndPoint(@Injectable LoadBalancer loadBalancer) {
new Expectations(loadBalancer) {
{
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 dd2319e..303735c 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
@@ -255,8 +255,8 @@ public class TestSessionSticknessRule {
mockedServer.setReadyToServe(true);
mockedServer.setId("mockedServer");
List<ServiceCombServer> allServers = Arrays.asList(mockedServer);
- LoadBalancer lb = new LoadBalancer(rule, "mockedServer", null, new ArrayList<>(), allServers);
-
+ 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));
Deencapsulation.setField(rule, "lastServer", server);