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/23 08:22:39 UTC

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

liubao68 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..d8d5286b1 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
@@ -34,6 +34,7 @@
  */
 public class DefaultHttpClientMetrics implements
     HttpClientMetrics<DefaultHttpSocketMetric, Object, DefaultHttpSocketMetric, DefaultClientEndpointMetric, Object> {
+
   private final DefaultClientEndpointMetricManager clientEndpointMetricManager;
 
   private final HttpClient client;
@@ -77,8 +78,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 +135,22 @@ public void disconnected(Object webSocketMetric) {
 
   @Override
   public DefaultHttpSocketMetric connected(SocketAddress remoteAddress, String remoteName) {
-    return new DefaultHttpSocketMetric(null);
+    // when host of createEndpoint is not ip but a hostName
+    // get from remoteAddress will return null
+    // in this time need to try again with remoteName
+    // connected is a low frequency method, this try logic will not cause performance problem
+
+    DefaultClientEndpointMetric clientEndpointMetric = this.clientEndpointMetricManager
+        .getClientEndpointMetric(remoteAddress);
+    if (clientEndpointMetric == null) {
+      SocketAddressImpl address = new SocketAddressImpl(remoteAddress.port(), remoteName);
+      clientEndpointMetric = this.clientEndpointMetricManager.getClientEndpointMetric(address);
+    }
+    // it's better to be done in endpointConnected
+    // but there is bug before vertx 3.6.0 vertx not invoke endpointConnected for http2
+    // to avoid this bug, we move the logic here
+    clientEndpointMetric.onConnect();
+    return new DefaultHttpSocketMetric(clientEndpointMetric);
   }
 
   @Override
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java
index e7455da26..ced194cd7 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java
@@ -104,7 +104,12 @@ protected static void run() throws Throwable {
     // ......
 
     testSpringBoot2Standalone();
+
+    testHttp2CStandalone();
+
     testSpringBoot2Servlet();
+    //http2
+    testHttp2Standalone();
 
     deploys.getEdge().stop();
   }
@@ -145,6 +150,42 @@ private static void testStandalone() throws Throwable {
     deploys.getBaseProducer().stop();
   }
 
+  private static void testHttp2CStandalone() throws Throwable {
+    deploys.getBaseHttp2CProducer().ensureReady();
+
+    ITJUnitUtils.addProducer("it-producer");
+
+    runShareTestCases();
+
+    // currently not support update 3rd url, so only test once
+    ITJUnitUtils.run(Test3rdPartyInvocation.class);
+
+    //as setMaxInitialLineLength() is not work for http2, do not need
+    // ITJUnitUtils.runWithRest(TestRestServerConfig.class)
+    ITJUnitUtils.run(TestRestServerConfigEdge.class);
+
+    ITJUnitUtils.popProducer();
+    deploys.getBaseHttp2CProducer().stop();
+  }
+
+  private static void testHttp2Standalone() throws Throwable {
+    deploys.getBaseHttp2Producer().ensureReady();
+
+    ITJUnitUtils.addProducer("it-producer");
+
+    runShareTestCases();
+
+    // currently not support update 3rd url, so only test once
+    ITJUnitUtils.run(Test3rdPartyInvocation.class);
+
+    //as setMaxInitialLineLength() is not work for http2, do not need
+    // ITJUnitUtils.runWithRest(TestRestServerConfig.class)
+    ITJUnitUtils.run(TestRestServerConfigEdge.class);
+
+    ITJUnitUtils.popProducer();
+    deploys.getBaseHttp2Producer().stop();
+  }
+
   private static void testSpringBoot2Standalone() throws Throwable {
     deploys.getSpringBoot2StandaloneProducer().ensureReady();
 
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/Deploys.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/Deploys.java
index fff46f5e4..f71f1c793 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/Deploys.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/Deploys.java
@@ -19,6 +19,7 @@
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.net.URL;
 
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
@@ -38,6 +39,10 @@
 
   private MicroserviceDeploy baseProducer;
 
+  private MicroserviceDeploy baseHttp2CProducer;
+
+  private MicroserviceDeploy baseHttp2Producer;
+
   private MicroserviceDeploy springBoot2StandaloneProducer;
 
   private MicroserviceDeploy springBoot2ServletProducer;
@@ -60,6 +65,14 @@ public MicroserviceDeploy getBaseProducer() {
     return baseProducer;
   }
 
+  public MicroserviceDeploy getBaseHttp2Producer() {
+    return baseHttp2Producer;
+  }
+
+  public MicroserviceDeploy getBaseHttp2CProducer() {
+    return baseHttp2CProducer;
+  }
+
   public MicroserviceDeploy getSpringBoot2StandaloneProducer() {
     return springBoot2StandaloneProducer;
   }
@@ -75,6 +88,8 @@ public void init() throws Throwable {
     serviceCenter = new ServiceCenterDeploy();
     initEdge();
     initBaseProducer();
+    initBaseHttp2CProducer();
+    initBaseHttp2Producer();
     initSpringBoot2StandaloneProducer();
     initSpringBoot2ServletProducer();
 //    initZuul();
@@ -187,6 +202,43 @@ private void initBaseProducer() {
     baseProducer = new MicroserviceDeploy(definition);
   }
 
+  private void initBaseHttp2Producer() {
+    MicroserviceDeployDefinition definition = new MicroserviceDeployDefinition();
+    definition.setDeployName("baseHttp2Producer");
+    definition.setCmd("it-producer");
+    definition.setArgs(new String[] {});
+    URL urlServer = Thread.currentThread().getContextClassLoader().getResource("certificates/server.p12");
+    URL urlTrust = Thread.currentThread().getContextClassLoader().getResource("certificates/trust.jks");
+    if (urlServer != null && urlTrust != null) {
+      definition.setArgs(new String[] {"-Dservicecomb.rest.address=0.0.0.0:0?sslEnabled=true&protocol=http2",
+          "-Dservicecomb.highway.address=0.0.0.0:0?sslEnabled=true",
+          "-Dserver.p12=" + urlServer.getPath(),
+          "-Dtrust.jks=" + urlTrust.getPath()
+      });
+    }
+    definition.setAppId("integration-test");
+    definition.setMicroserviceName("it-producer");
+    definition.setVersion(DEFAULT_MICROSERVICE_VERSION);
+
+    initDeployDefinition(definition);
+
+    baseHttp2Producer = new MicroserviceDeploy(definition);
+  }
+
+  private void initBaseHttp2CProducer() {
+    MicroserviceDeployDefinition definition = new MicroserviceDeployDefinition();
+    definition.setDeployName("baseHttp2CProducer");
+    definition.setCmd("it-producer");
+    definition.setArgs(new String[] {"-Dservicecomb.rest.address=0.0.0.0:0?protocol=http2"});
+    definition.setAppId("integration-test");
+    definition.setMicroserviceName("it-producer");
+    definition.setVersion(DEFAULT_MICROSERVICE_VERSION);
+
+    initDeployDefinition(definition);
+
+    baseHttp2CProducer = new MicroserviceDeploy(definition);
+  }
+
   private void initSpringBoot2ServletProducer() {
     MicroserviceDeployDefinition definition = new MicroserviceDeployDefinition();
     definition.setDeployName("springBoot2ServletProducer");
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/MicroserviceDeploy.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/MicroserviceDeploy.java
index 2892c51a8..4561e8176 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/MicroserviceDeploy.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/deploy/MicroserviceDeploy.java
@@ -37,13 +37,16 @@ public MicroserviceDeploy(DeployDefinition deployDefinition) {
 
   @Override
   protected String[] createCmds() {
-    return new String[] {"java", "-jar", deployDefinition.getCmd()};
+    // must set jar at the end of the cmds
+    return new String[] {"java", "-jar"};
   }
 
   @Override
   protected String[] addArgs(String[] cmds) {
+    // add jar
     return ArrayUtils.addAll(super.addArgs(cmds),
-        "-DselfController=" + RegistryUtils.getMicroserviceInstance().getInstanceId());
+            "-DselfController=" + RegistryUtils.getMicroserviceInstance().getInstanceId(),
+        deployDefinition.getCmd());
   }
 
   public void ensureReady() throws Throwable {
diff --git a/integration-tests/it-consumer/src/main/resources/certificates/server.p12 b/integration-tests/it-consumer/src/main/resources/certificates/server.p12
new file mode 100644
index 000000000..631313ec6
Binary files /dev/null and b/integration-tests/it-consumer/src/main/resources/certificates/server.p12 differ
diff --git a/integration-tests/it-consumer/src/main/resources/certificates/trust.jks b/integration-tests/it-consumer/src/main/resources/certificates/trust.jks
new file mode 100644
index 000000000..57aeff733
Binary files /dev/null and b/integration-tests/it-consumer/src/main/resources/certificates/trust.jks differ
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/DemoSSLCustom.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/DemoSSLCustom.java
new file mode 100644
index 000000000..d27dc2e37
--- /dev/null
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/DemoSSLCustom.java
@@ -0,0 +1,40 @@
+/*
+ * 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.it;
+
+import java.net.URL;
+
+import org.apache.servicecomb.foundation.ssl.SSLCustom;
+
+public class DemoSSLCustom extends SSLCustom {
+  @Override
+  public char[] decode(char[] encrypted) {
+    return encrypted;
+  }
+
+  @Override
+  public String getFullPath(String filename) {
+    URL url = Thread.currentThread().getContextClassLoader().getResource("certificates/" + filename);
+    // can not get cert from jar
+    if (url == null || url.getPath().contains("!")) {
+      // get from env
+      return System.getProperty(filename);
+    }
+    return url.getPath();
+  }
+}
diff --git a/integration-tests/it-producer/src/main/resources/certificates/server.p12 b/integration-tests/it-producer/src/main/resources/certificates/server.p12
new file mode 100644
index 000000000..631313ec6
Binary files /dev/null and b/integration-tests/it-producer/src/main/resources/certificates/server.p12 differ
diff --git a/integration-tests/it-producer/src/main/resources/certificates/trust.jks b/integration-tests/it-producer/src/main/resources/certificates/trust.jks
new file mode 100644
index 000000000..57aeff733
Binary files /dev/null and b/integration-tests/it-producer/src/main/resources/certificates/trust.jks differ
diff --git a/integration-tests/it-producer/src/main/resources/microservice.yaml b/integration-tests/it-producer/src/main/resources/microservice.yaml
index 2621253ea..eaec944e5 100644
--- a/integration-tests/it-producer/src/main/resources/microservice.yaml
+++ b/integration-tests/it-producer/src/main/resources/microservice.yaml
@@ -21,4 +21,19 @@ service_description:
 servicecomb:
   rest:
     server:
-      maxInitialLineLength: 5000
\ No newline at end of file
+      maxInitialLineLength: 5000
+
+#########SSL options
+ssl.protocols: TLSv1.2
+ssl.authPeer: false
+ssl.checkCN.host: false
+
+#########certificates config
+ssl.trustStore: trust.jks
+ssl.trustStoreType: JKS
+ssl.trustStoreValue: Changeme_123
+ssl.keyStore: server.p12
+ssl.keyStoreType: PKCS12
+ssl.keyStoreValue: Changeme_123
+ssl.crl: revoke.crl
+ssl.sslCustomClass: org.apache.servicecomb.it.DemoSSLCustom
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..533179a9d 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,20 @@ private static HttpClientOptions createHttpClientOptions() {
     return httpClientOptions;
   }
 
+  private static HttpClientOptions createHttp2ClientOptions() {
+    HttpClientOptions httpClientOptions = new HttpClientOptions();
+    httpClientOptions.setUseAlpn(TransportClientConfig.getUseAlpn())
+        .setHttp2ClearTextUpgrade(false)
+        .setProtocolVersion(HttpVersion.HTTP_2)
+        .setIdleTimeout(TransportClientConfig.getHttp2ConnectionIdleTimeoutInSeconds())
+        .setHttp2MultiplexingLimit(TransportClientConfig.getHttp2MultiplexingLimit())
+        .setHttp2MaxPoolSize(TransportClientConfig.getHttp2ConnectionMaxPoolSize())
+        .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..fcc61952d 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
@@ -19,6 +19,9 @@
 
 import com.netflix.config.DynamicPropertyFactory;
 
+import io.vertx.core.http.HttpClientOptions;
+import io.vertx.core.net.TCPSSLOptions;
+
 public final class TransportClientConfig {
   private static Class<? extends RestTransportClient> restTransportClientCls = RestTransportClient.class;
 
@@ -37,8 +40,35 @@ 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",
+        HttpClientOptions.DEFAULT_HTTP2_MAX_POOL_SIZE)
+        .get();
+  }
+
+  public static int getHttp2MultiplexingLimit() {
+    return DynamicPropertyFactory.getInstance().getIntProperty("servicecomb.rest.client.http2.multiplexingLimit",
+        HttpClientOptions.DEFAULT_HTTP2_MULTIPLEXING_LIMIT)
+        .get();
+  }
+
+  public static int getHttp2ConnectionIdleTimeoutInSeconds() {
+    return DynamicPropertyFactory.getInstance()
+        .getIntProperty("servicecomb.rest.client.http2.idleTimeoutInSeconds", TCPSSLOptions.DEFAULT_IDLE_TIMEOUT)
+        .get();
+  }
+
+
+  public static boolean getUseAlpn() {
+    return DynamicPropertyFactory.getInstance()
+        .getBooleanProperty("servicecomb.rest.client.http2.useAlpnEnabled", true)
+        .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", HttpClientOptions.DEFAULT_MAX_POOL_SIZE)
+        .get();
   }
 
   public static int getConnectionIdleTimeoutInSeconds() {
@@ -48,12 +78,16 @@ 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", HttpClientOptions.DEFAULT_KEEP_ALIVE)
+        .get();
   }
 
+
   public static boolean getConnectionCompression() {
     return DynamicPropertyFactory.getInstance()
-        .getBooleanProperty("servicecomb.rest.client.connection.compression", false)
+        .getBooleanProperty("servicecomb.rest.client.connection.compression",
+            HttpClientOptions.DEFAULT_TRY_USE_COMPRESSION)
         .get();
   }
 }
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..d4ebd267a 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,32 @@ public void getConnectionIdleTimeoutInSeconds() {
     Assert.assertEquals(30, TransportClientConfig.getConnectionIdleTimeoutInSeconds());
   }
 
+  @Test
+  public void getHttp2MultiplexingLimit() {
+    Assert.assertEquals(-1, TransportClientConfig.getHttp2MultiplexingLimit());
+  }
+
+  @Test
+  public void getHttp2ConnectionMaxPoolSize() {
+    Assert.assertEquals(1, TransportClientConfig.getHttp2ConnectionMaxPoolSize());
+  }
+
+  @Test
+  public void getHttp2ConnectionIdleTimeoutInSeconds() {
+    Assert.assertEquals(0, TransportClientConfig.getHttp2ConnectionIdleTimeoutInSeconds());
+  }
+
+  @Test
+  public void getUseAplnEnabled() {
+    Assert.assertTrue(TransportClientConfig.getUseAlpn());
+  }
+
   @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..a61577d8c 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(TransportConfig.getUseAlpn())
+          .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..d3fd4f1b5 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
@@ -82,6 +82,19 @@ public static boolean getCompressed() {
         .get();
   }
 
+  public static long getMaxConcurrentStreams() {
+    return DynamicPropertyFactory.getInstance()
+        .getLongProperty("servicecomb.rest.server.http2.concurrentStreams",
+            HttpServerOptions.DEFAULT_INITIAL_SETTINGS_MAX_CONCURRENT_STREAMS)
+        .get();
+  }
+
+  public static boolean getUseAlpn() {
+    return DynamicPropertyFactory.getInstance()
+        .getBooleanProperty("servicecomb.rest.server.http2.useAlpnEnabled", true)
+        .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..a3970f49b 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,21 @@ public void testGetCorsMaxAge() {
     Assert.assertEquals(3600, TransportConfig.getCorsMaxAge());
   }
 
+  @Test
+  public void testMaxConcurrentStreams() {
+    Assert.assertEquals(100L, TransportConfig.getMaxConcurrentStreams());
+    ArchaiusUtils.setProperty("servicecomb.rest.server.http2.concurrentStreams", 200L);
+    Assert.assertEquals(200L, TransportConfig.getMaxConcurrentStreams());
+  }
+
+  @Test
+  public void testUseAlpn() {
+    Assert.assertTrue(TransportConfig.getUseAlpn());
+    ArchaiusUtils.setProperty("servicecomb.rest.server.http2.useAlpnEnabled", false);
+    Assert.assertFalse(TransportConfig.getUseAlpn());
+  }
+
+
   @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