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