【问题标题】:Am I using CloseableHttpClient correctly?我正确使用 CloseableHttpClient 吗?
【发布时间】:2018-08-26 07:35:19
【问题描述】:

这是我使用 CloseableHttpClient 的方式:

private static final CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet(myurl);
HttpResponse httpResponse = httpClient.execute(httpGet);

基本上,上面的代码是在一个单例类中,所以只有一个 httpClient 实例为所有请求提供服务。

如果一个 httpClient 服务于所有请求,这是否会影响性能? 因为我在接收 httpResponse 时发现系统运行缓慢。

我还有一个问题是我是否需要关闭上述任何资源,如果是,那么什么时候?

【问题讨论】:

    标签: java performance-testing apache-httpclient-4.x latency


    【解决方案1】:

    考虑使用Pooling Connection Manager,根据文档:

    PoolingHttpClientConnectionManager 是一种更复杂的实现,它管理客户端连接池并能够为来自多个执行线程的连接请求提供服务。连接按每条路由汇集。管理器已经在池中具有可用持久连接的路由请求将通过从池中租用连接而不是创建全新的连接来处理。

    所以我建议修改您的代码,例如:

    PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
    //configure it as per your reqiurements, i.e.
    cm.setMaxTotal(5000);
    cm.setDefaultMaxPerRoute(20);
    CloseableHttpClient httpClient = HttpClients.custom()
        .setConnectionManager(cm)
        .build();
    

    另外请注意,有一个名为 Apache JMeter 的免费开源负载测试工具,它特别在后台使用 Apache HttpComponents,因此您可以将其用于负载测试目的,或者查看底层实现(如果您有疑问。

    我建议重新考虑您的方法并使用 JMeter,因为当涉及到 Web 应用程序负载测试时,您需要考虑很多因素(标头、cookie、缓存、身份验证、AJAX 请求、嵌入式资源等),并且它可能需要付出巨大的努力才能正确实施一切。如果需要,您可以通过其API 从 Java 代码创建/运行 JMeter 测试,请参阅Five Ways To Launch a JMeter Test without Using the JMeter GUI 文章了解更多详细信息。

    【讨论】:

    • 实际上问题的原因是我使用默认的 HttpClient 看到了非常延迟。即使所有组件都在同一个 VPN 中,延迟也是由于请求在网络中花费很长时间。这是在仅使用 jmeter 进行性能测试时观察到的
    猜你喜欢
    • 2018-08-02
    • 2014-02-28
    • 2015-06-25
    • 2022-01-08
    • 2011-08-07
    • 2011-09-26
    • 2019-05-03
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多