[ https://issues.apache.org/jira/browse/SCB-837?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16646195#comment-16646195 ]
ASF GitHub Bot commented on SCB-837: ------------------------------------ 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: us...@infra.apache.org > make http2 production ready > --------------------------- > > Key: SCB-837 > URL: https://issues.apache.org/jira/browse/SCB-837 > Project: Apache ServiceComb > Issue Type: Improvement > Components: Java-Chassis > Reporter: wujimin > Assignee: 何一乐 > Priority: Major > Fix For: java-chassis-1.1.0 > > > currenty, http2 client use all http1.1 settings, that cause http2 client > performance is so bad. > > we need to conside http2 client settings at least: > 1.concurrent stream in one connection, default value is 3, we must make it > bigger > 2.maxPoolSize, http1.1 need a big pool, but http2 need a big concurrent > stream count > > we must perform a performance test, that make sure got a good result, and > then set the setting to be our default setting. -- This message was sent by Atlassian JIRA (v7.6.3#76005)