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/03/22 01:58:30 UTC

[incubator-servicecomb-java-chassis] 01/03: [SCB-416]For load balance rule configurations, we need provider service level configuration

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 <ba...@huawei.com>
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
liubao@apache.org.