使用Feign时,默认使用HttpURLConnection。我预计通过切换到 Apache HttpClient 进行连接池可以提高性能。然而,在我的测试中,响应时间实际上增加了。我很想知道这可能是什么原因造成的。
我认为使用连接池可以减少API调用时间的原因如下:
连接重用:
减少连接开销:
并发管理:
保持活动利用率:
资源效率:
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 在大多数情况下花费了更多时间。
您提供的链接使用此依赖性:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.14</version>
</dependency>
现在了解配置和默认设置至关重要。
Apache HttpClient 中的连接管理是指对远程服务器底层连接的管理。高效的连接管理对于优化性能和资源利用率至关重要。 Apache HttpClient 提供了用于配置连接管理的各种选项。
在此库中
PoolingHttpClientConnectionManager
管理客户端连接池,并能够为来自多个执行线程的连接请求提供服务。它根据路由来汇集连接。它维护每条路由的最大连接数和总数。默认情况下,它为每个给定路由创建最多 2 个并发连接,总共最多创建 20 个连接。对于实际应用程序,我们可以根据需要增加这些限制。
根据该信息,您可以调整和增加
2
并发连接到更多 - 测试是否准确。
还要检查总连接数的设置。
我没有看到这些选项的默认更改。 您需要根据自己的需要尝试自行更改。