1

我正在使用 Jetty 的 http2client 对我的服务器进行同步调用,我的示例程序如下,

客户端部分

Security.addProvider(new OpenSSLProvider());
SslContextFactory sslContextFactory = new SslContextFactory(true);
sslContextFactory.setProvider("Conscrypt");
sslContextFactory.setProtocol("TLSv1.3");
HTTP2Client http2Client = new HTTP2Client();
http2Client.setConnectTimeout(5000);
http2Client.setIdleTimeout(5000);

HttpClient httpClient = new org.eclipse.jetty.client.HttpClient(new HttpClientTransportOverHTTP2(http2Client), sslContextFactory);
httpClient.setMaxConnectionsPerDestination(20);
httpClient.setMaxRequestsQueuedPerDestination(100);
httpClient.setConnectTimeout(5000);
httpClient.addBean(sslContextFactory);
httpClient.start();

请求部分

Request request = httpClient.POST("my url goes here");
request.header(HttpHeader.CONTENT_TYPE, "application/json");
request.content(new StringContentProvider("xmlRequest PayLoad goes here","utf-8"));
ContentResponse response = request.send();
String res = new String(response.getContent());

我需要测量指标,例如每个目的地的连接数、每个连接的请求数、失败的事务数等。

我的应用程序在限制使用wireshark 或任何其他tcp 工具的服务器中运行。所以我需要在java中获取这些数据。启用码头的调试日志是不可行的,因为它会写入 GB 的数据。

有没有办法通过一些 util 或 java 反射来获取这些指标?

提前致谢

4

1 回答 1

1

http2Client.setMaxConcurrentPushedStreams(1000);

这太大了,服务器不太可能推送 1000 个并发流。

http2Client.setConnectTimeout(30);

http2Client.setIdleTimeout(5);

超时以毫秒为单位,因此这些值太小了。我还建议将空闲超时设置为大于 5000 毫秒的值,例如 20000-30000 通常更好。

字符串 res = new String(response.getContent());

这是错误的,因为您没有考虑响应字符集。改用response.getContentAsString().

至于指标,您可以使用 JMX 并使用 JMX 控制台(或通过标准 JMX API)提取一些指标。要为您设置 JMX,HttpClient可以这样做:

MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
MBeanContainer mbeanContainer = new MBeanContainer(mbeanServer);
httpClient.addBean(mbeanContainer);

上面的代码会将组件导出HttpClient到 JMX,您可以在其中查询各种组件以获取您感兴趣的指标。

于 2019-06-19T21:28:18.673 回答