インタビュアー: なぜ Feign は最初の電話でこんなにも遅いのですか?

  • 序文

  • リボンのロード方法

  • リボンクライアント構成

  • ZoneAwareLoadBalancer

  • リボン負荷分散戦略

  • リボン・イーガー・ロード (ハングリー・ロード) モード

  • リボンハンガーロードを有効にする

  • 要約する


序文

まず第一に、レジストリ、負荷分散、FeignClient 間の関係を含め、Feign がリモート呼び出しを行う方法を理解する必要があります。マイクロサービスは eureka または nacos を介してサーバーに登録できます。Feign は負荷のためにリボンに依存しています。そして、リボンは取得する必要があります登録センターのサービス リストを取得し、サービスの負荷をローカルにキャッシュしてから、FeignClient クライアントが呼び出す、おそらくそのようなプロセスです。

Spring Boot + MyBatis Plus + Vue 3.2 + Vite + Element Plus をベースとしたフロントエンドとバックエンドに分離されたブログ。記事、カテゴリ、タグ管理、ダッシュボードなどの機能をサポートするバックグラウンド管理システムが含まれています。

  • GitHub アドレス: https://github.com/weiwosuoai/WeBlog

  • Gitee アドレス: https://gitee.com/AllenJiang/WeBlog

 
 

リボンのロード方法

まず、リボンがどのようにロードされるか、つまり、nacos と eureka のサービス リストを取得する方法を知る必要があります。これは非常に重要です。

写真

リボンのロード方法

リボンクライアント構成

ibbonClientConfiguration クラスの LoadBalancer を通じて、リボンが LoadBalancer に依存してロードを実行することがわかります。これは ILoadBalancer インターフェイスのメソッドにすぎず、その後、新しいサービスを追加し、ロード バランサーでサービスを選択し、ServerDown をマークします。サービスをオフラインにする、サービス リストを取得する、生存しているサーバーを取得する、すべてのサーバー (正常なサ​​ーバーと異常なサーバーの両方) を取得する

写真

ILoadBalancer インターフェイス

ZoneAwareLoadBalancer

デフォルトのloadBalancerはZoneAwareLoadBalancerロードバランサーです。親クラスDynamicServerListLoadBalancerのrestOfInitメソッドを継承することにより、さらに2つの重要なメソッド、enableAndInitLearnNewServersFeatureと2つが追加されます。

updateListOfServers 方法

写真

restOfInit 方法

EnableAndInitLearnNewServersFeature メソッド。

LOGGER.info("Using serverListUpdater {}", serverListUpdater.getClass().getSimpleName());
serverListUpdater.start(updateAction);

ServerListUpdater.start メソッドの実装を見て、サービス リストを取得するためのカスタム スレッドを通じてそれを取得してみましょう。

写真

ServerListUpdater.start

リボン負荷分散戦略

サービス リストの取得について言及しましたが、もちろん、負荷分散戦略についても説明する必要があります。主に 7 つのタイプがあります。

  • RoundRobinRule (サービスの順序に従って順番に呼び出されるポーリング戦略)

  • WeightedResponseTimeRule (重み付け比率戦略。重み付け比率の高いサービス、つまり応答時間が短いサービスを優先します。応答時間が長いほど、重み付け比率は低くなります)

  • RandomRule (ランダム戦略、サービスプロバイダーリストからサービスをランダムに選択)

  • BestAvailableRule (最小接続数戦略、サービス リスト内の接続数が最も少ないサービス インスタンスを取得します)

  • RetryRule (再試行戦略、無効なサービスの取得を再試行、指定された時間が取得できない場合は NULL を返す)

  • AvailabilityFilteringRule (可用性重視のポリシー、異常なサービス インスタンスのフィルター、lianji の選択)

  • ZoneAvoidanceRule (ゾーンに依存するポリシー)

カスタム負荷分散戦略に関しては、この記事の範囲には属しません。興味があれば、以下を参照してくださいhttps://t.zsxq.com/0fPeLWdXo

Spring Boot + MyBatis Plus + Vue 3.2 + Vite + Element Plus をベースとしたフロントエンドとバックエンドに分離されたブログ。記事、カテゴリ、タグ管理、ダッシュボードなどの機能をサポートするバックグラウンド管理システムが含まれています。

  • GitHub アドレス: https://github.com/weiwosuoai/WeBlog

  • Gitee アドレス: https://gitee.com/AllenJiang/WeBlog

 
 

リボン・イーガー・ロード (ハングリー・ロード) モード

負荷用のリボン サービスの開始後および呼び出しの発生時にクライアントが作成されます

クライアントでは、最初の http リクエスト呼び出しが発生したときに、http リクエスト時間だけでなくクライアントの作成時間もカウントする必要があるため、最初の呼び出しは非常に遅くなり、メソッド呼び出しを作成します。

System サービスは System2 サービスを呼び出します

@GetMapping("/requestSystem2Api")
public String requestSystem2Api(){
    long startTime = System.currentTimeMillis();
    R<String> stringR = iTestServiceClient.testRequestMethod();
    if (null !=stringR){
        log.info("接口返回:"+stringR.getMsg());
    }
    long needTime = System.currentTimeMillis() - startTime;
    log.info("接口调用需要的时间:"+needTime);
    return "";
}

通話ログから、System2 サービスが初めて呼び出されるとき、リボンの DynamicServerListLoadBalancer が偽のクライアントをロードしてから呼び出しを行うことがわかります。最初の呼び出しの時間は長くなり、2 番目の呼び出しは直接呼び出すことができます。通話時間が早いです。

写真

1回目は遅く、2回目は速く

リボンハンガーロードを有効にする

ribbon:
nacos:
  enabled: true # 开启naocos轮询
eager-load:
 enabled: true  # 开启Ribbon的饥饿加载模式(防止第一次请求超时的问题)
 clients: Lxlxxx-system2 # 指定需要开启的服务(需要开启Ribbon的饥饿加载模式)
 ReadTimeout: 10000
 ConnectTimeout: 10000
 MaxAutoRetries: 0
 MaxAutoRetriesNextServer: 1
 OkToRetryOnAllOperations: false

プロジェクトが開始されると、Lxlxxx-system2 サービスがロードされ、最初のリクエストのタイムアウトが回避されたことがログからわかります。

写真

リボンハンガーロードを有効にする

要約する

実際、このスターベーション ロード モードは、「クライアント ロード ウォームアップ」の操作に似ています。データ量とビジネス ロジック処理の複雑さによって、サービス間の呼び出しによってインターフェイス タイムアウトが発生するのを防ぐために、プロジェクトの開始時にロードされます。呼び出しの間にビジネス処理を呼び出すのは複雑で時間がかかるため、この解決策を試してみるとよいでしょう。

 
 
 
 
 
 
 
 
 

おすすめ

転載: blog.csdn.net/2301_78588786/article/details/131901617