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 284ba7e55ef69a80de852258488a44b90415f870 Author: liubao <[email protected]> AuthorDate: Mon Mar 19 20:17:00 2018 +0800 [SCB-416]For load balance rule configurations, we need provider service level configuration --- .../servicecomb/loadbalance/Configuration.java | 6 ++-- .../servicecomb/loadbalance/LoadBalancer.java | 11 +++++-- .../loadbalance/LoadbalanceHandler.java | 2 +- .../loadbalance/SessionStickinessRule.java | 11 ++++--- .../servicecomb/loadbalance/TestConfiguration.java | 20 +++--------- .../servicecomb/loadbalance/TestLoadBalancer.java | 32 ++++++++++++++++++- .../loadbalance/TestLoadbalanceHandler.java | 6 ++-- .../org/apache/servicecomb/loadbalance/Utils.java | 37 ++++++++++++++++++++++ 8 files changed, 96 insertions(+), 29 deletions(-) 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 9e40cd7..b3abd2a 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 @@ -101,10 +101,11 @@ public final class Configuration { PROP_ROOT + PROP_RULE_STRATEGY_NAME); } - public int getSessionTimeoutInSeconds() { + public int getSessionTimeoutInSeconds(String microservice) { final int defaultValue = 30; // do not support MicroService level now String p = getStringProperty("30", + PROP_ROOT + microservice + "." + SESSION_TIMEOUT_IN_SECONDS, PROP_ROOT + SESSION_TIMEOUT_IN_SECONDS); try { return Integer.parseInt(p); // can be negative @@ -113,10 +114,11 @@ public final class Configuration { } } - public int getSuccessiveFailedTimes() { + public int getSuccessiveFailedTimes(String microservice) { final int defaultValue = 5; // do not support MicroService level now String p = getStringProperty("5", + PROP_ROOT + microservice + "." + SUCCESSIVE_FAILED_TIMES, PROP_ROOT + SUCCESSIVE_FAILED_TIMES); try { return Integer.parseInt(p); // can be negative 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 e108deb..ec65691 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 @@ -46,12 +46,15 @@ public class LoadBalancer extends AbstractLoadBalancer { // 以filter类名为Key private Map<String, ServerListFilterExt> filters; - public LoadBalancer(String name, IRule rule) { + private String microServiceName; + + public LoadBalancer(String name, IRule rule, String microServiceName) { this.name = name; this.rule = rule; - this.rule.setLoadBalancer(this); + this.microServiceName = microServiceName; this.lbStats = new LoadBalancerStats(null); this.filters = new ConcurrentHashMap<>(); + this.rule.setLoadBalancer(this); } public String getName() { @@ -122,4 +125,8 @@ public class LoadBalancer extends AbstractLoadBalancer { public int getFilterSize() { return filters.size(); } + + public String getMicroServiceName() { + return microServiceName; + } } 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 2d9d928..fd22f8e 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 @@ -311,7 +311,7 @@ public class LoadbalanceHandler implements Handler { private LoadBalancer createLoadBalancer(String microserviceName, String loadBalancerName) { IRule rule = ExtensionsManager.createLoadBalancerRule(microserviceName); - LoadBalancer lb = new LoadBalancer(loadBalancerName, rule); + LoadBalancer lb = new LoadBalancer(loadBalancerName, rule, microserviceName); // we can change this implementation to ExtensionsManager in the future. loadServerListFilters(lb); diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/SessionStickinessRule.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/SessionStickinessRule.java index 71c7709..5a3a2c2 100644 --- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/SessionStickinessRule.java +++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/SessionStickinessRule.java @@ -51,6 +51,8 @@ public class SessionStickinessRule implements IRule { private static final int MILLI_COUNT_IN_SECOND = 1000; + private String microserviceName; + public SessionStickinessRule() { triggerRule = new RoundRobinRule(); } @@ -92,9 +94,9 @@ public class SessionStickinessRule implements IRule { } private boolean isTimeOut() { - return Configuration.INSTANCE.getSessionTimeoutInSeconds() > 0 + return Configuration.INSTANCE.getSessionTimeoutInSeconds(microserviceName) > 0 && System.currentTimeMillis() - - this.lastAccessedTime > ((long) Configuration.INSTANCE.getSessionTimeoutInSeconds() + - this.lastAccessedTime > ((long) Configuration.INSTANCE.getSessionTimeoutInSeconds(microserviceName) * MILLI_COUNT_IN_SECOND); } @@ -105,8 +107,8 @@ public class SessionStickinessRule implements IRule { if (stats != null && stats.getServerStats() != null && stats.getServerStats().size() > 0) { ServerStats serverStats = stats.getSingleServerStat(lastServer); int successiveFaildCount = serverStats.getSuccessiveConnectionFailureCount(); - if (Configuration.INSTANCE.getSuccessiveFailedTimes() > 0 - && successiveFaildCount >= Configuration.INSTANCE.getSuccessiveFailedTimes()) { + if (Configuration.INSTANCE.getSuccessiveFailedTimes(microserviceName) > 0 + && successiveFaildCount >= Configuration.INSTANCE.getSuccessiveFailedTimes(microserviceName)) { serverStats.clearSuccessiveConnectionFailureCount(); return true; } @@ -139,6 +141,7 @@ public class SessionStickinessRule implements IRule { @Override public void setLoadBalancer(ILoadBalancer lb) { this.lb = lb; + this.microserviceName = ((LoadBalancer) lb).getMicroServiceName(); } @Override diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestConfiguration.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestConfiguration.java index 5ba5042..703315d 100644 --- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestConfiguration.java +++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestConfiguration.java @@ -47,20 +47,12 @@ public class TestConfiguration { @Test public void testFullConfigurationWithArgsString() { - - Configuration.INSTANCE.getPolicy("test"); - Configuration.INSTANCE.getRetryOnNext("test"); - Configuration.INSTANCE.getRetryOnSame("test"); - Configuration.INSTANCE.isRetryEnabled("test"); - Configuration.INSTANCE.getSuccessiveFailedTimes(); - Configuration.INSTANCE.getSessionTimeoutInSeconds(); - assertNull(Configuration.INSTANCE.getPolicy("test")); assertNotNull(Configuration.INSTANCE.getRetryOnNext("test")); assertNotNull(Configuration.INSTANCE.getRetryOnSame("test")); assertNotNull(Configuration.INSTANCE.isRetryEnabled("test")); - assertNotNull(Configuration.INSTANCE.getSuccessiveFailedTimes()); - assertNotNull(Configuration.INSTANCE.getSessionTimeoutInSeconds()); + assertNotNull(Configuration.INSTANCE.getSuccessiveFailedTimes("test")); + assertNotNull(Configuration.INSTANCE.getSessionTimeoutInSeconds("test")); } @Test @@ -154,15 +146,11 @@ public class TestConfiguration { @Test public void testGetSuccessiveFailedTimes() { - - Configuration.INSTANCE.getSuccessiveFailedTimes(); - assertNotNull(Configuration.INSTANCE.getSuccessiveFailedTimes()); + assertNotNull(Configuration.INSTANCE.getSuccessiveFailedTimes("test")); } @Test public void testGetSessionTimeoutInSeconds() { - - Configuration.INSTANCE.getSessionTimeoutInSeconds(); - assertNotNull(Configuration.INSTANCE.getSessionTimeoutInSeconds()); + assertNotNull(Configuration.INSTANCE.getSessionTimeoutInSeconds("test")); } } 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 d24318b..a62df19 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 @@ -32,10 +32,12 @@ import com.netflix.loadbalancer.AbstractLoadBalancer.ServerGroup; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.Server; +import mockit.Deencapsulation; + public class TestLoadBalancer { private IRule rule = Mockito.mock(IRule.class); - private LoadBalancer loadBalancer = new LoadBalancer("loadBalancerName", rule); + private LoadBalancer loadBalancer = new LoadBalancer("loadBalancerName", rule, "test"); @Test public void name() { @@ -146,4 +148,32 @@ public class TestLoadBalancer { Mockito.when(filter.getFilteredListOfServers(servers)).thenReturn(servers); Assert.assertEquals(servers, loadBalancer.getAllServers()); } + + @Test + public void testLaodBalanceWithSessionSticknessRule() { + SessionStickinessRule rule = new SessionStickinessRule(); + LoadBalancer lb = new LoadBalancer("lb1", rule, "service"); + Assert.assertEquals(lb.getMicroServiceName(), "service"); + Assert.assertEquals("service", Deencapsulation.getField(rule, "microserviceName")); + + List<Server> servers = new ArrayList<>(); + Server server = new Server("host1", 80); + server.setAlive(true); + Server server2 = new Server("host2", 80); + server2.setAlive(true); + servers.add(server); + servers.add(server2); + lb.setServerList(servers); + + Server s = lb.chooseServer("test"); + Assert.assertEquals(server2, s); + s = lb.chooseServer("test"); + Assert.assertEquals(server2, s); + + long time = Deencapsulation.getField(rule, "lastAccessedTime"); + Deencapsulation.setField(rule, "lastAccessedTime", time - 1000 * 10); + Utils.updateProperty("cse.loadbalance.service.SessionStickinessRule.sessionTimeoutInSeconds", 9); + s = lb.chooseServer("test"); + Assert.assertEquals(server, s); + } } 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 5930335..85c91a7 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 @@ -76,7 +76,7 @@ public class TestLoadbalanceHandler { Map<String, LoadBalancer> loadBalancerMap = Deencapsulation.getField(handler, "loadBalancerMap"); - private LoadBalancer loadBalancer = new LoadBalancer("loadBalancerName", rule); + private LoadBalancer loadBalancer = new LoadBalancer("loadBalancerName", rule, "test"); @Injectable Invocation invocation; @@ -238,12 +238,12 @@ public class TestLoadbalanceHandler { Invocation invocation = Mockito.mock(Invocation.class); Mockito.when(invocation.getMicroserviceName()).thenReturn("test"); LoadbalanceHandler lbHandler = new LoadbalanceHandler(); - LoadBalancer myLB = new LoadBalancer("loadBalancerName", rule); + LoadBalancer myLB = new LoadBalancer("loadBalancerName", rule, "test"); lbHandler.setIsolationFilter(myLB, "abc"); Assert.assertEquals(1, myLB.getFilterSize()); Mockito.when(invocation.getMicroserviceName()).thenReturn("abc"); - myLB = new LoadBalancer("loadBalancerName", rule); + myLB = new LoadBalancer("loadBalancerName", rule, "test"); lbHandler.setIsolationFilter(myLB, "abc"); myLB.setInvocation(invocation); diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/Utils.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/Utils.java new file mode 100644 index 0000000..a00a93d --- /dev/null +++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/Utils.java @@ -0,0 +1,37 @@ +/* + * 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.lang.reflect.Method; + +import org.springframework.util.ReflectionUtils; + +import com.netflix.config.DynamicProperty; + +public class Utils { + private static Method updatePropertyMethod = + ReflectionUtils.findMethod(DynamicProperty.class, "updateProperty", String.class, Object.class); + + static { + updatePropertyMethod.setAccessible(true); + } + + public static void updateProperty(String key, Object value) { + ReflectionUtils.invokeMethod(updatePropertyMethod, null, key, value); + } +} -- To stop receiving notification emails like this one, please contact [email protected].
