原文地址:https://www.jianshu.com/p/6166d28983a2
複用連接池
相關的主要三個類
- RealConnection
- ConnectionPool
- StreamAllocation
對流的處理使用Okio,Okio是okhttp中用於處理io的模塊,沒接觸過的讀者可以參考這篇文章:https://www.jianshu.com/p/f5941bcf3a2d
RealConnection 要點
- 代表着鏈接socket的鏈路,如果擁有了一個RealConnection就代表了我們已經跟服務器有了一條通信鏈路
- 實現了三次握手等操作。
- 一個鏈接對應多個流,鏈接和流的對應關係通過StreamAllocation來記錄。
ConnectionPool 要點
管理http和http/2的鏈接,以便減少網絡請求延遲。同一個address將共享同一個connection。該類實現了複用連接的目標。
- ConnectionPool內部以隊列方式存儲連接
- 連接池最多維持5個連接,且每個鏈接最多活5分鐘
- 每次添加鏈接的時候回執行一次清理任務,清理空閒的鏈接。
StreamAllocation 要點
StreamAllocation 協調了三者的關係:鏈接、流和回調。
這裏談一下對StreamAllocation的個人理解。
比如我要創建一個流,是需要當前的Connection的,甚至如果當前沒有Connection,我是需要知道當前的ConnectionPool的。
這種邏輯的代碼無論是寫在RealConnection還是ConnectionPool還是Steam中都是不合理的,因此StreamAllocation中就處理了協調這些類的邏輯。
- 一個StreamAllocation中包括一個Steam和一個Connection。
- StreamAllocation中的方法包括:newStream(創建流),findHealthyConnection(找到可用的鏈接),streamFinished(關閉流),releaseIfNoNewStreams(釋放鏈接)等等。