CloseableHttpClient 連接超時(shí) 失敗 資源釋放 最大連接數(shù)

CloseableHttpClient填坑經(jīng)歷 資源回收 最大連接數(shù)

因?yàn)轫?xiàng)目中的一些原因管宵,部分網(wǎng)絡(luò)請(qǐng)求無(wú)法使用封裝好的RestTemplate,只好使用CloseableHttpClient壹瘟,這才有了以下的填坑經(jīng)歷钾唬,如果可以司顿,這些知識(shí)點(diǎn)學(xué)習(xí)就好馅扣,項(xiàng)目中還是使用封裝好的組件比較妥當(dāng)。

問(wèn)題場(chǎng)景:

在使用CloseableHttpClient的請(qǐng)求中娘侍,都是一樣的請(qǐng)求咖刃,只是會(huì)分發(fā)到不同的服務(wù)器,在這些服務(wù)器中憾筏,唯獨(dú)有一臺(tái)服務(wù)器在一些操作之后嚎杨,到該服務(wù)器的連接都失敗嗎,報(bào)504 Gateway Timeout氧腰;

經(jīng)過(guò)排查枫浙,排除了服務(wù)器的原因;

后續(xù)測(cè)試發(fā)現(xiàn)古拴,是若到某個(gè)服務(wù)器的某些請(qǐng)求因?yàn)槟承┰蚴纱魏舐嶂悖罄m(xù)到該服務(wù)器的請(qǐng)求都將失敗,而到該服務(wù)器的其他請(qǐng)求依舊正常黄痪;

問(wèn)題原因

具體分析過(guò)程不再贅述紧帕,直接上結(jié)果:

在CloseableHttpClient中,有最大連接數(shù)的限制桅打,默認(rèn)值為:

1是嗜、 單個(gè)Host域名,最大連接數(shù)為2挺尾;

2鹅搪、 整個(gè)客戶端內(nèi),總共最大連接數(shù)為20遭铺;

上面第一點(diǎn)是最騷的丽柿,竟然還會(huì)限制單個(gè)域名下的請(qǐng)求數(shù)恢准,一下就和問(wèn)題場(chǎng)景對(duì)上了;

問(wèn)題修復(fù)

修復(fù)一:改連接數(shù)限制

經(jīng)過(guò)分析甫题,很明顯直接把默認(rèn)的請(qǐng)求數(shù)限制改大一點(diǎn)就能解決問(wèn)題:

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(XXX);//連接池最大并發(fā)連接數(shù)
cm.setDefaultMaxPerRoute(XXX);//單域名下最大連接數(shù)
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();

但是這治標(biāo)不治本顷歌,不從根本找出連接被占滿的原因,再大的連接限制也終究是會(huì)被撐爆的幔睬,且看改進(jìn)。

修復(fù)二:

我的實(shí)現(xiàn)是一個(gè)請(qǐng)求函數(shù)芹扭,其內(nèi)部基本是下面這樣的

String errMsg;
HttpResponse response = closeableHttpClient.execute(myRequest);
HttpEntity resEntity = response.getEntity();
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK && resEntity != null) {
    return EntityUtils.toString(resEntity, StandardCharsets.UTF_8);
} else {
    LOG.debug(JSON.toJSONString(response));
    errMsg = response.getStatusLine().getReasonPhrase();
}
throw new HttpException(errMsg);

很顯然麻顶,平時(shí)使用Connection的話需要手動(dòng)關(guān)閉的連接這邊都沒有出現(xiàn),那么怎么關(guān)閉呢舱卡?

在CloseableHttpClient內(nèi)部是一個(gè)連接池辅肾,我們請(qǐng)求結(jié)束后,需要盡快釋放連接轮锥,避免后面的請(qǐng)求因?yàn)闆]有連接阻塞超時(shí)矫钓,最終失敗,而釋放連接可以從三個(gè)方面入手:

  • 在execute(httpRequest)中舍杜,httpRequest是可以關(guān)閉的新娜,httpRequest.releaseConnection();
  • HttpResponse response = closeableHttpClient.execute(myRequest)中,execute的response是繼承了Closeable的既绩,HttpResponse 改為CloseableHttpResponse概龄,并在請(qǐng)求結(jié)束后主動(dòng)關(guān)閉;
  • HttpEntity resEntity = response.getEntity();饲握,這里的resEntity內(nèi)部實(shí)際上有一個(gè)輸入流私杜,我們?cè)?code>EntityUtils.toString(resEntity, StandardCharsets.UTF_8);已經(jīng)將該流關(guān)閉了,而若請(qǐng)求失敗的話救欧,則沒有被關(guān)閉的操作衰粹,所以可以調(diào)用EntityUtils.consumeQuietly(resEntity);主動(dòng)關(guān)閉

