クルクーツブレーカーモード
分散環境、特にマイクロサービス構造を備えた分散システムでは、あるソフトウェアシステムが別のリモートシステムを呼び出すことが非常に一般的です。このリモートコールのカリーは、別のプロセス、またはネットワーク上の別のホストである場合があります。このリモートコールとプロセスの内部呼び出しの最大の違いは、リモートコールがタイムアウトまで応答せずに故障またはハングする可能性があることです。さらに悪いことに、複数の発信者が同じ保留中のサービスを呼び出すと、サービスのタイムアウト待機が分散システム全体に迅速に広がり、連鎖反応を引き起こし、分散システム全体の大量のリソースを消費する可能性が非常に高いです。最終的にはシステム麻痺につながる可能性があります。
回路ブレーカーモードは、分散システムにおける滝のような連鎖反応によって引き起こされる災害を防ぐためです。
特定の電化製品に問題があると、災害を防ぐために回路の融合が吹き飛ばされます。回路ブレーカーは、回路ヒューズに似ています。実装のアイデアは非常に簡単です。保護が必要なリモートサービスをカプセル化し、障害の数を内部的に監視できます。障害の数が特定のしきい値に達すると、サーキットブレーカーの傍受後、サービスへの後続の呼び出しはすべて発信者に直接返され、すでに問題が発生しているサービスを呼び出し続け、発信者を保護する目的を達成します。システム全体は、タイムアウトによって引き起こされる滝の連鎖反応を経験しません。
1。基本モード
上記の図は、2つの基本状態(閉じて開いている)と基本的な旅行アクションを備えた回路ブレーカー(クルクスーツブレーカー)の構造です。
近い状態では、クライアントは障害物なしでサーキットブレーカーを介して直接サプライヤーにサービスを要求します。サプライヤーの返品値は、回路ブレーカーによってクライアントに直接返されます。
オープン状態では、クライアントがサプライヤーにサービス要求を開始した後、サーキットブレーカーはリクエストをサプライヤーに転送せず、クライアントを直接返し、クライアントとサプライヤーの間のパスが壊れます。
旅行:近い状態では、サプライヤーがタイムアウトとエラーを続けている場合、指定されたしきい値に達した後、回路ブレーカーで旅行が発生し、その後、回路ブレーカー状態が閉じて開いています。
2。拡張モード
基本的な回路ブレーカーモードでは、回路ブレーカーがオープン状態にあるときに回路ブレーカーが呼び出されないようにしますが、供給者がサービスを復元した後に回路ブレーカーをリセットするための追加の手段も必要です。実行可能な方法の1つは、サプライヤーのサービスが復元されるかどうかを定期的に検出することであり、復元されると、ステータスが閉じるように設定されます。回路ブレーカーの再試行の状態は半分です。
3。回路ブレーカーの機会を使用します。
サプライヤーは一般に非常に安定しています。障害が発生したら、検査時間と回復時間に長い時間がかかり、短時間で迅速に修復することはできません。このサービスは、サーキットブレーカーモードの使用に適しています。そうでなければ、それは卓球効果につながる可能性があります。
3。回路ブレーカーは、機会には適していません。
アプリケーションがリモートサービスを呼び出したり、共有リソースにアクセスしようとしないようにするために、操作が失敗する可能性が高い場合、このパターンは適切ではない場合があります。
メモリ内のデータ構造などのローカル専用リソースにアクセスするアプリケーションを処理するため。この環境では、通常は適切ではなく、回路ブレーカーを使用するとシステムオーバーヘッドのみが増加します。
以下は、Spring Cloudの回路ブレーカーの使用方法の直接紹介です。
SpringCloud Netflixは、Hystrixと呼ばれるサーキットブレーカーライブラリの名前を実装しています。マイクロサービスアーキテクチャには、通常、複数のレベルのサービスコールがあります。以下は、マイクロサービスアーキテクチャの下でAPIを介してバックエンドマイクロサービスにアクセスするブラウザの概略図です。
マイクロサービスタイムアウトの障害により、滝の連鎖反応が発生する可能性があります。以下の図では、Hystrixは、自律的なフィードバック回路ブレーカーを介してこれが起こらないようにします。
図のサービスBは何らかの理由で失敗し、利用できなくなります。サービスBへのすべての呼び出しはタイムアウトします。 Bへの呼び出しが特定のしきい値に到達できない場合(5秒以内に20の障害が発生することがHystrixによって定義されたデフォルト値です)、リンクはオープン状態になり、サービスBへのすべての呼び出しは実行されず、代わりに回路ブレーカーが提供するリンクを示すフォールバックメッセージが実行されます。 Hystrixは、開発者がこのFallbakメッセージを定義できるようにする対応するメカニズムを提供します。
Openのリンクは滝のエラーをブロックし、浸水または間違ったサービスを修正する時間を確保します。このフォールバックは、別のHystrix保護された呼び出し、静的データ、または法的ヌル値になる可能性があります。フォールバックはチェーン構造を形成できるため、下部の他のビジネスサービスを呼び出して静的データを返す最初のフォールバック。
次に、以前の2つのHello World Serviceクラスターにサーキットブレーカーを追加して、Hello Worldの1つが緩みを防ぎ、システムがタイムアウトのチェーンに失敗するのを防ぎます。
1. Hystrixライブラリを追加して、Mavenプロジェクトのpom.xmlのサーキットブレーカーをサポートします(前の章で紹介したリボンまたはフェインプロジェクト)
<Dependency> groupId> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-hystrix </artifactid> </dependency>
2。リボンアプリケーションで回路ブレーカーを使用します
1)。 Spring Boot Startupクラスに@EnableCircuit Breakerアノテーションを追加します
@springbootapplication@enablediscoveryclient@enableCircuitBreakerPublic class ServiceribbonApplication {public static void main(string [] args){springApplication.run(serviceribbonapplication.class、args); }2)。注釈@hystrixcommandアノテーションでサービスにアクセスする方法をアノテートします
@ServicePublic Class HelloService {@AutowiredRestTemplateRestTemplate; @hystrixcommand(fallbackmethod = "servicefailure")public string gethellocontent(){return Resttemplate.getForObject( "http:// service-hellowld/"、string.class); } public string servicefailure(){return "Hello World Serviceは利用できません!"; }}@hystrixCommandアノテーションは、gethellocontant()メソッドをカプセル化する回路ブレーカーを定義します。 Service-hellowordがアクセスするとしきい値に到達できない場合、Service-helloworldはもはや呼び出されません。代わりに、FallbackMethodで定義されたメソッドServiceFailure()を返します。 @hystrixCommandアノテーションで定義されたFallbackMethodメソッドを定義する際に特に注意する必要がある2つのポイントがあります。
まず、FallbackMethodの返品値とパラメータータイプは、@hystrixcommandが注釈したメソッドとまったく同じである必要があります。それ以外の場合、例外は実行時にスローされます。たとえば、この例では、servicefailure()の返品値とgethellocontant()メソッドの返品値はどちらも文字列です。
第二に、基礎となるサービスが失敗すると、FallbackMethodは@hystrixcommand(この例ではGethellocontant)によって注釈された方法全体を置き換えませんが、RestTemplateを介してアクセスされる特定のサービスのみです。システムの出力から、故障しても、コンソール出力に「Service-Hellowldを呼び出す」ことがまだあることがわかります。
Eurekaサービスを開始し、2つのHelloworldサービスのみを開始してから、そのうちの1つを中断し(Microservicesの1つを一時停止します)、http:// localhost:8901/にアクセスしてから更新します。 2番目の保留中のサービスは、リボンで定義されたエラー処理方法に置き換えられていることがわかります。
4.フェインアプリケーションで回路ブレーカーを使用します
1)。 Feignはすでにサーキットブレーカーをサポートしているため、リボンの方法について考える必要はありません。SpringBootStartupクラスに追加の注釈を追加します。
2)。 @feignclient Annotationでフォールバッククラスを追加します。これは、@feignclientによって変更されたインターフェイスを実装する必要があります。
@feignclient(name = "service-hellowld"、fallback = helloworldservicefailure.class)public interface helloworldservice {@requestmapping(value = "/"、method = requestmethod.get)public string sayshello(); }3)。 HelloworldServiceFailureクラスを作成するには、@feignclientによって変更されたHelloworldServiceインターフェイスを実装する必要があります。 @Componentまたは@Service Annotationを追加して、スプリングコンテナでBeanを生成することに注意してください。
@componentPublic Class HelloWorldServiceFailureはHelloWorldService {@Override public String sayshello(){system.out.println( "Hello World Serviceは利用できません!"); 「Hello World Serviceは利用できません!」を返します。 }}4)。 Spring Cloudの前のBrixtonバージョンでは、Feignはデフォルトでサーキットブレーカーを自動的にアクティブにしましたが、最近のDalstonバージョンはデフォルトの構成を禁止するように変更しました。
理由については、https://github.com/spring-cloud/spring-cloud-netflix/issues/1277を参照してください。この点に注意してください。したがって、装備で回路ブレーカーを使用するには、application.ymlに次の構成を追加する必要があります。
feign:hystrix:enabled:true
5)。 feignアプリケーションを起動し、http:// localhost:8902/helloにアクセスして、リボンと同じ効果を確認してください。
参照:http://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign-Hystrix
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。