Hystrixのサービス低下のSpringCloud(7)

Hystrix設計原理

  1.分散環境での障害をカスケード接続する多数のを避けるために、単一のサービス、(Tomcatなど)コンテナ全体のシステムサービスのスレッド資源の枯渇の故障を防止します。(通常はネットワークを介して)、論理アクセスは、サービス障害に依存して、ロールバックは、拒否し、タイムアウトやサードパーティのクライアントで短絡が発生しました

2.クイック故障の代わりにキューイング(各サービスに依存スレッドやセマフォの小さなプールを保持し、スレッドプールが満杯であるか、またはセマフォがいっぱいになったとき、直ちにラインで待たずにサービスの拒否)でエレガントなサービス低下;場合の依存サービス障害発生後に正常に戻った、迅速な復旧

3.すぐに見つけて障害を修正することができ、ほぼリアルタイムの監視およびアラートを、提供します。要求の成功、失敗(クライアントが例外をスロー)、タイムアウトやスレッドが拒否された情報の監視を含みます。依存サービスの割合は、アクセスエラーがしきい値を超えた場合、回路ブレーカがトリップし、この時間は、サービスが時間をかけて、特定のサービスに対するすべての要求を停止します

4. HystrixCommand HystrixObservableCommandオブジェクトにカプセル化されたすべての要求は、外部システム(または依存サービス要求)、または、その後の要求が別のスレッドです。システムへの依存の故障の影響を制限するための分離技術を使用します。スレッドプールが満杯またはセマフォいっぱいになったとき、各サービスは、サービス拒否が待たずに、すぐに、小さなスレッドプールに依存(またはセマフォ)を維持します

 

Hystrixプロパティ

  吹き付け1.リクエスト:バックエンドサービスHystrixコマンド失敗の数が一定の割合(デフォルト50%)を超える要求すると、回路遮断器は、すべての要求をバックエンドサービスの障害に直接送信されていない開放状態(オープン)に切り替わります。一定期間(デフォルトでは5秒)の後に回路遮断器開放状態を保持し、半自動的に開放状態(半開)に切り替わります。

    リクエストが戻って閉じた状態(CLOSED)に、ブレーカーのスイッチ成功した場合はその後、次の要求を判断するために戻ります、または開放状態(OPEN)に切り替える。Hystrix回路ブレーカーがヒューズに私たちの家族のようなものです、一度サービスの終了が利用できない、回路ブレーカは、直接切断要求、圧倒的なインパクトシステムのスループットを回避するために無効な要求、および自己テスト回路ブレーカおよび回復する能力をリンクします。

  2.サービスはダウングレード:クエリ操作のための同等のダウングレードをフォールバック、我々はフォールバック方式を実現することができ、バックエンドのサービスリクエスト例外は、あなたが値をフォールバック方式は、戻り値は、一般的なフォールバック方式のデフォルト設定で返し使用することができたとき。キャッシュからの値かが。後者の要求されたサービスが利用できない知らせ、再び来ることはありません。

  3.分離を頼る(隔壁モードを使用して、ドッカーは隔壁モードの一種である):Hystrixにおいて、メインリソースの分離は、我々は、リモート・サービス・コールに基づいて複数のスレッドに分割される場合、通常、スレッドプールを使用することによって達成されます。あなたは、スレッドプールを使用している2つのサービスを呼び出した場合、プール。たとえば、サービスコールの2つのサービスの外側2は、リソースが解放されない場合、サービスカードので、もし

   要求の背後に再び、あなたはカード上の資源の枯渇、だけでなく、他のBサービスにあなたを導いたが利用できないサービスを頼るように原因の要求は、待っているカードの裏につながります。その後、分離に依存している場合、1つのサービスは、私は100のスレッドが利用可能である持っている場合は、その後、私はBサービスに割り当てられたサービス分布50、50を与えるだろう、AB 2つのサービスを呼び出し、そのサービスがハングアップした場合でも、

   私のBサービスは引き続き使用することができます。

  4.要求キャッシュ:例えば、I = 1つのデータを、ユーザーIDの要求を超える要求、あなたは要求を戻ってきても、同じデータを要求し、その後、私は作品をリンクする元の要求を飲み続けることはありませんが、初めてキャッシュ要求した後、最初の要求は、後続の要求に結果を返します。

  5.マージ要求:私は、特定のサービスに依存しているが、私は、我々はより多くを置くことができ、この時間は、例えば、N回を呼び出し、私はSQLのN N個からの要求をしたときにデータベースをチェックして、結果の束を取得したいです1つの要求への要求は、複数のデータ要求のSQLクエリを送信、我々は唯一の効率を改善するためにデータベースを照会する必要があります。