所以,在源頭上避免連接被耗盡笆怠,我們需要及時(shí)釋放資源铝耻,以上修改完成代碼如下:

String errMsg;
// 自動(dòng)關(guān)閉返回
try (CloseableHttpResponse response = closeableHttpClient.execute(signedRequest)){
    HttpEntity resEntity = response.getEntity();
    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK 
        && resEntity != null) {
        // toString方法內(nèi)已關(guān)閉流
        return EntityUtils.toString(resEntity, StandardCharsets.UTF_8);  
    } else {
        // 主動(dòng)關(guān)閉內(nèi)部的輸入流
        EntityUtils.consumeQuietly(resEntity); 
        LOG.debug(JSON.toJSONString(response));
        errMsg = response.getStatusLine().getReasonPhrase();
    }
} catch (Exception e){
    // do your business
} finally {
    // 主動(dòng)釋放連接
    signedRequest.releaseConnection(); 
}
throw new HttpException(errMsg);

總結(jié)

經(jīng)過(guò)以上第一種修改,相當(dāng)于客戶端容量增大了骑疆,能更好的容忍請(qǐng)求時(shí)間較長(zhǎng)田篇、并發(fā)數(shù)大等情況,而第二種修改則從源頭上保證了每個(gè)連接使用的高效性箍铭,避免無(wú)用連接占用資源泊柬,請(qǐng)求結(jié)束后都能夠得到有效釋放,二者結(jié)合诈火,將最大程度的提高服務(wù)器的并發(fā)數(shù)兽赁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末状答,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子刀崖,更是在濱河造成了極大的恐慌惊科,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亮钦,死亡現(xiàn)場(chǎng)離奇詭異馆截,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蜂莉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蜡娶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人映穗,你說(shuō)我怎么就攤上這事窖张。” “怎么了蚁滋?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵宿接,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辕录,道長(zhǎng)睦霎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任踏拜,我火速辦了婚禮碎赢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘速梗。我一直安慰自己肮塞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布姻锁。 她就那樣靜靜地躺著枕赵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪位隶。 梳的紋絲不亂的頭發(fā)上拷窜,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音涧黄,去河邊找鬼篮昧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛笋妥,可吹牛的內(nèi)容都是我干的懊昨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼春宣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酵颁!你這毒婦竟也來(lái)了嫉你?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤躏惋,失蹤者是張志新(化名)和其女友劉穎幽污,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體簿姨,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡距误,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扁位。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片深寥。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贤牛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情则酝,我是刑警寧澤殉簸,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站沽讹,受9級(jí)特大地震影響般卑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爽雄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一蝠检、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挚瘟,春花似錦叹谁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至订框,卻和暖如春析苫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背穿扳。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工衩侥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矛物。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓茫死,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親泽谨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子璧榄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 第二章 連接管理 HttpClient有一個(gè)對(duì)連接初始化和終止特漩,還有在活動(dòng)連接上I/O操作的完整控制。而連接操作的...
    狂奔的蝸牛_wxc閱讀 1,160評(píng)論 0 0
  • Getting Started Burp Suite 是用于攻擊web 應(yīng)用程序的集成平臺(tái)骨杂。它包含了許多工具涂身,并為...
    Eva_chenx閱讀 28,713評(píng)論 0 14
  • 參考資源 官網(wǎng) 國(guó)內(nèi)博客 GitHub官網(wǎng) 鑒于一些關(guān)于OKHttp3源碼的解析文檔過(guò)于碎片化,本文系統(tǒng)的搓蚪,由淺入...
    風(fēng)骨依存閱讀 12,521評(píng)論 11 82
  • 最近總是忘記很多事情 因?yàn)槲业哪X容量太小 除了想你 再也裝不下其它
    妖顏冫惑眾閱讀 171評(píng)論 0 0
  • 相親苦蛤售,相親累,相了半天不般配妒潭。 又搭煙悴能,又搭糖,搭來(lái)搭去還是黃雳灾。 父母跟漠酿,家人隨,七嘴八舌直皺眉谎亩。 有說(shuō)壞炒嘲,有說(shuō)...
    讀者愛之成就閱讀 222評(píng)論 0 0