Spring Cloud 开放 Feign:HttpURLConnection 和 Apache HttpClient

问题描述 投票:0回答:1

使用Feign时,默认使用HttpURLConnection。我预计通过切换到 Apache HttpClient 进行连接池可以提高性能。然而,在我的测试中,响应时间实际上增加了。我很想知道这可能是什么原因造成的。

我认为使用连接池可以减少API调用时间的原因如下:

  1. 连接重用:

    • 连接池在多个 HTTP 请求中重用 TCP 连接。它不是每次都建立新连接,而是利用现有的活动连接,避免连接设置和拆除的开销。
  2. 减少连接开销:

    • 建立和断开 TCP 连接可能非常耗时且成本高昂。使用连接池可确保连接的持续重用,最大限度地降低与连接建立和释放相关的成本。
  3. 并发管理:

    • 连接池可以同时管理多个用户或线程到服务器的 HTTP 连接。这使得可以同时发送多个请求并接收多个响应,从而提高性能。
  4. 保持活动利用率:

    • 连接池利用 HTTP Keep-Alive 标头来维持与服务器的持久连接。这允许通过同一连接传输多个请求,从而减少网络延迟并提高性能。
  5. 资源效率:

    • 通过重用连接,连接池可以防止不必要的连接创建,从而实现系统资源的高效管理。

HTTP 连接池对于处理多个并发 HTTP 请求的 Web 应用程序特别有利,有助于增强性能。

测试用例

我对两种场景进行了测试:一种使用 HttpURLConnection,另一种使用 Apache HttpClient。

我将 Apache HttpClient 库添加到我的 Spring Boot 项目中,并确认正在调用 Apache HttpClient 的execute()方法。另外,我确认正在使用 PoolingHttpClientConnectionManager.class。

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
    implementation 'io.github.openfeign:feign-httpclient' // 🔥🔥🔥

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

测试代码

我使用以下代码测量了上述两种场景的执行时间:

@SpringBootTest
public class HttpClientTest {

    @Autowired
    TestFeignClient testFeignClient;

    @Test
    void testWithMultiThread() {
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        for (int i = 0; i < 10000; i++) {
            executorService.execute(() -> {
                testFeignClient.verifyMember(1);
            });
        }

        executorService.shutdown();
        while (!executorService.isTerminated()) {
        }
    }
}

测试结果

默认

10000次(线程100):0:00:12.198

阿帕奇客户端

10000次(线程100):0:00:15.330

由于连接池,我预计 Apache HttpClient 的时间会更短,但在 20 次测试运行中,Apache HttpClient 在大多数情况下花费了更多时间。

httpurlconnection apache-httpclient-4.x spring-cloud-feign httpconnection
1个回答
0
投票

您提供的链接使用此依赖性:

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.5.14</version>
</dependency>

现在了解配置和默认设置至关重要。

Apache HttpClient 中的连接管理是指对远程服务器底层连接的管理。高效的连接管理对于优化性能和资源利用率至关重要。 Apache HttpClient 提供了用于配置连接管理的各种选项。

在此库中

PoolingHttpClientConnectionManager
管理客户端连接池,并能够为来自多个执行线程的连接请求提供服务。它根据路由来汇集连接。它维护每条路由的最大连接数和总数。默认情况下,它为每个给定路由创建最多 2 个并发连接,总共最多创建 20 个连接。对于实际应用程序,我们可以根据需要增加这些限制。

根据该信息,您可以调整和增加

2
并发连接到更多 - 测试是否准确。

还要检查总连接数的设置。

在您提供的链接中: https://github.com/OpenFeign/feign/blob/master/httpclient/src/main/java/feign/httpclient/ApacheHttpClient.java

我没有看到这些选项的默认更改。 您需要根据自己的需要尝试自行更改。

© www.soinside.com 2019 - 2024. All rights reserved.