次のようにHystrixl、フローチャート:

 

Hystrixプロセスの概要:

 

 1:依存コールrun()メソッドにカプセル化された新しいHystrixCommandを作成するために、各コール。  2:()/キュー行わ同期または非同期呼び出しを実行する実行  解析ヒューズ(サーキットブレーカ)が開いている場合:4ステップオフにした場合、オープンは8、ダウングレード戦略を、ステップにジャンプ5.   5:分析スレッドプール/キュー/劣化したステップ8でオーバー実行する場合セマフォが、そうでなければ継続するかどうかを轢か次のステップ6.   6:実行HystrixCommandを呼び出しますオペレーショナル依存論理の方法  6A:呼び出しタイミング依存ロジックはステップ8に進み、  呼び出しが成功したロジックであったかどうかを決定する:7   7aは:成功したコールは、結果を返し  、エラーコール進むステップ8:7(b)  8:計算ヒューズ状態、すべての動作状態(成功、失敗、拒絶、タイムアウト)が統計的ヒューズ状態を決定するために使用される、ヒューズに報告。  9 :. getFallback()getFallbackコールをトリガーする4例次のロジックをダウングレード:    (1):run()メソッドは、非スローHystrixBadRequestException例外。    (2):run()メソッドの呼び出しがタイムアウト    (3):オープン切片呼び出しヒューズ    (4):スレッドプール/キュー/セマフォかどうかをひか  9A:コマンドgetFallback直接スロー実装しないであろう  9bは:フォールバック論理ダウングレード首尾よく呼び出す直接返さ  9C:例外投げて失敗した論理的なコールを格下げし  た結果の実装を成功に戻る:10

 

リボンはHystrix統合の前に、ここで続くこと。はっきりあなたはリボンの上にあるように、顧客が直接要求の呼び出しに、あなたが手と足を行うには、他の誰かのリクエスト充填層と切片上にあるようにバインドされ、例えば、それが吹き込まれるのを許してはなりません、要求ヒューズにしたいです手と足。場所を開始する要求されているため。

私達はちょうど、負荷分散のために一度傍受、そして今、我々が融合したい、それはかつてのリボンと統合されている必要があり、その後、爆破する要求を横取りして、サービス要求を開始しました。

具体的な構成の一部を参照して上に、下記の数を除いて:

  • オーダーサービス

    • application.yml

      1つの サーバー:
       2    ポート:8781
       。3  4 5。 は、アドレスレジストリを指定
       6。ユーレカ:
       7   クライアント:
       8     のserviceURL:
       9        defaultzone:HTTP:// localhostを:8761 /ユーレカ/ 10 。11 #名サービス
       12はスプリング:
       13であります  ファイルアプリケーション:
       14      名:order- -サービス
       15 16 ###の構成要求のタイムアウト
       。17 Hystrix:
       18です  。コマンド:
       19 デフォルト20は      実行:
           
                    21は         単離:
       22は、           スレッド:
       23である               timeoutInMilliseconds:7000
       24  リボン:
       25  ##は、通常のネットワーク状態の場合に使用される接続時間を参照し、接続時間の両端が費やしました。
      26はある    ReadTimeout:2000年
       27  ##は、接続を参照を経時的に利用可能なリソースを読み取るために、サーバから確立されています。
      28    のconnecttimeout:3000
       29  ふり:
       30    Hystrix:
       31れる      有効:trueに
      32  33れるポリシーバランス#カスタム負荷
       34は、#製品- -サービス:
       35 #リボン:
       36#1 NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule  

       

    • コールバッククラスを追加します。

    1  / ** 
    2  * @author WGR
     3  * @Create 2019年10月19日-午前19時36分
     4   * / 
    5  @Component
     6  パブリック クラス ProductClientFallbackが実装ProductClientを{
     7  8     @Override
     9 パブリックストリングfindById(int型のID){
     10 11          のSystem.out.println( "异常调用製品サービスfindbyidをふり" )。
    12 13 リターン "123" 14     }
     15 16                    17  18 }
     19 

     

    • コメントを変更

    @FeignClient(名= "製品サービス"、フォールバック= ProductClientFallback。クラスパブリック インターフェースProductClient { 
        @GetMapping( "/ API / V1 /製品/見つける" 
        文字列findById(@RequestParam(値 = "ID")INT ID); 
    }

    テスト:

    まずコンソールが印刷されます:装うこのメソッドの最初の呼び出していることを示す、製品・サービスfindbyid異常を呼び出します。

     

おすすめ

転載: www.cnblogs.com/dalianpai/p/11705229.html