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/01 07:39:06 UTC

[incubator-servicecomb-java-chassis] 02/03: SCB-687 servicecomb.highway.server.connection-limit support dynamic update

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 5a1b85aea95991b2996819780809c3a64c7c5306
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Wed Jul 25 15:28:17 2018 +0800

    SCB-687 servicecomb.highway.server.connection-limit support dynamic update
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../foundation/vertx/ClientClosedEvent.java        |  3 +++
 .../foundation/vertx/ClientConnectedEvent.java     |  3 +++
 .../foundation/vertx/server/TcpServer.java         | 30 ++++++++++------------
 .../foundation/vertx/server/TestTcpServer.java     |  2 +-
 .../spring-pojo-connection-limit-test/pom.xml      |  4 +--
 .../src/test/resources/microservice.yaml           |  2 +-
 .../transport/highway/HighwayServer.java           |  6 +++--
 .../transport/highway/HighwayServerVerticle.java   | 14 +++++++++-
 .../transport/highway/HighwayTransport.java        |  7 +++++
 .../transport/highway/TestHighwayVerticle.java     |  8 +++---
 10 files changed, 52 insertions(+), 27 deletions(-)

diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/ClientClosedEvent.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/ClientClosedEvent.java
index 9a2ba4d..68fa037 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/ClientClosedEvent.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/ClientClosedEvent.java
@@ -17,6 +17,9 @@
 
 package org.apache.servicecomb.foundation.vertx;
 
