httpclient實現http連接池

HTTP連接池是一種優化網絡通信性能的技術,通過復用已建立的TCP連接減少重復握手開銷,提升資源利用率。以下是關鍵要點:

核心原理與優勢

  1. ?連接復用機制?

    • 維護活躍連接隊列,避免每次請求重復TCP三次握手/SSL協商,降低延遲。
    • 典型場景:高頻短請求(如API調用)性能提升可達300%。
  2. ?資源控制能力?

    • 限制最大連接數防止服務端過載,支持動態擴容應對流量峰值。
    • 內置連接有效性檢測與自動重試,增強健壯性。

----------------

?HttpClientConfig?配置中,使用了?Apache HttpClient 的?PoolingHttpClientConnectionManager?作為連接池管理器。其連接釋放規則主要由以下幾個方面決定:

1.?連接的生命周期

  • 空閑連接:連接池會自動管理空閑連接。當連接長時間未被使用時,連接池可以關閉這些空閑連接以釋放資源。
  • 過期連接:如果服務器關閉了連接(比如?Keep-Alive 超時),連接池會檢測到并清理這些已失效的連接。

2. 連接釋放的時機

  • 請求完成后:當你通過?CloseableHttpClient?執行完一次?HTTP 請求后,連接不會被關閉,而是被“歸還”到連接池中,供下次復用。
  • 顯式關閉:如果你手動調用了?CloseableHttpResponse.close(),會釋放底層連接到連接池。
  • 連接池自動清理:連接池會定期清理已過期或空閑時間過長的連接(需要在應用中顯式調用?closeExpiredConnections()?和?closeIdleConnections(),或者通過后臺線程自動清理)。

3.?相關參數

  • setMaxTotal(50):連接池最大連接數為 50。
  • setDefaultMaxPerRoute(20):每個路由(目標主機)最大連接數為 20。
  • (可選)RequestConfig?的超時設置(如連接超時、請求超時、讀取超時)會影響連接的生命周期,但不會直接導致連接被關閉,只是影響請求的超時行為。

4. 連接池釋放的最佳實踐

  • 及時關閉響應:每次請求后,務必關閉?CloseableHttpResponse,否則連接不會被歸還到池中,可能導致連接泄漏。
  • 定期清理:可以通過定時任務調用?PoolingHttpClientConnectionManager?的?closeExpiredConnections()?和?closeIdleConnections(long?idleTime, TimeUnit?t)?方法,清理無效連接。

1、引入pom

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

2、監控連接池情況

import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import javax.annotation.Resource;@Component
public class HttpClientPoolMonitor {@Resourceprivate PoolingHttpClientConnectionManager manager;@Scheduled(fixedRate = 5000)public void reportStats() {int total = manager.getTotalStats().getLeased() + manager.getTotalStats().getAvailable();System.out.println("[HttpClientPool] Leased: " + manager.getTotalStats().getLeased()+ ", Available: " + manager.getTotalStats().getAvailable()+ ", Max: " + manager.getMaxTotal()+ ", Total: " + total);int a = 0;}
} 

在HttpClient連接池中,這些參數分別表示以下含義:

  1. ?Leased?:當前正在被使用的連接數量,反映活躍連接狀態
  2. ?Available?:連接池中可立即復用的空閑連接數量
  3. ?Max?:連接池允許創建的最大連接總數(maxTotal),控制總體資源消耗
  4. ?Total?:當前連接池中連接總數(Leased + Available),反映實際連接占用情況

連接池的關鍵工作機制:

  • 當Leased達到Max時,新請求需要等待可用連接
  • Available連接會被優先復用,減少新建連接開銷
  • 合理設置Max值需要平衡并發需求和系統資源

3、連接池配置

