マイクロサービスでは、システムを多くのサービスユニットに分割し、各ユニットはサービス登録とサブスクリプション消費を通じて相互依存しています。しかし、一部のサービスに問題がある場合はどうなりますか?
たとえば、3つのサービス(ABC)、A Calld B、BはCを呼び出します。ネットワークの遅延またはCのコードの問題により、Bは長い間応答を得られないため、リクエストBの呼び出しCは中断されて待機します。
同時アクセスが高い場合、これらの中断されたスレッドをリリースすることはできず、その後のリクエストがブロックされ、最終的にBは電話を切ります。類推によって、Aは電話を切ることもでき、システム全体がクラッシュします。
問題全体を解決するために、Spring Cloudは、回路ブレーカーや糸分離などの一連の保護機能を含む、サービス障害耐性保護のためにHystrixを使用します。今日は、Hystrixを介してサーキットブレーカーを実装する方法をご覧ください。
1。SpringCloud Hystrixとは何ですか?サーキットブレーカーとは何ですか?
Spring Cloud Hystrixは、NetflixのオープンソースフレームワークであるHystrixに基づいて実装されており、その目的は、リモートシステム、サービス、および第三者にアクセスするノードを制御することにより、遅延と障害に対する強力なフォールトトレランスを提供することです。
サーキットブレーカーは、私たちの家の強力な電動箱で使用される漏れ回路ブレーカーに似ています。サービスユニットが失敗すると(電源の短絡と同様)、回路ブレーカーの障害監視関数(ヒューズと同様)を介してエラー応答が発信者に戻り、長期待機を回避し、障害がシステム全体に広がるのを防ぎます。
2。回路ブレーカーがない場合、ページディスプレイ
先ほど書いたサービスガバナンス(eureka/hello-service/hello-consumer)のためにeurekaを使用するSpring Cloud Introductionシリーズ2の3つのサービスを今でも覚えていますか?これに基づいて実験を行います。
1。ポート番号1111からユーレカサービス登録センターを開始します
2。Hello-Serviceサービスプロバイダーを開始します。ここでは、それぞれポート番号9090,9091で2つのサービスを開始します。
3.ポート番号9999で、消費者にサービスを提供するためにHello-Consumerを開始します。現時点では、http:// localhost:9999/hello-consumerに数回アクセスするのに問題はありません。
4.ポート番号9091でサービスをオフにしてから、http:// localhost:9999/hello-consumerに数回アクセスすると、エラーが報告されました。
PS:ここでは、リボンを通して負荷分散を達成したため、複数回アクセスする必要がある理由を説明します。 http:// localhost:9999/hello-consumerにアクセスすると、Hello-Serviceにアクセスする2つのサービスを投票します。ポート番号9091のサービスにアクセスすると、エラーが報告されます。9090でサービスにアクセスすることに問題はありません。
3。回路ブレーカーコードの実装
次に、コードの実装方法を見てみましょう。サービス登録センターとサービスプロバイダーを変更するのではなく、サービス消費者のHello-Consumerを変更するだけです。
1. POMファイルを変更し、Hystrix依存関係を導入します
<Project XMLNS = "http://maven.apache.org/pom/4.0.0" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation = "http://maven.apach/4.0. http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelversion> 4.0.0 </modelversion> <groupid> com.sam </groupid> <artifactid> hello-consumer </artifactid> <バージョン> 0.0.1-snapshot </version <parent> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-boot-starter-parent </artifactid> <version> 1.5.1.release </version> </parent> <properties> <javaversion> 1.8 </javaversion> </properties> <groupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-dependencies </artifactid> <version> camden.sr6 </version> <type> pom </type> <scope>インポート</scope> </dependency> </dependency> </dependency> < <groupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </artifactid> </dependency> <! - 導入リボン依存関係は、ロードバランシングを実装するために使用されます。ここでそれを使用しているだけで、他の場所で紹介しません - > <依存関係> groupId> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-ribbon </dependency> <! - ヒスストリックス依存関係を導入<artifactid> spring-cloud-starter-hystrix </artifactid> </dependency> </dependencies> </project>
2.スタートアップクラスを変更し、Annotation @EnableCircuitBreakerを追加し、サーキットブレーカーを有効にします
@enableDiscoveryclient@springbootapplication@enableCircuitBreakerPublic Class ConsumerApp {//@beanはメソッドに適用され、メソッドリターン値をbean @loadbalanced //@loadbalancedに設定するために使用され、ロードバランスを達成するためにロードバランスを達成するために使用されます。 } public static void main(string [] args){springApplication.run(consumerApp.class、args); }}この時点で、このスタートアップクラスには3つの注釈があることがわかります。これは非常に面倒ではありませんか?それは問題ではありません、私たちはannotation @springcloudapplicationを使用できます
@springcloudapplicationpublic class ConsumerApp {// @beanはメソッドに適用され、メソッドリターン値をbean @bean @loadbalanced // @loadbalancedに設定するために使用され、ロードバランスのパブリックレイトテンプレートrecttemplate(){return new RestTemplate(); } public static void main(string [] args){springApplication.run(consumerApp.class、args); }}@springcloudapplication =@enablediscoveryclient +@springbootapplication +@enablecircuitbreaker、ソースコードからわかります。
@target(elementType.type)@retention(retentionPolicy.runtime)@documented@enternited@springbootapplication@enablediscoveryclient@enablecircuitbreakerpublic @interface springcloudapplication {}3.ADDサービス
@ServicePublic Class ConsumerService {@AutowiredRestTemplateRestTemplate; @hystrixcommand(fallbackmethod = "errormsg")public string consumer(){// hello-serviceサービスを呼び出す、サービス名はここで使用されていることに注意してください。 「こんにちは消費者仕上げ!!!」を返します。 } public string errormsg(){return "error !!!"; }}元のコントローラーのレストテンプレートをサービスに呼び出して実装し、@HyStrixCommandを介してコールバックメソッドを指定し、エラーが発生したときにこのメソッドを呼び出します。
4.コントローラーを変更します
/** *rettemplateはここで直接呼び出されなくなります *が、service */ @stupcontrollerpublic class consumercontroller { @autowired // resttemplate rettemplate; ConsumerServiceサービス。 @RequestMapping( "/hello-consumer")public string helloconsumer(){// // hello-serviceサービスを呼び出します。サービス名はここで使用されていることに注意してください。 return service.consumer(); }}5.テスト、複数の訪問、およびエラーが報告されると、次のコンテンツが表示されます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。