まず、概念
1.なぜヒューズをダウングレードする必要があります
(1)需要の背景
これは、システムの負荷が高すぎる、異常な状態またはトラフィックバーストは、一般的なソリューションをネットワークに導入されています。
分散システムでは、サービスは複数のサービスに依存して、我々は依存関係の問題の場合にはそれを確保することができ、かつ全体的なサービス障害につながることはありませんか、サービスコールは、残業、異常として、失敗があるかもしれません。
たとえば、次のように重い負荷条件下でのタイムアウトの場合はマイクロサービスのビジネスロジックの複雑さ、。
内部条件:無限ループの原因のプログラムのバグは、スロークエリがあり、プログラムロジックは、メモリ不足につながるものではありません
外部条件:ハッカーの攻撃、プロモーション、サードパーティ製のシステムはゆっくりと応答します。
(2)ソリューション
インターフェイスレベルの優先順位を解決するために、障害の核となるアイデアは、コアビジネスを保護し、ユーザーの大半に優先権を与えることです。このようなログイン機能としてトラフィックがリソースを解放するために、ログインを登録機能をオフにし、高すぎると、非常に重要です。
(3)解像度戦略
ヒューズ、降格、電流制限、キューイング。
2.ヒューズは何ですか
一般的には、サービスの障害である、またはサービス全体ではなく、サービスは、システム全体の障害を防ぐために防止するために、このタイムアウトを待ってきた直接ヒューズ、異常な状態がトリガされた現実の世界ヒューズ 'と同様に、異常によって引き起こされます。
保護対策の数を使用します。過負荷保護。そのような応答が非常に遅いサービスインターフェースBは界面におけるX依存性Bサービス、などのサービス機能は、X Aサービス機能応答はさらに、スレッドAのサービスが得られ、減速X関数で立ち往生しているであろう
上のその他の機能は、サービスが遅くなったり、マスターカードます。この時点で、すなわち、A Bサービスは、このインターフェイスを要求されず、直接ダウングレードすることができる機構を融合させる必要があります。
3.ダウングレードされ何
サーバーたときに圧力サージ、一部のサービスの現在のビジネス状況や流れに応じて戦略的格下げのページ。顧客を維持しながら、中核事業の正常な動作を保証するために、サーバリソースへの圧力を緩和するため、および
正しい対応するほとんどの顧客を取得します。
自動的にダウングレード:タイムアウト、失敗の数、故障電流リミッタ
(1)設定されたタイムアウト(応答状況を検出するための非同期機構)
一定数のダウングレード(ケースが返信検出する非同期メカニズム)へのコールの数の(2)APIの不安定性、
(3)は、リモートサービス障害(DNS、HTTPサービスのエラーステータスコード、ネットワーク障害、RPCサービス例外)、ダイレクトダウングレードを呼び出します。
人工ダウングレード:スパイク、ダブルXI格下げ非本質的なサービスを推進しています。
図4に示すように、ヒューズとの類似点と相違点をダウングレード
同じポイント:
1)システムのクラッシュを防止するために、トリガーの可用性と信頼性から
2)エンドユーザーが一時的に使用することはできませんいくつかの機能を体験することができ
違い:
1)サービスヒューズの故障は、一般的に、発呼者によって制御され、一般的に全体として考えられている下流サービス、サービスの劣化やシステム負荷によって引き起こされます
2)トリガー異なる理由は、上記のフォントの色を説明しました
ダウングレードのプロセスを説明するための図5に示すように、ヒューズ
ヒューズを設定するには、次のようにHystrixは、いくつかの重要なパラメータが用意されています。
circuitBreaker.requestVolumeThreshold //ウィンドウサイズをスライディング、デフォルトは20 circuitBreaker.sleepWindowInMilliseconds //長すぎる、ヒューズがオープンに、デフォルトであることが、5000であるか否かを再度検出され、ベル5S circuitBreaker.errorThresholdPercentage //エラーレート、デフォルトの50%を
一緒に3つのパラメータ表現の意味は次のとおりです。
20の要求は、50%が失敗したときはいつでも、ヒューズには、リモートサービスを調整し、直接失敗に戻らないだろう、このサービスを呼び出して、この時間を開きます。ベル後まで5S、トリガ条件の再試験、ヒューズが閉じられているかどうかを決定する、または開くために継続します。
これは非常に重要なポイントの内部にある、ヒューズに達した後、その後、マイクロサービスは直接チューン後ろに行きます。それ以来、このような場合、トーンマイクロ起こる調整する異常なサービスかどうかは、そう融合するため、ユーザに最初のエラー情報を直接に可能ではありません
私たちは、ダウングレード戦略を考えることができます。サービスは、吹き飛ばされていないサーバーは、もはや呼び出されます、この時間は、クライアントが独自のローカルフォールバックコールバックは、デフォルト値を返す準備することができ、いわゆる降格、。
そうすることで、レベルの低下が、どのような結果が利用可能である、直接ハングよりも強いが、もちろん、これはまた、適切なビジネスシナリオに依存します。
二、Hystrixリアル
ユーレカ、装うは、以下の3つの項目が含まれています成分として使用します。
(1)ユーレカ・サーバー:7001登録機関
(2)製品 - サーバー:8001の製品マイクロサービス
(3)受注サーバー:9001注文microService
レジストリは、マイクロ財やサービスは、ここでは繰り返さない書かれ、ブログの前に設定されています。ここだけのマイクロオーダー・サーバーのサービスを作成します。具体的な空想のブログエントリ:SpringCloud(5)---装うサービスコール
1、のpom.xml
<! - hystrix依赖、主要是用@HystrixCommand - > <依存> <groupIdを> org.springframework.cloud </ groupIdを> <たartifactId>春・クラウド・スタータNetflixの-hystrix </たartifactId> </依存関係>
2、application.yml
サーバー: ポート:9001の #指定登録センターアドレス ユーレカ: クライアント: serviceURLの: defaultzoneます。http:// localhost:7001 /ユーレカ/ #サービス名 春: アプリケーション: 名前:オーダーサービス #オープン装うサポートhystrix(なお、一定)、デフォルトではオフに新しいバージョンを古いバージョンのデフォルトサポートをオンにする ##コールのタイムアウト(デフォルトでもタイムアウトた場合、1秒)に変更 :装う hystrix: 有効:trueに クライアント: 設定: デフォルト: のconnecttimeout:2000 ReadTimeout:2000
3、SpringBootスタートアップクラス
@SpringBootApplication @EnableFeignClients //添加熔断降级注解 @EnableCircuitBreaker パブリッククラスOrderApplication { パブリック静的無効メイン(文字列[] args){ SpringApplication.run(OrderApplication.class、引数)。 } }
4、ProductClient
/ ** *製品サービスクライアント *名=「製品・サービス」は、あなたが呼び出しているサーバーの名前です *フォールバック= ProductClientFallback.class、ダウングレードカスタムクラスに続いて、クラスがProductClientダウングレード実装する必要があります * / @FeignClient( =名前"製品-サービス"、フォールバック= ProductClientFallback.class) パブリックインターフェイスProductClient { //これはHTTPの組み合わせと同等です://製品で修理/ API / V1 /製品/検索 @GetMapping(「/ API / V1 /製品検索/ ") 文字列findById(@RequestParam(値=" ID「)のint ID); }
5、ProductClientFallbackクラス格下げ
/ ** *商品やサービスのために、ダウングレードする間違っていた * / @Component 実装ProductClient {publicクラスProductClientFallbackを @Override パブリック文字列findById(上記IDの上INT){ System.out.printlnは( "ダウンスケーリング方法でProductClientFallback"); //このインタフェースロジックは、いくつかのダウングレード........ GAI 戻りヌル; } }
6、OrderController类
注:数のパラメータタイプsaveOrderFail方法fallbackMethod =「saveOrderFail」、それ以外の場合、彼らはsaveOrderFailが方法を報告し見つけることができません、ために正確に保存します。
@RestController @RequestMapping( "API / V1 /受注") パブリッククラスOrderController { @Autowired プライベートProductOrderService productOrderService; @RequestMapping( "保存") //呼び出しミクロセルがsaveOrderFail異常なプロセスにダウングレードされるとき @HystrixCommand(fallbackMethod = " saveOrderFail ") パブリックオブジェクト保存(@RequestParam(" USER_ID ")ユーザーIDの、@RequestParam INT(" PRODUCT_ID「)を商品コードをINT){ リターンproductOrderService.save(userIdを、PRODUCTID); } //方法およびAPI署名がなければならないことに注意この方法は、一貫性のある プライベートオブジェクトsaveOrderFail(userIdをint型、PRODUCTIDをINT){ のSystem.out.println( "メソッドのコントローラ分解"); マップの<string、オブジェクト> =新しい新しいMSGのHashMap <>(); msg.put( "コード"、-1); msg.put(「MSG」、「あまり購入する人の数は、あなたが再試行を待って、絞り出さ」); 戻りMSG; } }
7、テスト
(1)正常
示すように、まずオーダーサービス(オーダー)と商業サービス(製品)は、同時に開始しました:
受注通常のサービスコールグッズ
(2)例外
私は今、製品マイクロサービスが停止します。もちろん例外はあるだろうと、商品やサービスのタイムアウトをコールする場合にのみ、マイクロサービスの受注を開始します。
チューンでインターフェイスメソッドが正常に見つけることが格下げされました
ProductClientFallback方法を劣化分解のコントローラ及び方法で実装、それらの順序が固定されていない参照するためには、方法降格制御を行うことが可能であり、方法は、第1 ProductClientFallbackが低下実行することができます。
どのスレッドCPUを入手する権利の特定の実装に依存します。
第三に、アナログヒューズRedisのダウングレード異常アラーム通知戦闘の組み合わせ
主な治療が改善し、完璧なサービスを融合することである、警報システムは、ユーザが失敗通知するために、単一のSMSをシミュレートするのに最適な組み合わせをRedisの。
1、のpom.xml
<! - springboot整合のRedis - > <依存> <groupIdを> org.springframework.boot </ groupIdを> <たartifactId> springboot-スタータデータ-Redisの</たartifactId> </依存関係>
2、application.yml
#服务的名称 #redis spring: application: name: order-service redis: database: 0 host: 127.0.0.1 port: 6379 timeout: 2000
3、OrderController类
主要看降级方法的不同
@RestController @RequestMapping("api/v1/order") public class OrderController { @Autowired private ProductOrderService productOrderService; //添加bean @Autowired private StringRedisTemplate redisTemplate; @RequestMapping("save") //当调用微服务出现异常会降级到saveOrderFail方法中 @HystrixCommand(fallbackMethod = "saveOrderFail") public Object save(@RequestParam("user_id")int userId, @RequestParam("product_id") int productId,HttpServletRequest request){ return productOrderService.save(userId, productId); } //注意,方法签名一定要要和api方法一致 private Object saveOrderFail(int userId, int productId, HttpServletRequest request){ //监控报警 String saveOrderKye = "save-order"; //有数据代表20秒内已经发过 String sendValue = redisTemplate.opsForValue().get(saveOrderKye); final String ip = request.getRemoteAddr(); //新启动一个线程进行业务逻辑处理 new Thread( ()->{ if (StringUtils.isBlank(sendValue)) { System.out.println("紧急短信,用户下单失败,请离开查找原因,ip地址是="+ip); //发送一个http请求,调用短信服务 TODO redisTemplate.opsForValue().set(saveOrderKye, "save-order-fail", 20, TimeUnit.SECONDS); }else{ System.out.println("已经发送过短信,20秒内不重复发送"); } }).start(); 地図<文字列、オブジェクト> MSG =新しい新しいHashMapの<>(); msg.put( "コード"、-1); msg.put( "MSG"、「あまり購入する人の数は、あなたが重い待ち、絞り出さテスト「); 戻りMSG; } }
4、試験
とき連続再送要求の20秒は、既に思い出させるためにメッセージを送りました。
公式文書ます。https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.strategy
私はたまにしかそれについてのすべてを疑問に思っ過ぎて、静かにします。昔に持っている人は、さらに愚か、価値がない非難、ナイーブがありました。すべての後に、次の日、まだ非常に長いです。自分自身を奨励するために続けて、
夜明け、だけでなく、新たな出発点、だけでなく、未知の旅(大佐8)で