なぜブレーカー
マイクロサービスアーキテクチャでは、我々は、彼らがサービスとサービスの間で(RPC)お互いを呼び出すことができ、一つのサービスに事業を分割します。ためにその可用性を確保するため、および単一のサービスクラスタの展開でなければなりません。問題が発生した場合、ネットワーク上の理由として、あるいは自分自身の理由のために、サービスは、単一のサービスを利用可能なサービスの100%を保証するものではありませんネットワークの多数の流入は、サービスにつながる、累積タスクを形成する場合は、サービスネットワークが、この時点では、遅延されます呼び出しますでも麻痺、およびサービスにつながる「雪崩」。この問題を解決するために、回路ブレーカモデルが登場しました。
Hystrixはタイムアウトと対話するときに処理し、フォールトトレラント分散システム、それはまた、システムを保護する能力を持っているを解決するためのクラスライブラリです。サービス雪崩は何ですか
基本的なサービスの一つは、システム全体が使用できない使用できない原因となって表示される分散型システムは、多くの場合、現象がアバランシェ効果サービスと呼ばれる。雪崩のサービスに対応するために、一般的な方法は、手動でサービス低下にある。Hystrixの出現、それは別のオプションを提供してくれます。
対処戦略雪崩サービス
さまざまな理由から雪崩のサービスは、あなたが別の対処戦略を使用することができます。
流量制御
改善されたキャッシュモード
サービスの自動拡張
サービス呼び出し側のダウングレード
具体的な対策は、フロー制御が含まれています。
制限ゲートウェイ
ユーザーの操作を制限します
閉じる再試行
サービス雪崩ソリューション
理由の1。サービスの雪崩
(1)いくつかの機械的な故障:いくつかのバグは、(例えば、メモリデッドロックまたは割り込み)は、例えばによるマシンまたは特定のマシンに、間違ったハードドライブ上に表示されます。
(2)サーバーの負荷の変化を:時々あるため、ユーザーの行動のサービス要求は、このようなアリのように雪崩、二から一一活動につながる処理できない原因となる、事前に推定フローマシンの増加がない場合、サーバーが突然の圧力を増加させるようになります2ハング。
(3)人的要因:コード・パスをバグが時々生じるような
2 。アバランシェサービスプログラムを解決したり、軽減するために、
一般的な保護のためのサービスは、主に3つのソリューションを依存しています:
(1)融合モード:このモードは、主にライン電圧が高すぎると、参照回路を吹き吹きヒューズや火災を防止します。私たちのシステムに、ターゲットサービスの呼び出しが遅いか、多くの時間がある場合には有効期限が切れ、ターゲット・サービス、ダイレクトリターン、クイックリリースのリソースを呼び出すために継続していない、サービス、後続の呼び出しの要求を呼び出すために吹き飛ばさ。目標は、状況の改善、サービスコールを復元する場合。
(2)分離モード:一つの島に同じタイプの要求に応じてシステムのこのモードは、島が火災である場合、より少ない光が他の島に影響を与えないであろう。例えば、リクエストの種類ごとに互いに独立して、スレッドプールリソースの分離への要求の異なるタイプのために使用することができる、リソースの枯渇要求スレッドの一種であれば、その後の要求の種類ではなく、リソースを呼び出す、直接戻されます。このモードは、非常に多くのシーンを使用して重要なサービスは、多施設を促進するために、最近、再び別のサーバーを展開するために使用し、またはのために、例えば、サービスを開きます。
(3)モード制限:電流制限モードが予防モードと呼ぶことができるが、モード及び誤差後のフォールトトレラント処理機構に属する上記ヒューズ分離モード。上記の閾値は、代わりにリソースを呼び出すので、要求に直接返すように設定されている場合、モードは主に、予め設定された制限することで、要求のタイプごとに、最も高いしきい値をQPS。このモデルは、要求がアバランシェ効果を生じさせる可能性がまだ制限されていないため、依存、唯一、資源配分システムの全体的な問題を解決することができるサービスの問題を解決するものではありません。
3.ヒューズ設計
主基準hystrixアプローチのヒューズ設計で。最も重要な三つのモジュール:要求決意アルゴリズムヒューズ、ヒューズ回復メカニズム、ヒューズアラーム
(1)要求ヒューズ機構アルゴリズムが決定:ロックフリーキュー・カウント・サイクルを使用して、各ヒューズデフォルトの保守バケット10、バケット1秒ごとに、各blucketレコード要求の成功、失敗、タイムアウト、拒否状態、デフォルトのエラー以上、50%以上10秒以内に20以上の割り込み要求をインターセプトします。
(2)回復を融合:リクエストが健康(RT <250msの)健康の回復のために要求されている場合は吹き飛ばさすべての5Sの要求は、によって、いくつかの要求を許可します。
(3)アラームを融合:吹きプレイログの要求のために、異常警報設定要求は、特定超え
4.分離デザイン
分離された方法が、一般的に2を使用します
(1)スレッドプールの分離モード:現在の要求を格納するスレッドプールを使用して、スレッドプールを処理するための要求、タイムアウトタスク復帰処理設定、リクエストキュースレッドプールにバルクパック。このアプローチは、各従属サービス要求スレッドプールのために必要となる、特定のリソースの消費量があり、利点は、(トラフィックのピークが来る、ゆっくり処理するスレッドプールのチームに格納されたデータの処理を完了することはできません)バースト性トラフィックに対処することができます
(2)信号分離モード量:実行中のスレッドの現在の数を記録するカウンタ原子(またはセマフォ)を使用して、カウンタの第1の要求判定値は、スレッドの最大数は、廃棄の種類を変更するための新しい要求を提供超え、要求カウンタがカウント動作+1を実行以上あれば、-1カウンタ要求が返されます。このアプローチは、厳密にスレッドを返すバーストトラフィックに対処することができませんでしただちにモード、制御され(トラフィックのピークが来ると、スレッドは、私たちが要求されたサービスに依存し続けていない、他の要求の数が直接返されます超えます)
5タイムアウト機構設計
2種類のタイムアウト、1はタイムアウト要求のタイムアウトを実行するための要求を待つことです。
待機タイムアウト:キュー時間にタスクを設定し、HOLキュー時間を決定する作業は、ときに、タスクキュータスクを捨てるよりも、タイムアウト期間よりも大きいです。
実行タイムアウト:直接法は、スレッドプールを提供します使用することができます
ヒューズメカニズムとは何ですか
問題は、システム全体のダウンの正常な動作を確保し、サービスをダウングレードするためのメカニズムを提供するために、下流のサービスを発生した後、あるメカニズムを、融合し、システム全体がアバランシェ効果が現れる避け、キャッシュされたデータやデータを返すことによって確立しました。springcloudでは、この機能は、設定により、プロジェクトに追加することができます。
GFCI
1.回路遮断器機構
回路遮断器のバックエンドサービス要求がHystrixコマンド量が一定の割合(デフォルト50%)を超えると、回路ブレーカが開状態(オープン)に切り替えます失敗したときだけでなく、それを理解されたい。この場合、すべての要求は、バックエンド・サービスの障害に直接送信されていません回路ブレーカ一定期間後に開いた状態のまま(デフォルトでは5秒)が自動的に半開状態(ハーフオープン)に切り替わります。リクエストが成功した場合は、この場合の状況を返すように要求が決定されます、サーキットブレーカーのスイッチバックの閉鎖状態( Hystrix遮断器はヒューズで私たちの家族のように、バックエンドサービスが利用できないと、回路ブレーカは、リクエストの直接チェーンを切断されますされて開放状態(OPEN)。にCLOSED)、またはスイッチバックは無効な要求の多くは、システムのスループットに影響を与える送信しないようにしますそして、回路遮断器は、自己テストおよび回復する能力を持っています。
2.Fallback
バックエンドサービスリクエスト例外は、あなたが値をフォールバック方式のリターンを使用することができたときにフォールバック同等のダウングレード。クエリ操作のために、我々は、フォールバック方式を実現することができます。戻り値は通常セットのデフォルト値であるか、キャッシュのフォールバック方式から。
3.リソースの分離
Hystrixで我々は、リモートサービスコール基づいて、複数のスレッドプールに主に通常の使用では、分離を達成するために、スレッドプールのリソースによって分割されますとき。例えば、通話のために商品やサービスのコマンドAのスレッドプールの中に、コマンドの呼び出しアカウントサービスを置きますスレッドプールにB。これの主な利点は、動作環境を離れて設定されたことである。このようなサービスは、呼び出し元のコードのバグや他のためには、自分の時間スレッドプールが使い果たされる原因となる場合でも、他のサービスシステムには影響しませんが、存在します。しかし、複数のスレッドを維持するためのコストは、追加のパフォーマンス・オーバーヘッドをもたらすでしょうプールシステムをもたらすことです。そこに厳格な性能要件であり、サービスを呼び出すためのクライアントコードは問題ではないと考えている場合、あなたは(Hystrix信号パターンを使用することができます分離株のリソースへのセマフォ)。
ダウングレードサービス
ユーレカの作成
Structureチャート
輸入依存度
<依存性> <依存> <groupIdを> org.springframework.boot </ groupIdを> <たartifactId>春・ブート・スターター・ウェブ</たartifactId> </依存関係> <依存> <groupIdを> org.springframework.cloud </ groupIdを> <たartifactId>春・クラウド-config設定 - サーバー</たartifactId> </依存関係> <依存> <groupIdを> org.springframework.boot </ groupIdを> <たartifactId>ばねブートスタータ試験</たartifactId> <スコープ>テスト</スコープ> <除外> <除外> <groupIdを> org.junit.vintage </ groupIdを> <たartifactId> JUnitのヴィンテージエンジン</たartifactId> </除外> </除外> </依存関係> <! - 依存ユーレカ - > <依存> <groupIdを> org.springframework.cloud </ groupIdを> <たartifactId>ばねクラウドスタータのNetflix、ユーレカサーバ</たartifactId> </依存関係> </依存関係>
application.ymlファイル
サーバ: ポート:1001 ユーレカ: クライアント: ##サービスセンターで自身を登録しないでください 登録 -with-ユーレカ:偽の ##レジストリ自分自身を示しました。 フェッチ -registry:偽の #設定し、クライアントのアクセスアドレス サービス - URL: defaultZoneます。http:// localhostを:1001 /ユーレカ インスタンス: #eurekaサーバーインスタンス名 ホスト名:eureka1001.com
スタートアップクラス
@SpringBootApplication @EnableEurekaServer // サービスレジストリ パブリック クラスSpringcloudEurekaServerApplication { パブリック 静的 ボイドメイン(文字列[]引数){ SpringApplication.run(SpringcloudEurekaServerApplication。クラス、引数)。 } }
結果は
、
springcloud_eureka_ememberプロジェクトの作成
Structureチャート
輸入依存度
<依存性> <依存> <groupIdを> org.springframework.boot </ groupIdを> <たartifactId>春・ブート・スターター・ウェブ</たartifactId> </依存関係> <依存> <groupIdを> org.springframework.cloud </ groupIdを> <たartifactId>春・クラウド-config設定 - サーバー</たartifactId> </依存関係> <依存> <groupIdを> org.springframework.boot </ groupIdを> <たartifactId>ばねブートスタータ試験</たartifactId> <スコープ>テスト</スコープ> <除外> <除外> <groupIdを> org.junit.vintage </ groupIdを> <たartifactId> JUnitのヴィンテージエンジン</たartifactId> </除外> </除外> </依存関係> <! - 依存ユーレカ - > <依存> <groupIdを> org.springframework.cloud </ groupIdを> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
application.yml文件
##应用名称 spring: application: name: member-service ##端口号 server: port: 9001 ##注册到注册中心当中去,指定注册中心地址 eureka: client: service-url: defaultZone: http://localhost:1001/eureka
service接口
public interface MemberService { public String getMember(); }
service接口实现类
@RestController public class MemberServiceImpl implements MemberService { @RequestMapping("/getMember") @Override public String getMember() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return "QQ"; } }
启动类
package com.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class SpringcloudEurekaMemberApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudEurekaMemberApplication.class, args); } }
结果实现
创建springcloud_eureka_order工程
结构图
导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--eureka依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
application.yml文件
##应用名称 spring: application: name: order-service ##端口号 server: port: 9002 ##设置Tomcat最大线程数 tomcat: max-threads: 50 ##注册到注册中心当中去,指定注册中心地址 eureka: client: service-url: defaultZone: http://localhost:1001/eureka ##配置ribbon读取时间 ribbon: ReadTimeout: 15000 ConnectTimeout: 15000 ##开启断路器 feign: hystrix: enabled: true
Fegin使用断路器
service接口
@FeignClient(value = "member-service",fallback = CloudService.class) public interface MemberService { @RequestMapping("/getMember") public String getMember(); }
自定义本地实现接口类
@Component public class CloudService implements MemberService { @Override public String getMember() { return "请求连接超时!!!"; } }
controller控制器
@RestController public class OrderController { @Resource private MemberService service; @RequestMapping("/getOrderMember") public String getOne(){ return service.getMember(); } @RequestMapping("/getTwo") public String getTwo(){ return "sdfdfdfdf"; } }
启动类
package com.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClient; @SpringBootApplication @EnableEurekaClient @EnableFeignClients public class SpringcloudEureakOrderApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudEureakOrderApplication.class, args); } }
结果
解决方案
在application.yml文件中设置服务响应时间
Rest方式使用断路器
service接口
public interface MemberService { @RequestMapping("/getMember") public String getMember(); }
controller控制器
@RestController public class OrderController { @Resource private RestTemplate template; @RequestMapping("/getOrderMember") @HystrixCommand(fallbackMethod = "getError") public String getOne(){ return template.getForObject("http://member-service/getMember",String.class); } public String getError(){ return "服务熔断"; } @RequestMapping("/getTwo") public String getTwo(){ return "sdfdfdfdf"; } }
启动类
package com.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableEurekaClient @EnableHystrix public class SpringcloudEureakOrderApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudEureakOrderApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
结果