+/**
+ * Notice: this event will raised in vertx eventloop thread, so do not run any block code
+ */
 public class ClientClosedEvent {
   private final String address;
 
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/ClientConnectedEvent.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/ClientConnectedEvent.java
index 9c2d3a3..09e752e 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/ClientConnectedEvent.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/ClientConnectedEvent.java
@@ -19,6 +19,9 @@ package org.apache.servicecomb.foundation.vertx;
 
 import io.vertx.core.net.NetSocket;
 
+/**
+ * Notice: this event will raised in vertx eventloop thread, so do not run any block code
+ */
 public class ClientConnectedEvent {
   private final NetSocket netSocket;
 
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/server/TcpServer.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/server/TcpServer.java
index 936f171..a2db206 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/server/TcpServer.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/server/TcpServer.java
@@ -40,13 +40,9 @@ public class TcpServer {
 
   private final AtomicInteger connectedCounter;
 
-  private final int connectionLimit;
-
-  public TcpServer(URIEndpointObject endpointObject) {
+  public TcpServer(URIEndpointObject endpointObject, AtomicInteger connectedCounter) {
     this.endpointObject = endpointObject;
-    this.connectedCounter = new AtomicInteger(0);
-    this.connectionLimit = DynamicPropertyFactory.getInstance()
-        .getIntProperty("servicecomb.highway.server.connection-limit", Integer.MAX_VALUE).get();
+    this.connectedCounter = connectedCounter;
   }
 
   public void init(Vertx vertx, String sslKey, AsyncResultCallback<InetSocketAddress> callback) {
@@ -69,18 +65,18 @@ public class TcpServer {
     }
 
     netServer.connectHandler(netSocket -> {
-      if (connectedCounter.get() < connectionLimit) {
-        int connectedCount = connectedCounter.incrementAndGet();
-        if (connectedCount <= connectionLimit) {
-          TcpServerConnection connection = createTcpServerConnection();
-          connection.init(netSocket, connectedCounter);
-          EventManager.post(new ClientConnectedEvent(netSocket, connectedCount));
-          return;
-        } else {
-          connectedCounter.decrementAndGet();
-        }
+      int connectedCount = connectedCounter.incrementAndGet();
+      int connectionLimit = DynamicPropertyFactory.getInstance()
+          .getIntProperty("servicecomb.highway.server.connection-limit", Integer.MAX_VALUE).get();
+      if (connectedCount > connectionLimit) {
+        connectedCounter.decrementAndGet();
+        netSocket.close();
+        return;
       }
-      netSocket.close();
+
+      TcpServerConnection connection = createTcpServerConnection();
+      connection.init(netSocket, connectedCounter);
+      EventManager.post(new ClientConnectedEvent(netSocket, connectedCount));
     });
 
     InetSocketAddress socketAddress = endpointObject.getSocketAddress();
diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/server/TestTcpServer.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/server/TestTcpServer.java
index 4702905..59825f5 100644
--- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/server/TestTcpServer.java
+++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/server/TestTcpServer.java
@@ -35,7 +35,7 @@ import mockit.Mocked;
 public class TestTcpServer {
   static class TcpServerForTest extends TcpServer {
     public TcpServerForTest(URIEndpointObject endpointObject) {
-      super(endpointObject);
+      super(endpointObject, new AtomicInteger());
     }
 
     @Override
diff --git a/integration-tests/spring-pojo-connection-limit-test/pom.xml b/integration-tests/spring-pojo-connection-limit-test/pom.xml
index c0da88e..f121f62 100644
--- a/integration-tests/spring-pojo-connection-limit-test/pom.xml
+++ b/integration-tests/spring-pojo-connection-limit-test/pom.xml
@@ -22,7 +22,7 @@
   <parent>
     <artifactId>integration-tests</artifactId>
     <groupId>org.apache.servicecomb.tests</groupId>
-    <version>1.0.0-SNAPSHOT</version>
+    <version>1.1.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
@@ -33,7 +33,7 @@
     <dependency>
       <groupId>org.apache.servicecomb.tests</groupId>
       <artifactId>pojo-test</artifactId>
-      <version>1.0.0-SNAPSHOT</version>
+      <version>1.1.0-SNAPSHOT</version>
       <type>test-jar</type>
       <exclusions>
         <exclusion>
diff --git a/integration-tests/spring-pojo-connection-limit-test/src/test/resources/microservice.yaml b/integration-tests/spring-pojo-connection-limit-test/src/test/resources/microservice.yaml
index 3935df6..d1333f0 100644
--- a/integration-tests/spring-pojo-connection-limit-test/src/test/resources/microservice.yaml
+++ b/integration-tests/spring-pojo-connection-limit-test/src/test/resources/microservice.yaml
@@ -17,7 +17,7 @@
 
 APPLICATION_ID: pojotest-it
 service_description:
-  name: pojo-connection-limit
+  name: pojo
   version: 0.0.4
 servicecomb:
   service:
diff --git a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServer.java b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServer.java
index 5aca854..0694c2d 100644
--- a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServer.java
+++ b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServer.java
@@ -17,6 +17,8 @@
 
 package org.apache.servicecomb.transport.highway;
 
+import java.util.concurrent.atomic.AtomicInteger;
+
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
 import org.apache.servicecomb.foundation.vertx.server.TcpServer;
@@ -25,8 +27,8 @@ import org.apache.servicecomb.foundation.vertx.server.TcpServerConnection;
 public class HighwayServer extends TcpServer {
   private Endpoint endpoint;
 
-  public HighwayServer(Endpoint endpoint) {
-    super((URIEndpointObject) endpoint.getAddress());
+  public HighwayServer(Endpoint endpoint, AtomicInteger connectedCounter) {
+    super((URIEndpointObject) endpoint.getAddress(), connectedCounter);
     this.endpoint = endpoint;
   }
 
diff --git a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerVerticle.java b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerVerticle.java
index 123f5c7..162c63f 100644
--- a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerVerticle.java
+++ b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerVerticle.java
@@ -18,10 +18,12 @@
 package org.apache.servicecomb.transport.highway;
 
 import java.net.InetSocketAddress;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.transport.AbstractTransport;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
+import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,6 +41,16 @@ public class HighwayServerVerticle extends AbstractVerticle {
 
   private URIEndpointObject endpointObject;
 
+  private final AtomicInteger connectedCounter;
+
+  public HighwayServerVerticle() {
+    this(((HighwayTransport) BeanUtils.getBean("highwayTransport")).getConnectedCounter());
+  }
+
+  public HighwayServerVerticle(AtomicInteger connectedCounter) {
+    this.connectedCounter = connectedCounter;
+  }
+
   @Override
   public void init(Vertx vertx, Context context) {
     super.init(vertx, context);
@@ -66,7 +78,7 @@ public class HighwayServerVerticle extends AbstractVerticle {
       return;
     }
 
-    HighwayServer server = new HighwayServer(endpoint);
+    HighwayServer server = new HighwayServer(endpoint, connectedCounter);
     server.init(vertx, SSL_KEY, ar -> {
       if (ar.succeeded()) {
         InetSocketAddress socketAddress = ar.result();
diff --git a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayTransport.java b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayTransport.java
index 195741f..956275c 100644
--- a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayTransport.java
+++ b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayTransport.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.transport.highway;
 
 import java.util.Collections;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.transport.AbstractTransport;
@@ -35,6 +36,12 @@ public class HighwayTransport extends AbstractTransport {
 
   private HighwayClient highwayClient = new HighwayClient();
 
+  private final AtomicInteger connectedCounter = new AtomicInteger(0);
+
+  public AtomicInteger getConnectedCounter() {
+    return connectedCounter;
+  }
+
   @Override
   public String getName() {
     return NAME;
diff --git a/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayVerticle.java b/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayVerticle.java
index b0b6f75..1aeb092 100644
--- a/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayVerticle.java
+++ b/transports/transport-highway/src/test/java/org/apache/servicecomb/transport/highway/TestHighwayVerticle.java
@@ -17,6 +17,8 @@
 
 package org.apache.servicecomb.transport.highway;
 
+import java.util.concurrent.atomic.AtomicInteger;
+
 import org.apache.servicecomb.core.Endpoint;
 import org.apache.servicecomb.core.Transport;
 import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
@@ -39,12 +41,12 @@ public class TestHighwayVerticle {
   private HighwayServerVerticle highwayVerticle = null;
 
   @Before
-  public void setUp() throws Exception {
-    highwayVerticle = new HighwayServerVerticle();
+  public void setUp() {
+    highwayVerticle = new HighwayServerVerticle(new AtomicInteger());
   }
 
   @After
-  public void tearDown() throws Exception {
+  public void tearDown() {
     highwayVerticle = null;
   }