httpclient基礎知識

易曉雙發表於2018-01-31

本文的目的是梳理http請求流程,以及httpclient框架的http請求的封裝。 參考:https://juejin.im/entry/58a7aaba570c3500699e5cbd?utm_medium=fe&utm_source=weixinqun&from=timeline https://yq.aliyun.com/articles/93801?spm=a2c4e.11153940.blogcont294.12.648bdd298ZEUyC http://blog.csdn.net/zjysource/article/details/52945494

1.各種客戶端都可以發起http請求,如瀏覽器,也可以通過java等客戶端語言去模擬。
2.TCP/IP 是傳輸層協議,http協議是其之上的 應用層 協議,更偏重於實現。

3.封裝httpclient物件+請求物件(get/post)後,執行請求邏輯。同時hc也提供了幾種請求體,例如StringEntity, ByteArrayEntity, InputStreamEntity, FileEntity. 

    3.1 InternalHttpClient://請求的鏈路執行chain,
        HttpRoute route1 = this.determineRoute(target, httpException, localcontext);
        return this.execChain.execute(route1, httpException, localcontext, execAware);

4.hc介面概覽

    4.1 hc介面代表了http請求執行的核心協議,使用者提供請求物件交給htc執行,hc負責把請求物件傳遞給伺服器,然後返回響應物件,或者丟擲異常。
    4.2 hc作為facde,把具體實現的細節交給了handlers和strategies,
        以及execchain。
    4.3 hc例項是執行緒安全的,鼓勵hc例項的重用,對於不再使用的CloseableHttpClient,要關閉。
複製程式碼

調優方向 瞭解了架構原理後,就可以著手在3個方向進行調優:

  1. 連線數,通過設立全域性最大連線數和單route連線數,增加吞吐能力。使用者可通過HttpClientBuilder#maxConnTotal和#maxConnPerRoute分別設定。
  2. 獲取連線的超時時間,調小超時時間能夠有效提高響應速度並且降低積壓請求量,但相應的也會增加請求失敗的機率。使用者可以通過RequestConfig的connectionRequestTimeout進行設定。
  3. 建立連線和route響應的超時時間,調小能夠有效的降低bad request對連線的佔用,留給質量更好的請求,有效提高系統提高吞吐能力及響應速度。否則有可能在峰值期被慢請求佔滿連線池,導致系統癱瘓。兩者分別可通過RequestConfig#connectionTimeout和socketTimeout進行設定。
  4. 開啟BackoffStrategyExec,對狀況差的route進行降級處理,將連線讓給其他route。