You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by GitBox <gi...@apache.org> on 2018/10/11 09:41:33 UTC

[GitHub] heyile closed pull request #947: [SCB-837] make http2 production ready

heyile closed pull request #947:  [SCB-837] make http2 production ready
URL: https://github.com/apache/incubator-servicecomb-java-chassis/pull/947
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpClientMetrics.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpClientMetrics.java
index 98f5fd205..3fb9af337 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpClientMetrics.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpClientMetrics.java
@@ -19,6 +19,8 @@
 import org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultClientEndpointMetric;
 import org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultClientEndpointMetricManager;
 import org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultHttpSocketMetric;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import io.vertx.core.http.HttpClient;
 import io.vertx.core.http.HttpClientOptions;
@@ -34,6 +36,9 @@
  */
 public class DefaultHttpClientMetrics implements
     HttpClientMetrics<DefaultHttpSocketMetric, Object, DefaultHttpSocketMetric, DefaultClientEndpointMetric, Object> {
+
+  private static final Logger LOGGER = LoggerFactory.getLogger(DefaultHttpClientMetrics.class);
+
   private final DefaultClientEndpointMetricManager clientEndpointMetricManager;
 
   private final HttpClient client;
@@ -77,8 +82,9 @@ public void dequeueRequest(DefaultClientEndpointMetric endpointMetric, Object ta
 
   @Override
   public void endpointConnected(DefaultClientEndpointMetric endpointMetric, DefaultHttpSocketMetric socketMetric) {
-    socketMetric.setEndpointMetric(endpointMetric);
-    endpointMetric.onConnect();
+    // as http2 client will not invoke this method, the endpointMetric info will lost.
+    // you can get more details from https://github.com/eclipse-vertx/vert.x/issues/2660
+    // hence, we will set endpointMetric info in the method connected(SocketAddress remoteAddress, String remoteName)
   }
 
   @Override
@@ -133,7 +139,11 @@ public void disconnected(Object webSocketMetric) {
 
   @Override
   public DefaultHttpSocketMetric connected(SocketAddress remoteAddress, String remoteName) {
-    return new DefaultHttpSocketMetric(null);
+    //we can get endpointMetric info here, so set the endpointMetric info directly
+    DefaultClientEndpointMetric clientEndpointMetric = this.clientEndpointMetricManager
+        .getClientEndpointMetric(remoteAddress);
+    clientEndpointMetric.onConnect();
+    return new DefaultHttpSocketMetric(clientEndpointMetric);
   }
 
   @Override
diff --git a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestTransportClient.java b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestTransportClient.java
index 05f73a7f8..2ce5620fa 100644
--- a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestTransportClient.java
+++ b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/RestTransportClient.java
@@ -61,9 +61,7 @@ public void init(Vertx vertx) throws Exception {
     HttpClientOptions httpClientOptions = createHttpClientOptions();
     clientMgr = new ClientPoolManager<>(vertx, new HttpClientPoolFactory(httpClientOptions));
 
-    HttpClientOptions httpClientOptionshttp2 = createHttpClientOptions();
-    httpClientOptionshttp2.setUseAlpn(true).setProtocolVersion(HttpVersion.HTTP_2);
-    httpClientOptionshttp2.setHttp2ClearTextUpgrade(false);
+    HttpClientOptions httpClientOptionshttp2 = createHttp2ClientOptions();
 
     clientMgrHttp2 = new ClientPoolManager<>(vertx, new HttpClientPoolFactory(httpClientOptionshttp2));
 
@@ -87,6 +85,21 @@ private static HttpClientOptions createHttpClientOptions() {
     return httpClientOptions;
   }
 
+  private static HttpClientOptions createHttp2ClientOptions() {
+    HttpClientOptions httpClientOptions = new HttpClientOptions();
+    httpClientOptions.setMaxPoolSize(TransportClientConfig.getConnectionMaxPoolSize())
+        .setUseAlpn(true)
+        .setIdleTimeout(TransportClientConfig.getConnectionIdleTimeoutInSeconds())
+        .setHttp2MultiplexingLimit(TransportClientConfig.getHttp2MultiplexingLimit())
+        .setHttp2MaxPoolSize(TransportClientConfig.getHttp2ConnectionMaxPoolSize())
+        .setProtocolVersion(HttpVersion.HTTP_2)
+        .setHttp2ClearTextUpgrade(false)
+        .setTryUseCompression(TransportClientConfig.getConnectionCompression());
+
+    VertxTLSBuilder.buildHttpClientOptions(SSL_KEY, httpClientOptions);
+    return httpClientOptions;
+  }
+
   public void send(Invocation invocation, AsyncResponse asyncResp) {
     URIEndpointObject endpoint = (URIEndpointObject) invocation.getEndpoint().getAddress();
     HttpClientWithContext httpClientWithContext;
diff --git a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/TransportClientConfig.java b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/TransportClientConfig.java
index 8a7844c31..d3e82da1a 100644
--- a/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/TransportClientConfig.java
+++ b/transports/transport-rest/transport-rest-client/src/main/java/org/apache/servicecomb/transport/rest/client/TransportClientConfig.java
@@ -37,8 +37,19 @@ public static int getThreadCount() {
     return DynamicPropertyFactory.getInstance().getIntProperty("servicecomb.rest.client.thread-count", 1).get();
   }
 
+  public static int getHttp2ConnectionMaxPoolSize() {
+    return DynamicPropertyFactory.getInstance().getIntProperty("servicecomb.rest.client.http2.maxPoolSize", 3)
+        .get();
+  }
+
+  public static int getHttp2MultiplexingLimit() {
+    return DynamicPropertyFactory.getInstance().getIntProperty("servicecomb.rest.client.http2.multiplexingLimit", -1)
+        .get();
+  }
+
   public static int getConnectionMaxPoolSize() {
-    return DynamicPropertyFactory.getInstance().getIntProperty("servicecomb.rest.client.connection.maxPoolSize", 5).get();
+    return DynamicPropertyFactory.getInstance().getIntProperty("servicecomb.rest.client.connection.maxPoolSize", 5)
+        .get();
   }
 
   public static int getConnectionIdleTimeoutInSeconds() {
@@ -48,7 +59,8 @@ public static int getConnectionIdleTimeoutInSeconds() {
   }
 
   public static boolean getConnectionKeepAlive() {
-    return DynamicPropertyFactory.getInstance().getBooleanProperty("servicecomb.rest.client.connection.keepAlive", true).get();
+    return DynamicPropertyFactory.getInstance().getBooleanProperty("servicecomb.rest.client.connection.keepAlive", true)
+        .get();
   }
 
   public static boolean getConnectionCompression() {
diff --git a/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/TestTransportClientConfig.java b/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/TestTransportClientConfig.java
index bbc2e753a..13a3d7a15 100644
--- a/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/TestTransportClientConfig.java
+++ b/transports/transport-rest/transport-rest-client/src/test/java/org/apache/servicecomb/transport/rest/client/TestTransportClientConfig.java
@@ -36,11 +36,22 @@ public void getConnectionIdleTimeoutInSeconds() {
     Assert.assertEquals(30, TransportClientConfig.getConnectionIdleTimeoutInSeconds());
   }
 
+  @Test
+  public void getHttp2MultiplexingLimit() {
+    Assert.assertEquals(-1, TransportClientConfig.getHttp2MultiplexingLimit());
+  }
+
+  @Test
+  public void getHttp2ConnectionMaxPoolSize() {
+    Assert.assertEquals(3, TransportClientConfig.getHttp2ConnectionMaxPoolSize());
+  }
+
   @Test
   public void getConnectionKeepAlive() {
     Assert.assertTrue(TransportClientConfig.getConnectionKeepAlive());
   }
 
+
   @Test
   public void getConnectionCompression() {
     Assert.assertFalse(TransportClientConfig.getConnectionCompression());
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java
index e93c56167..0d10f186d 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java
@@ -54,6 +54,7 @@
 import io.vertx.core.Future;
 import io.vertx.core.Handler;
 import io.vertx.core.Vertx;
+import io.vertx.core.http.Http2Settings;
 import io.vertx.core.http.HttpMethod;
 import io.vertx.core.http.HttpServer;
 import io.vertx.core.http.HttpServerOptions;
@@ -253,7 +254,8 @@ private HttpServerOptions createDefaultHttpServerOptions() {
     serverOptions.setMaxHeaderSize(TransportConfig.getMaxHeaderSize());
     serverOptions.setMaxInitialLineLength(TransportConfig.getMaxInitialLineLength());
     if (endpointObject.isHttp2Enabled()) {
-      serverOptions.setUseAlpn(true);
+      serverOptions.setUseAlpn(true)
+          .setInitialSettings(new Http2Settings().setMaxConcurrentStreams(TransportConfig.getMaxConcurrentStreams()));
     }
     if (endpointObject.isSslEnabled()) {
       SSLOptionFactory factory =
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/TransportConfig.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/TransportConfig.java
index 206472252..c1efa5930 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/TransportConfig.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/TransportConfig.java
@@ -38,6 +38,8 @@
 
   public static final boolean DEFAULT_SERVER_COMPRESSION_SUPPORT = false;
 
+  public static final long DEFAULT_MAX_CONCURRENT_STREAMS = 200L;
+
   // 32K
   public static final int DEFAULT_SERVER_MAX_HEADER_SIZE = 32 * 1024;
 
@@ -81,7 +83,11 @@ public static boolean getCompressed() {
         .getBooleanProperty("servicecomb.rest.server.compression", DEFAULT_SERVER_COMPRESSION_SUPPORT)
         .get();
   }
-
+  public static long getMaxConcurrentStreams() {
+    return DynamicPropertyFactory.getInstance()
+        .getLongProperty("servicecomb.rest.server.http2.concurrentStreams", DEFAULT_MAX_CONCURRENT_STREAMS)
+        .get();
+  }
   public static int getMaxHeaderSize() {
     return DynamicPropertyFactory.getInstance()
         .getIntProperty("servicecomb.rest.server.maxHeaderSize", DEFAULT_SERVER_MAX_HEADER_SIZE)
diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestTransportConfig.java b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestTransportConfig.java
index bca09be70..7493c0462 100644
--- a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestTransportConfig.java
+++ b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestTransportConfig.java
@@ -141,6 +141,14 @@ public void testGetCorsMaxAge() {
     Assert.assertEquals(3600, TransportConfig.getCorsMaxAge());
   }
 
+  @Test
+  public void testMaxConcurrentStreams() {
+    Assert.assertEquals(200L, TransportConfig.getMaxConcurrentStreams());
+    ArchaiusUtils.setProperty("servicecomb.rest.server.http2.concurrentStreams", 100L);
+    Assert.assertEquals(100L, TransportConfig.getMaxConcurrentStreams());
+  }
+
+
   @Test
   public void testGetMaxInitialLineLength() {
     Assert.assertEquals(4096, TransportConfig.getMaxInitialLineLength());


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services