DUICUO

Spring Cloud OpenFeign の 5 つの最適化のヒント!

著者 | 雷歌

ソース | Java Chinese Community (ID: javacn666)

転載許可については、当社(WeChat ID: GG_Stone)までご連絡ください。

OpenFeignは、Springが公式にリリースした宣言的なサービス呼び出しおよび負荷分散コンポーネントです。現在は廃止されたFeign(Netflix Feign)の代替として開発され、Springのトップレベルのオープンソースプロジェクトでもあります。私たちは日々の開発でOpenFeignを頻繁に使用しており、設定後にパフォーマンスを向上させるための便利なヒントやコツがいくつかあります。この記事ではこれらのヒントを詳しく紹介します(コメント欄にご意見・ご提案を自由にお寄せください)。

I. タイムアウトの最適化

OpenFeign は Ribbon フレームワークを基盤アーキテクチャとして使用し、Ribbon のリクエスト接続タイムアウトとリクエスト処理タイムアウトを自身のタイムアウトとして使用します。Ribbon のデフォルトのリクエスト接続タイムアウトとリクエスト処理タイムアウトはどちらも 1 秒です。次のソースコードを参照してください。

OpenFeign を使用してサービス インターフェイスを 1 秒以上呼び出すと、次のエラーが発生します。

1秒は確かに短すぎるため、ビジネスロジックを正しく処理できるように、OpenFeignのタイムアウトを手動で設定する必要があります。OpenFeignのタイムアウトを変更するには、以下の2つの方法があります。

  1. リボンのタイムアウトを変更すると、OpenFeign のタイムアウトがパッシブに変更されます。
  2. OpenFeign のタイムアウトを直接変更します (推奨)。

1. リボンのタイムアウトを設定する

プロジェクト構成ファイル application.yml に次の構成を追加します。

 リボン
ReadTimeout : 5000 # 接続要求のタイムアウト
ConnectionTimeout : 10000 # リクエスト処理のタイムアウト

2. OpenFeignのタイムアウトを設定する

プロジェクト構成ファイル application.yml に次の構成を追加します。

 偽装する
クライアント
設定:
default : # グローバルタイムアウト期間を設定します
connectTimeout : 2000 # 接続タイムアウト
readTimeout : 5000 # リクエスト処理のタイムアウト

この構成のセマンティクスはより明示的であるため、OpenFeign のタイムアウトを設定するにはこの方法が推奨されます。

II. リクエスト接続の最適化

OpenFeign の基盤となる通信コンポーネントは、デフォルトで HTTP リクエストに JDK 組み込みの URLConnection オブジェクトを使用します。接続プールを使用しないため、パフォーマンスはあまり良くありません。OpenFeign の通信コンポーネントを、Apache HttpClient や OkHttp などの専用通信コンポーネントに手動で置き換えることができます。これらの専用コンポーネントには組み込みの接続プールがあり、HTTP 接続オブジェクトの再利用と管理を改善し、HTTP リクエストの効率を大幅に向上させます。次に、Apache HttpClient を例に、専用通信コンポーネントの使用方法を説明します。

1. Apache HttpClient依存関係を追加する

プロジェクトの依存関係管理ファイル pom.xml に次の構成を追加します。

 <!-- OpenFeign フレームワークの依存関係を追加する -->
<依存関係>
<グループID > org.springframework.cloud < / グループID >
<artifactId> スプリング- クラウド- スターター- openfeign </artifactId>
< 依存関係>
<!-- HttpClient フレームワークの依存関係を追加する -->
<依存関係>
< グループID > ioギットハブopenfeign < /groupId>
<artifactId> フェイク- httpclient < / artifactId >
< 依存関係>

2. Apache HttpClientを有効にする

Apache HttpClient コンポーネントを起動するには、プロジェクトの application.yml ファイルに次の構成を追加します。

 偽装する
クライアント
httpclient : # HttpClient を有効にする
有効: true

Apache HttpClient 構成が有効かどうかを確認するには、次の画像に示すように、feign.SynchronousMethodHandler#executeAndDecode メソッドにブレークポイントを設定します。

III. データ圧縮

OpenFeignはデフォルトではデータ圧縮を有効にしていませんが、Gzip圧縮機能を手動で有効にすることができます。これにより、帯域幅の利用率が大幅に向上し、データ転送速度が向上します。プロジェクトのapplication.ymlファイルに以下の設定を追加してください。

 偽装する
