OkHttpの原理と仕組みの説明
この記事へのリンク: https://blog.csdn.net/feather_wch/article/details/131767285
1. OkHttp の原理とメカニズムは何ですか?
- デザインパターンの適用:ビルダーパターン、外観パターン、責任連鎖パターン
- 全体的なプロセス
- ディストリビュータ (スケジューリングメカニズム)
- TCPリンク多重化(多重化メカニズム)
- インターセプタープロセス
- キャッシュメカニズム
2.HTTP 1.1とHTTP 2.0の違い
- 1.1 キープアライブ、シリアル、順序付け -> 順序はテキストに基づいており、順序付けする必要があります
- 2.0 ヘッダー圧縮 (小さい)、ServerPush (サーバー アクティブ プッシュ)、多重化、並列処理、バイナリ データ フレームの使用から派生 (シーケンス フラグのストレージ)
3. OkHttp リクエストの全体的なプロセス
flowchart TD
OkHttpClient --newCall 参数Request--> RealCall --execute/enqueue--> Dispatcher --> Intercepter --> Response
4. ディストリビューター (スケジューリング機構)
- 同期: インターセプタプロセスを直接実行します。
- 非同期: スレッドプールに送信して実行します
- スケジューラの内部メンバー:
- 同時非同期リクエストの最大数、64
- 同じホストへの同時非同期リクエストの数、5
- スレッドプール
- 非同期待機キュー
- 非同期実行キュー
- 同期実行キュー
- スレッド プール: core=0、max=65535、waitTime=60s、queue=no Capacity、CacheThreadPool と同等
- リクエストがあり、60秒が経過したらスレッドを作成します
- スレッドの最大数は無制限、64 = 64
- タスクの実行後、finish() がクリーニング作業を実行します。
- 同期/非同期はキューの外にある必要があります
- 非同期: 64 および 5 に従って計算します。
- PromotionCalls() メソッドはリクエストを再スケジュールします。
5. スケジューリング機構、非同期リクエスト処理
- 同時に非同期リクエストが 64 個以下で、同じホストからのリクエストの数が 5 個を超えない場合、リクエストは開始され、非同期実行キューに入れられます。
- 条件が満たされない場合は、待機するために非同期待機キューに配置されます。
- 非同期リクエストが完了したら、finish() を実行して作業をクリーンアップし、64 と 5 の 2 つの条件を確認します。条件が満たされている場合は、promoteCalls() が呼び出されてリクエストが再スケジュールされます。
6. インターセプター + 責任の連鎖
- *カスタム ユーザー インターセプター: 印刷可能なログ、addInterceptor
- 再試行リダイレクト インターセプタ: 1. プロトコル 2. タイムアウト 3. IO 例外 4. SSL 例外 (SecureSocketLayer セキュリティ プロトコル)
- ブリッジング インターセプタ: Gzip、Cookie
- キャッシュインターセプタ: キャッシュメカニズム
- 接続インターセプター: ターゲット RealConnection との接続を開きます (ソケットとソケット接続プールをカプセル化します)。
- *カスタム ネットワーク インターセプター: addNetworkInterceptor
- リクエスト サービス インターセプタ: データ書き込み + flashRequest (実際にリクエストを送信)
TCP接続多重化メカニズム
8. OkHttp 接続プールと接続多重化メカニズム
- 接続多重化メカニズムは、ConnectionPool クラスに基づいて実装されます。
- ConnectionPool クラスは、アイドル状態の RealConnection オブジェクトを格納するための両端キューを維持します。
- RealConnection オブジェクトは、複数のリクエストで共有できる TCP 接続を表します。3⁴
- ユーザーがリクエストを開始すると、OKHTTP はまず接続プール内に要件を満たすアイドル状態の接続があるかどうかを確認します。存在する場合は、その接続を直接使用してリクエストを送信します。存在しない場合は、新しい接続を作成して接続プールに追加します。
- クリーンアップ メカニズム: OKHTTP はバックグラウンド スレッドを使用して、アイドル状態の接続を定期的にクリーンアップします。洗浄条件は次のとおりです。
- 接続が 5 分以上アイドル状態の場合
- または、接続プール内のアイドル接続の数が 5 を超えています
キャッシュメカニズム
9. キャッシュの仕組み
- 強力なキャッシュ: リクエストを送信しない、フィールドの有効期限が切れる
- ネゴシエーション キャッシュ: 304 はキャッシュが利用可能であることを示します
- データ、有効期限、最終更新日、ETag
10. キャッシュメカニズムの詳細な分析
- OkHttp のキャッシュ メカニズムは、HTTP のキャッシュ メカニズムに従って実装されています。OkHttp の特定のデータ キャッシュ ロジックは、 DiskLruCache を使用して実装されるCacheクラスにカプセル化されています。¹3
- デフォルトでは、OkHttp はデータをキャッシュしません。OkHttpClientを構築するときにCacheオブジェクトを設定し、そのコンストラクターでキャッシュ ディレクトリとキャッシュ サイズを指定できます。¹3
- OkHttp は、 CacheControlを通じて均一に設定されるオプションのキャッシュ戦略のバッチを提供し、コンストラクターを通じてキャッシュ戦略を確認できます。²
- HTTP のキャッシュ メカニズムは、強力なキャッシュとネゴシエーション キャッシュに分かれています。これら 2 つのキャッシュの実装は、 HTTP プロトコルのヘッダー情報のフィールドを通じて制御され、有効期限に応じてローカル キャッシュからデータを直接ロードするかどうかが判断されます。⁴