<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version><!-- or the latest version --> </dependency>
@Bean public CloseableHttpClient httpClient() { return HttpClientBuilder.create() .setMaxConnTotal(100) // Set required maximum total connections .setMaxConnPerRoute(20) // Set required maximum connections per route .build(); }
@Bean public RestTemplate restTemplate() { returnnewRestTemplate(newHttpComponentsClientHttpRequestFactory(httpClient())); }
設定 Connection Pool Manager
在 OSI 網路七層協定中,HTTP 是建構於 TCP 之上的通訊協定,如果每次請求都需要重新建立一次 Connection , 想必會非常的消耗資源 (TCP 三向交握的關係) 。因此 Apache Http Client 提供了 Connection Pool (連線池的機制) 。
概念上與 AP Server 在跟資料庫連線時的 Connection Pool 類似,都是先 Keep 住 Connection 不立即關閉,等下次有 Request 來時就會借用那個 Connection 來發送請求,大幅減少了每個 Request 都需要花費建立 Connection 的資源 。
至於如何設定請看下面程式碼說明
1 2 3 4 5 6 7 8 9
@Bean public PoolingHtppClientConnectionManager customizedPoolingHtppClientConnectionManager(){ /* 設定每個Connection 在Connection Pool 中的維持時間 , 範例為 5分鐘 , 此參數須小心設定 */ PoolingHtppClientConnectionManagerconnManager=newPoolingHtppClientConnectionManager(5, TimeUnit.MINUTES); connManager.setMaxTotal(100); // Set required maximum total connections connManager.setDefaultMaxPerRoute(20); // Set required maximum connections per route }
max total : connection Pool 最大的總連線數量,預設為 20
defaultMaxPerRoute: 每個路徑最大的連線數量,預設為 2
設定 Keep Alive 機制
在 HTTP 中,Keep -Alive 的機制為讓一個 Connection 在一定時間內可以發送多個 Request 。為了避免 server side 已關閉連線,但 client 端卻還是維持該 Connection 的情況 (Connection Reset by Peer)。透過設定 Keep -Alive Header 來告知 Http Client Connection 要維持的時間。
// Determines the timeout in milliseconds until a connection is established. privatestaticfinalintCONNECT_TIMEOUT=30000; // The timeout when requesting a connection from the connection manager. privatestaticfinalintREQUEST_TIMEOUT=30000; // The timeout for waiting for data privatestaticfinalintSOCKET_TIMEOUT=60000;