import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class HttpClientConfig {@Beanpublic PoolingHttpClientConnectionManager poolingHttpClientConnectionManager() {PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager();manager.setMaxTotal(50); // 最大連接數manager.setDefaultMaxPerRoute(20); // 每個路由最大連接數return manager;}/*   @Beanpublic CloseableHttpClient httpClient(PoolingHttpClientConnectionManager manager) {return HttpClients.custom().setConnectionManager(manager).build();}*///設置超時時間@Beanpublic CloseableHttpClient httpClient(PoolingHttpClientConnectionManager manager) {RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(2000).setConnectionRequestTimeout(2000).setSocketTimeout(2000).build();return HttpClients.custom().setConnectionManager(manager).setDefaultRequestConfig(requestConfig).build();}
} 

4、demo

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;@Service
public class HttpClientDemoService {@Resourceprivate CloseableHttpClient httpClient;public String doGet(String url) {try {HttpGet request = new HttpGet(url);try (CloseableHttpResponse response = httpClient.execute(request)) {BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));StringBuilder result = new StringBuilder();String line;while ((line = reader.readLine()) != null) {result.append(line);}return result.toString();}} catch (Exception e) {e.printStackTrace();return null;}}
//超時設置
public String doGet2(String url) {try {// 設置超時時間RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000)      // 連接超時,單位毫秒.setConnectionRequestTimeout(3000) // 從連接池獲取連接超時.setSocketTimeout(10000)      // 讀取超時.build();HttpGet request = new HttpGet(url);request.setConfig(requestConfig);try (CloseableHttpResponse response = httpClient.execute(request)) {BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));StringBuilder result = new StringBuilder();String line;while ((line = reader.readLine()) != null) {result.append(line);}return result.toString();}} catch (Exception e) {e.printStackTrace();return null;}
}@Scheduled(fixedRate = 50)public void scheduledTask() {// System.out.println("new Date() = " + new Date());// System.out.println("a + new Date() = " + a + new Date());for (int i = 0; i < 10; i++) {new Thread(this::callHTttp).start();}}public void callHTttp(){String url = "http://127.0.0.1:8080/api/producer/send?message=HelloWorld!";url = "https://devapi.qweather.com/v7/weather/3d?location=北京&key=YOUR_KEY";url = "http://127.0.0.1:7700/openApi/test";String a =  doGet(url);System.out.println("a = " +a);}
} 

5、定時調用http

import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(RestTemplateBuilder builder) {return builder.build();}
}import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;@RestController
public class TestController {public String test(){return "hello world";}@Resourceprivate RestTemplate restTemplate;@GetMapping("/api/producer/send")public String send() {return "Message sent!";}@Scheduled(fixedRate = 5000)public void scheduledTask() {String url = "http://127.0.0.1:8080/api/producer/send?message=Hello, World!";//String result = restTemplate.getForObject(url, String.class);//System.out.println("HTTP GET Response: " + result);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85642.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

廣義焦點丟失:學習用于密集目標檢測的合格和分布式邊界盒之GFL論文閱讀

摘要 一階段檢測器通常將目標檢測形式化為密集的分類與定位(即邊界框回歸)問題。分類部分通常使用 Focal Loss 進行優化,而邊界框位置則在狄拉克δ分布下進行學習。最近,一階段檢測器的發展趨勢是引入獨立的預測分支來估計定位質量,所預測的質量可以輔助分類,從而提升檢…

Real-World Deep Local Motion Deblurring論文閱讀

Real-World Deep Local Motion Deblurring 1. 研究目標與實際問題意義1.1 研究目標1.2 實際問題1.3 產業意義2. 創新方法:LBAG模型與關鍵技術2.1 整體架構設計2.2 關鍵技術細節2.2.1 真實模糊掩碼生成(LBFMG)2.2.2 門控塊(Gate Block)2.2.3 模糊感知補丁裁剪(BAPC)2.3 損…

【Docker基礎】Docker鏡像管理:docker commit詳解

目錄 引言 1 docker commit命令概述 1.1 什么是docker commit 1.2 使用場景 1.3 優缺點分析 2 docker commit命令詳解 2.1 基本語法 2.2 常用參數選項 2.3 實際命令示例 2.4 提交流程 2.5 步驟描述 3 docker commit與Dockerfile構建對比 3.1 構建流程對比 3.2 對…

可調式穩壓二極管

1.與普通穩壓二極管的比較&#xff1a; 項目普通穩壓二極管可調式穩壓二極管&#xff08;如 TL431&#xff09;輸出電壓固定&#xff08;如5.1V、3.3V&#xff09;可調&#xff08;2.5V ~ 36V&#xff0c;取決于外部分壓&#xff09;精度低&#xff08;5%~10%&#xff09;高&a…

Kafka使用Elasticsearch Service Sink Connector直接傳輸topic數據到Elasticsearch

鏈接&#xff1a;Elasticsearch Service Sink Connector for Confluent Platform | Confluent Documentation 鏈接&#xff1a;Apache Kafka 一、搭建測試環境 下載Elasticsearch Service Sink Connector https://file.zjwlyy.cn/confluentinc-kafka-connect-elasticsearch…

訊方“教學有方”平臺獲華為昇騰應用開發技術認證!

教學有方 華為昇騰應用開發技術認證 權威認證 彰顯實力 近日&#xff0c;訊方技術自研的教育行業大模型平臺——“教學有方”&#xff0c;成功獲得華為昇騰應用開發技術認證。這一認證不僅是對 “教學有方” 平臺技術實力的高度認可&#xff0c;更標志著訊方在智慧教育領域的…

保護你的Electron應用:深度解析asar文件與Virbox Protector的安全策略

在現代軟件開發中&#xff0c;Electron框架因其跨平臺特性而備受開發者青睞。然而&#xff0c;隨著Electron應用的普及&#xff0c;如何保護應用中的核心資源文件——asar文件&#xff0c;成為了開發者必須面對的問題。今天&#xff0c;我們將深入探討asar文件的特性&#xff0…

端口安全配置示例

組網需求 如圖所示&#xff0c;用戶PC1、PC2、PC3通過接入設備連接公司網絡。為了提高用戶接入的安全性&#xff0c;將接入設備Router的接口使能端口安全功能&#xff0c;并且設置接口學習MAC地址數的上限為接入用戶數&#xff0c;這樣其他外來人員使用自己帶來的PC無法訪問公…

零基礎RT-thread第四節:電容按鍵

電容按鍵 其實只需要理解&#xff0c;手指按上去后充電時間變長&#xff0c;我們可以利用定時器輸入捕獲功能計算充電時間&#xff0c;超過無觸摸時的充電時間一定的閾值就認為是有手指觸摸。 基本原理就是這樣&#xff0c;我們開始寫代碼&#xff1a; 其實&#xff0c;看過了…

SQL基礎操作:從增刪改查開始

好的&#xff01;SQL&#xff08;Structured Query Language&#xff09;是用于管理關系型數據庫的標準語言。讓我們從最基礎的增刪改查&#xff08;CRUD&#xff09;?? 操作開始學習&#xff0c;我會用簡單易懂的方式講解每個操作。 &#x1f6e0; 準備工作&#xff08;建表…

vim 編輯模式/命令模式/視圖模式常用命令

以下是一份 Vim 命令大全&#xff0c;涵蓋 編輯模式&#xff08;Insert Mode&#xff09;、命令模式&#xff08;Normal Mode&#xff09; 和 視圖模式&#xff08;Visual Mode&#xff09; 的常用操作&#xff0c;適合初學者和進階用戶使用。 &#x1f9fe; Vim 模式簡介 Vim…

每天看一個Fortran文件(10)

今天來看下MCV模式調用物理過程的相關代碼。我想改進有關于海氣邊界層方面的內容&#xff0c;因此我尋找相關的代碼&#xff0c;發現在physics目錄下有一個sfc_ocean.f的文件。 可以看見這個文件是在好多好多年前更新的了&#xff0c;里面內容不多&#xff0c;總共146行。是計算…

python打卡day37

疏錦行 知識點回顧&#xff1a; 1. 過擬合的判斷&#xff1a;測試集和訓練集同步打印指標 2. 模型的保存和加載 a. 僅保存權重 b. 保存權重和模型 c. 保存全部信息checkpoint&#xff0c;還包含訓練狀態 3. 早停策略 作業&#xff1a;對信貸數據集訓練后保存權重&#xf…

【Spark征服之路-2.9-Spark-Core編程(五)】

RDD行動算子&#xff1a; 行動算子就是會觸發action的算子&#xff0c;觸發action的含義就是真正的計算數據。 1. reduce ? 函數簽名 def reduce(f: (T, T) > T): T ? 函數說明 聚集 RDD 中的所有元素&#xff0c;先聚合分區內數據&#xff0c;再聚合分區間數據 val…

【入門】【練17.3 】比大小

| 時間限制&#xff1a;C/C 1000MS&#xff0c;其他語言 2000MS 內存限制&#xff1a;C/C 64MB&#xff0c;其他語言 128MB 難度&#xff1a;中等 分數&#xff1a;100 OI排行榜得分&#xff1a;12(0.1分數2難度) 出題人&#xff1a;root | 描述 試編一個程序&#xff0c;輸入…

CppCon 2017 學習:Free Your Functions!

“Free Your Functions!” 這句話在C設計中有很深的含義&#xff0c;意思是&#xff1a; “Free Your Functions!” 的理解 “解放你的函數”&#xff0c;鼓勵程序員&#xff1a; 不要把所有的函數都綁在類的成員函數里&#xff0c;優先考慮寫成自由函數&#xff08;non-mem…

日常運維問題匯總-19

60. OVF3維護成本中心與訂貨原因之間的對應關系時&#xff0c;報錯提示&#xff0c;SYST: 不期望的日期 00/00/0000。消息號 FGV004&#xff0c;如下圖所示&#xff1a; OVF3往右邊拉動&#xff0c;有一個需要填入的字段“有效期自”&#xff0c;此字段值必須在成本中心定義的有…

2025SCA工具推薦︱基于多模態SCA的新一代開源供應鏈風險審查與治理平臺

近年來&#xff0c;隨著開源軟件在企業數字化轉型中的廣泛應用&#xff0c;開源供應鏈攻擊事件頻發&#xff0c;企業普遍面臨三大突出難題&#xff1a;一是不清楚自身引入了哪些開源組件&#xff0c;二是不掌握組件中潛在的安全漏洞和合規風險&#xff0c;三是缺乏自動化、全流…

CppCon 2017 學習:Migrating a C++03 library to C++11 case study

這段內容是在介紹 Wt&#xff08;發音類似 “witty”&#xff09; —— 一個用于 C 的 Web UI 框架。總結如下&#xff1a; 什么是 Wt&#xff1f; Wt 是一個 用 C 編寫的 widget&#xff08;控件&#xff09;驅動的 Web 框架。類似于桌面 GUI 框架&#xff08;比如 Qt&#…

coding習慣 + Bug記錄整理

&#x1f4d6; 清單 1、包裝類型導致的NPE2、xxApiWrapper命名3、see注釋4、MySQL模糊匹配特殊字符bug 整理些平時不好的coding習慣導致的bug&#x1f4dd; 1、包裝類型導致的NPE 處理項目的一個bug&#xff0c;看日志是發生了空指針&#xff0c;相關代碼如下&#xff1a; D…