すべての記事
https://www.cnblogs.com/lay2017/p/11908715.html
テキスト
HystrixInvocationHandler
hystrixは、ヒューズアセンブリに開放されているデフォルトのopenfeignと一体と組み合わせることspringcloud。openfeignがJDKダイナミックプロキシ生成プロキシオブジェクトインターフェースを基づいている、hystrixはふりインターフェースそれらを呼び出すプロセスに統合されなければなりません。
だから、hystrixヒューズは、JDKの動的プロキシのInvocationHandlerに当たるopenfeignに統合します。そして、そのhystrixの実現には、それは何ですか?
そこで、我々は、HystrixInvocationHandlerのinvokeメソッドをフォローアップ
パブリックオブジェクトを呼び出し(最終オブジェクトプロキシ、最終的な方法方法、最終的なオブジェクト[]引数)がスローされたThrowable { // ... HystrixCommand <OBJECT> hystrixCommand = 新しい HystrixCommand <OBJECT> (setterMethodMap.get(法)){ @オーバーライド 保護されたオブジェクトのRUN()がスロー例外{ 試して{ // 取得しMethodHandlerカプセル化されたHTTPのリクエスト、MethodHandlerを呼び出し、リボンがここに統合され 、戻り HystrixInvocationHandler。この.dispatch.get(方法).invoke(引数); } キャッチ(例外e){ スローE。 } キャッチ(ThrowableをT){ スロー(エラー)T。 } } @オーバーライド 保護されたオブジェクトgetFallback(){ // ...分解プロセスフォールバック } }。 // ... リターンhystrixCommand.execute(); }
コードたinvoke明確に思える削除した後、非常に長いです。ビット病気を読み取るためrxjava、コード・ロジックの結果としてhystrix。
コアプロセスは、前方まだ方法、HTTPリクエストを実行する責任MethodHandlerによって対応MethodHandlerを得るために呼び出し、結果を返します。
だから、シェーンはここhystrixたのですか?
明白な比較はフォールバックの一部であり、フォールバックの意味は明確で、かつ一定の障害状態までダウングレードをトリガします。そこで、我々は、高可用性を確保するために、フォールバック実装をカスタマイズすることができます。
コアロジック・ヒューズは、実行メソッドhystrixCommandの内側に落ちます
hystrixCommand
次に、この方法を実行hystrixCommand従います
公共のRは、(){実行 してみてください{ リターン)キューを(取得します()。 } キャッチ(例外e){ スローExceptions.sneakyThrow(decomposeException(e)参照)。 } }
キューは、将来を返し、非同期メソッドは、結果を取得します、フォローアップキュー
公共未来<R> キュー(){ 最終未来<R>デリゲート= 。。toObservable()toBlocking()toFuture(); 最終的な将来<R&LT> F = 新しい新しい将来<R&LT> (){ // ...今後は、対応するコールデリゲートを達成するために実装しました }。 // ... リターンF; }
あなたはそれに続く、コアロジックがtoObservableに落ち、見ることができます
公共観測<R> toObservable(){ 最終 AbstractCommand <R> _CMD = この; // ... 最終 Func0 <観測<R >> applyHystrixSemantics = 新しい Func0 <観測<R >> (){ @オーバーライド 公共観測<R> コール(){ 場合(commandState.get()に等しい(CommandState.UNSUBSCRIBED)){ リターンObservable.never()。 } リターンapplyHystrixSemantics(_cmd)。 } }。 // ... }
この方法は、非常に長いだけapplyHystrixSemantics方法についてはこちら心配です
プライベート観察可能な<R> applyHystrixSemantics(最終 AbstractCommand <R> _cmd){ // ... // 要求を許可するかどうかを IF (circuitBreaker.allowRequest()){ 最終 TryableSemaphore executionSemaphore = getExecutionSemaphore()。 // ... もし(executionSemaphore.tryAcquire()){ しようと{ executionResult = executionResult.setInvocationStartTime(のSystem.currentTimeMillis())。 // 执行业务 リターンexecuteCommandAndObserve(_cmd) .doOnError(markExceptionThrown) .doOnTerminate(singleSemaphoreRelease) .doOnUnsubscribe(singleSemaphoreRelease)。 } キャッチ(のRuntimeException電子){ リターンObservable.error(E); } } 他{ // セマフォ取得がフォールバック行く、失敗 を返すhandleSemaphoreRejectionViaFallbackを(); } } 他{ // 即効性、歩行フォールバック リターンhandleShortCircuitViaFallback(); } }
それはセマフォ制御層を通過します実行を許可、我々は通じ行っている場合allowRequest方法によって判断applyHystrixSemanticsが実行されます、フォールバックへ行く速い失敗の必要性を融合します。
だから、コアロジックは、それに続く、allowRequestに落ちます
@Override 公共 ブールallowRequest(){ // ヒューズに強制 IF (properties.circuitBreakerForceOpen()GET()。){ 戻り falseに。 } // 強制的に吹き飛ばさ IF ()properties.circuitBreakerForceClosed(GET()){ いるisOpen(); 返す 真; } // オープン吹き飛ばさまたは単一のテストはできませ リターンいるisOpen()||!allowSingleTest(); }
あなたが開いているの実装を要求する必要がない場合は、あなたが閉じられているすべてのエラーを無視することができると思う場合hystrixは、上またはヒューズ強制的にオフにすること。
強制スイッチの非存在下で、主電流は、オープン吹き飛ばさか否かが判定されます。また、当社はallowSingleTest方法があります助けることが予告することはできません。オープンヒューズの場合には、ヒューズオープンかどうかを決定するために、一定時間後に発行されたテスト要求を、可能にします。
我々は、それが現在のヒューズが開いて決定されたかどうかを確認するためにいるisOpen方法を最初に入力してください
パブリック ブールいるisOpen(){ // スイッチが開いて、直接復帰 IF (circuitOpen.get()){ リターン trueに。 } // スイッチは、保健統計に、アクセスがオンになっていません HealthCounts健康= metrics.getHealthCounts(); // 要求の合計数が少なすぎる、ヒューズが開いていない IF(health.getTotalRequests()< {properties.circuitBreakerRequestVolumeThreshold()GET()。) に戻る falseに。 } // 合計が十分に要求し、故障率が比較的小さい、開いていないヒューズがある IF(health.getErrorPercentage()< properties.circuitBreakerErrorThresholdPercentage()GET()。){ 戻り falseに。 } 他{ // 総要求の数とスイッチが融着、ONに設定されている場合、故障率が比較的大きい IF(circuitOpen.compareAndSet(falseに、trueにします)){ circuitOpenedOrLastTestedTime.set(のSystem.currentTimeMillis())。 返す 真; } 他{ 戻り 真。 } } }
全体的なロジックは、失敗の数は、それがスイッチに到達したならば、オープンに設定し、吹き付け開放状態に達したか否かを決定することです。
ヒューズの場合に時々要求が閉じられているかどうかを決定するテストを見逃し、オンにされています。その後、我々はallowSingleTestを見るためにフォローアップします
パブリック ブールallowSingleTest(){ // 取得ヒューズ開放時間や前回のテスト ロング timeCircuitOpenedOrWasLastTested = circuitOpenedOrLastTestedTime.get(); // ヒューズはオン状態であり、時間に溶断から現在時刻または試験リクエストがに実行された前回場合 IF(circuitOpen.get()&&のSystem.currentTimeMillis()> timeCircuitOpenedOrWasLastTested + properties.circuitBreakerSleepWindowInMilliseconds()。GET()) { // CASヒューズ開度制御 IF (circuitOpenedOrLastTestedTime のcompareAndSetの(timeCircuitOpenedOrWasLastTested、のSystem.currentTimeMillis())){ リターン trueに、 } } // そうすることができません 戻る 偽。 }
実際には、一定の時間ウィンドウで外出するテスト要求のリリースでは、特定の時間ウィンドウの使用を制御するために、CASメカニズムのみリクエストをリリースする予定もあります。
概要
ここでは、これは終わりです。hystrixはプラグがヒューズかどうかをスイッチに要求の成功または失敗に足、統計データを装う呼び出す処理に実際にあります。今度のテストが吹き飛ばさかどうかを決定するために、各時間ウィンドウを外出するための要求を送信します。一般的に言えば、それはまだ非常に明確かつ実用的です。しかし、最終的に、私はハハ、rxjavaコード嫌、と言っています