如何做到复用
把CloseableHttpClient声明为static,只创建一次,并在JVM关闭前通过addShutdownHook钩子关闭连接池,在使用的时候直接使用CloseableHttpClient即可,无需每次都创建。
定义一个case2接口实现服务端接口调用:
定义个case3接口,修复之前按需创建CloseableHttpClient的代码,每次用完后确保连接池可关闭
使用wrk对case2和case3分别压测60s,可见两种使用方式的性能差异:
- 每次创建连接池的QPS是725
➜ ~ wrk -c1 -t1 -d 10s http://localhost:30666/httpclientnotreuse/case3 Running 10s test @ http://localhost:30666/httpclientnotreuse/case3 1 threads and 1 connections Thread Stats Avg Stdev Max +/- Stdev Latency 1.75ms 2.94ms 39.59ms 97.61% Req/Sec 728.82 170.53 0.95k 69.00% 7260 requests in 10.00s, 816.67KB read Requests/sec: 725.78 Transfer/sec: 81.64KB
- 复用连接池的QPS是2515
➜ ~ wrk -c1 -t1 -d 10s http://localhost:30666/httpclientnotreuse/case2 Running 10s test @ http://localhost:30666/httpclientnotreuse/case2 1 threads and 1 connections Thread Stats Avg Stdev Max +/- Stdev Latency 411.81us 387.15us 11.83ms 97.72% Req/Sec 2.53k 193.26 2.76k 83.17% 25428 requests in 10.10s, 2.79MB read Requests/sec: 2517.61 Transfer/sec: 283.21KB
大的性能差距就在于TCP连接的复用。定义连接池时,我将最大连接数设置为1。所以,复用连接池方式复用的始终应该是同一个连接,而新建连接池方式应该是每次都会创建新的TCP连接。

