[
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:
[email protected]
> 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)