圧縮
リクエスト
enabled : true # リクエストデータの圧縮を有効にする
MIME タイプ: text / xmlapplication / xml application / json #圧縮タイプ
min - request - size : 1024 #最小圧縮値。データ サイズが 1024 を超える場合にのみ圧縮が実行されます
応答
enabled : true # レスポンスデータの圧縮を有効にする

PS: サービス コンシューマー側の CPU リソースが不足している場合は、データ圧縮機能を有効にしないことをお勧めします。データの圧縮と解凍はどちらも CPU リソースを消費し、CPU に余分な負担がかかり、システム パフォーマンスが低下するためです。

IV. 負荷分散の最適化

OpenFeignは、コアとなる負荷分散にRibbonを使用しています。ソースコードを見ると、デフォルトの負荷分散戦略はラウンドロビンであることがわかります(次の図を参照)。

ただし、ラウンドロビン戦略の他に、次の 6 つの組み込み負荷分散戦略から選択できます。

  1. 重み付けResponseTimeRuleは、各サービスプロバイダーの応答時間に重みを割り当てます。応答時間が長いほど重みは低くなり、選択される確率は低くなります。実装原理は、まずタイマー付きのポーリング戦略を用いて、すべてのサービスプロバイダーの平均応答時間を定期的に収集することです。次に、各サービスプロバイダーに重みが割り当てられます。重みが高いほど、選択される確率は高くなります。
  2. BestAvailableRule戦略(最小同時実行戦略とも呼ばれます)は、サービスプロバイダーのリストを反復処理し、接続数が最も少ないサービスインスタンスを選択します。複数のプロバイダーの最小接続数が同じ場合は、ラウンドロビン戦略を使用して最適なものを選択します。
  3. ゾーン依存ポリシー: ZoneAvoidanceRuleは、サービスのゾーンのパフォーマンスと可用性に基づいてサービスインスタンスを選択します。ゾーンのない環境では、このポリシーはラウンドロビンポリシーに類似しています。
  4. 利用可能な感度戦略: AvailabilityFilteringRule。これは、最初に正常でないサービス インスタンスをフィルター処理し、次に接続数が少ないサービス インスタンスを選択します。
  5. ランダム ポリシー: RandomRule は、サービス プロバイダーのリストからサービス インスタンスをランダムに選択します。
  6. 再試行戦略: RetryRule はラウンドロビン戦略を用いてサービスを取得します。取得したサービスインスタンスが null または期限切れの場合、指定された時間内にサービスの取得を再試行します。指定された時間を超えておらず、サービスインスタンスが取得されない場合は、null が返されます。

パフォーマンス上の理由から、ポーリング戦略の代わりに重み付け戦略または領域依存戦略を使用することを選択できます。これらの戦略は実行効率が最も高いためです。

V. ログレベルの最適化

OpenFeign はログ機能の強化を提供し、そのログ レベルには次のものが含まれます。

  • なし:デフォルト設定。ログは表示されません。
  • BASIC:リクエストメソッド、URL、応答ステータスコード、実行時間のみを記録します。
  • ヘッダー: BASIC で定義されている情報に加えて、リクエスト ヘッダーとレスポンス ヘッダーがあります。
  • FULL: HEADERS で定義された情報に加えて、リクエストとレスポンスの本文、およびメタデータも含まれます。

以下のように、構成ファイルを通じてログ レベルを設定できます。

 ログ記録:
レベル
cn.myjszl.service : デバッグ

ここで、cn.myjszl.service は OpenFeign インターフェースが配置されているパッケージ名です。OpenFeign はデフォルトではログを出力しませんが、開発段階で変更される可能性があります。そのため、本番環境では OpenFeign の実行効率を向上させるために、適切なログレベルを慎重に確認し、設定する必要があります。

要約

OpenFeignは、Springによって公式にリリースされた宣言的なサービス呼び出しおよび負荷分散コンポーネントです。本番環境では、以下の設定を行うことでOpenFeignの動作を最適化できます。

  1. OpenFeign がビジネス ロジックを正しく処理できるように、OpenFeign のタイムアウトを変更します。
  2. Apache HttpClient や OKHttp などの専用の通信コンポーネントを構成することで、OpenFeign は HTTP 接続オブジェクトをより適切に再利用および管理し、パフォーマンスを向上させることができます。
  3. データ圧縮を有効にすると、帯域幅の使用率が向上し、データ転送速度が速くなります。
  4. 適切な負荷分散戦略を使用してデフォルトのラウンドロビン負荷分散戦略を置き換え、実行効率を向上させます。
  5. 本番環境での OpenFeign のログレベルを確認し、適切なログ出力レベルを選択して、無効なログ出力を防止します。