ノートやワンストップ制限ヒューズダウングレード:@SentinelResource

以前では、「センチネルは制限インターフェイスを実装し使用」の記事は、我々は唯一の歩哨に春クラウドアリババ統合パッケージの導入に依存しているspring-cloud-starter-alibaba-sentinelすべてのSpring MVCインタフェースの電流制限制御を完了させるために、。しかし、実際の応用プロセスにおいて、我々は、インターフェースに限定されるものではなく、フローレベルを制限する必要があるかもしれません。外部リソースへの一定の制限の呼び出しに、制限する方法を呼び出し、そのコントロールをしたいすることも可能。それはどのような資源のポイントは、我々が持っているこの時間は、手動で必要な電流制限値を定義して、電流制限戦略の関連する内容を設定します。

今日は、使用する方法について一緒に学習する必要があり、この@SentinelResource柔軟なリソースを制御し、どのようにポリシーを設定する方法を定義するために注釈を。

カスタムリソースポイント

次の例は、あなたがこれらを持っていない場合は、その優先順位を読むことをお勧め、あなたが春クラウドアリババセンチネル基礎を導入したことに基づいている「電流制限を達成するためのセンチネル・インタフェースの使用します」

最初のステップ:メインアプリケーションクラスサポートされる構成にノートを追加します。

@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

    // 注解支持的配置Bean
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }

}
复制代码

ステップ2:使用して必要のSentinelを通る流れを制御するために@SentinelResource、例えば、サービスロジック層の制御方法を以下のように、ノート:

@Slf4j
@Service
public class TestService {

    @SentinelResource(value = "doSomeThing")
    public void doSomeThing(String str) {
        log.info(str);
    }

}
复制代码

ここでは定義が完了している方法に保護する必要があります。その上で、降格を制限し:ここでは、定義されたリソース・ポイントの後に話をした、我々は、異なる保護戦略は、含めてどのように実現しています。

降格して電流制限ヒューズを達成する方法

リソース・ポイントを定義した後、我々は、リソースポイントを保護するためにダッシュボードを介して電流制限およびダウングレードポリシーを設定することができます。それと同時に、またできる@SentinelResource例外処理の方針が限界とダウングレードが発生した時刻を指定します。ここでは、電流制限と降格のそれぞれを見て、実装されることになります。

電流制限制御のために

ステップ1:ウェブ層は、この保護されたメソッドを呼び出します。


@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/hello")
    public String hello() {
        estService.doSomeThing("hello " + new Date());
        return "didispace.com";
    }

}
复制代码

ステップ2:センチネル・ダッシュボードを起動し、テストアプリケーションを起動します。要求を送信/helloセンチネル、ダッシュボード上に以下に示すようにいくつかの制御点を見ることができるように、インターフェース。

インスタンスがある以前のように私たちは、エントリに加えて、見ることができる/hello1つの以上、超えたリソースポイントdoSomeThingリソースポイントは。この点はQPSであることがルール・インタフェース、例えば2を制限することによって、リソースを提供することができます。以来/helloリソースが制限ルールを設定されていないので、長い要求など/helloのインタフェースは、直接アナログ呼び出すことができますdoSomeThing制限するルールが有効になって観察する、リソースを。

次はあなたが好きなツールで呼び出すことができる/hello限り、2つ以上のQPSとして、次のエラーが存在します、インターフェイスを有効にするポリシーを制限するのに代わって、返されます。

この時点で、サーバーコンソールは、対応する制限エラーログを持っています。

2019-06-27 11:30:43.514  INFO 36898 --- [nio-8001-exec-3] c.d.a.sentinel.service.TestService       : aaa
2019-06-27 11:30:43.905 ERROR 36898 --- [nio-8001-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException] with root cause

com.alibaba.csp.sentinel.slots.block.flow.FlowException: null
复制代码

例外処理を実現する制限

デフォルトでは、センチネル電流制限処理制御リソースは、直接スロー例外、つまり、掲載中のログの内容です。よりよいサービス利用者への順で合理的なビジネスの事業やドッキング例前端のそうかもしれないが、通常の状況では、制限された後、いくつかの特別な処理を実現します、我々は鈍いエラーを表示したくありません。次に、あなただけの、たとえば、上記の例に基づいて何らかの処理を行う必要があります。

@Slf4j
@Service
public class TestService {

    @SentinelResource(value = "doSomeThing", blockHandler = "exceptionHandler")
    public void doSomeThing(String str) {
        log.info(str);
    }

    // 限流与阻塞处理
    public void exceptionHandler(String str, BlockException ex) {
        log.error( "blockHandler:" + str, ex);
    }
    
}
复制代码

主に二つのことを実行します。

  • @SentinelResource注釈blockHandler特定のハンドラのプロパティを開発します
  • 処理機能を実装する、伝達関数パラメータとパラメータ渡しリソースが同じ点でなければならない、ととの最後のBlockException異常なパラメータ;同時に、戻り型は同じでなければなりません。

あなたはHystrixリーダーがHystrixCommand定義されたフォールバックを持つこのデザインは非常に似ているはずです精通している場合、理解しやすいです。

上記の変更が完了した後、次いで、インターフェイスにアクセスしようとする(注制限ルールを設定する必要がある)、その後、フロント例外情報を返さない、バックエンドは、印刷されるexceptionHandlerログ出力の定義を。そして、実際のアプリケーションでは、限り、ビジネスとしてので、この方法に基づいて、フロントエンドチップを実装することができませんし、キャッシングや制限するための要求を必要としています。

実現吹きダウングレード

@SentinelResource注釈に加えて、電流制限制御のために使用することができ、それはまた、Hystrixのダウングレード方針と同様のヒューズを達成します。ここではそれを使用する方法の具体的な表情です。

第一段階:電流制限制御と同様に、使用@SentinelResourceのようなコメントタグリソースポイント:

@Slf4j
@Service
public class TestService {

    @SentinelResource(value = "doSomeThing2")
    public void doSomeThing2(String str) {
        log.info(str);
        throw new RuntimeException("发生异常");
    }

}
复制代码

ここでのTestServiceメソッドの新しいクラスの作成、および使用@SentinelResource名前にリソースをdoSomeThing2この方法は、(Hystrixと同様に)ダウングレード異常な割合に基づいて戦略を開発するためのフォローアップと、例外がスローされます。センチネルは、豊かHystrixを比較し、応答時間およびポリシー例外をダウングレードの数に基づきます。

ステップ2:ウェブ層では、この保護されたメソッドを呼び出します。

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/hello2")
    public String hello2() {
        testService.doSomeThing2("hello2 " + new Date());
        return "didispace.com";
    }

}
复制代码

第三段階:テストアプリケーションを起動し、センチネル・ダッシュボードを開始します。リクエストを送信し/hello2ますが、センチネル・ダッシュボードという名前で見ることができるように、インターフェースdoSomeThing2リソースポイント。そして、ダウングレードリソースのルールを設定するには、「ダウングレード」ボタンをクリックします。本明細書で使用される場合、異常な比率ポリシーは、比は0.5に設定されている(すなわち:50%の異常レート)、時間ウィンドウは2(秒)に設定されています。

ステップ4:ヒューズを確認し、上記劣化ポリシー構成によれば、劣化doSomeThing2率が50%を超える場合、呼び出し方法QPS> = 5は、異常な、次いで2秒以内に後続の呼び出しを直接ダウングレードデフォルト直接スローヒューズ進行しますDegradeException次のような異常が、

2019-06-27 17:49:58.913 ERROR 99863 --- [nio-8001-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException] with root cause

com.alibaba.csp.sentinel.slots.block.degrade.DegradeException: null
复制代码

吹きダウングレード

センチネルヒューズで定義されたダウングレード処理方法は非常に簡単、かつHystrixに非常に類似しています。ただ、使用@SentinelResource注釈fallback特定のメソッド名を指定する属性を。参加するために、リターンパスに注意を払う必要があることは一致していなければならないもあります。例えば:

@Slf4j
@Service
public class TestService {

    // 熔断与降级处理
    @SentinelResource(value = "doSomeThing2", fallback = "fallbackHandler")
    public void doSomeThing2(String str) {
        log.info(str);
        throw new RuntimeException("发生异常");
    }

    public void fallbackHandler(String str) {
        log.error("fallbackHandler:" + str);
    }
}
复制代码

上記の変換を完了した後、アプリケーションを再起動して設定しdoSomeThing2、その後、頻繁に要求格下げ戦略(異常な使用のパーセンテージ)を吹きリソースの/hello2インターフェースを。QPS> = 5の後、原因このインタフェースは、条件が満たされ、この時点で実行されます格下げ爆破する、スローされたfallbackHandler以下のような方法、連続印刷ログを:

2019-06-27 23:44:19.432 ERROR 58471 --- [nio-8001-exec-1] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.599 ERROR 58471 --- [nio-8001-exec-2] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.791 ERROR 58471 --- [nio-8001-exec-3] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.975 ERROR 58471 --- [nio-8001-exec-4] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:20.168 ERROR 58471 --- [nio-8001-exec-5] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:20 CST 2019
复制代码

その他の注釈プロパティ説明

@SentinelResourceメモ2主な用途:電流制限ヒューズと制御ダウングレード具体的な使用例は、以上の導入。加えて、アノテーションが、このような無視する特定の異常な構成、機能の他のより洗練された構成であるので、分解特に可視以下の説明をデフォルト:

  • value:リソース名、必要な項目(空にすることはできません)
  • entryType:エントリの種類、オプション(デフォルトではEntryType.OUT
  • blockHandler/ blockHandlerClassblockHandler対応処理BlockException関数名、オプション。blockHandler範囲の関数にアクセスする必要があるpublic、元の方法と一致するために必要なリターンの種類、およびパラメータは、元のメソッドの型と一致し、最後に追加のパラメータ・タイプを追加する必要がありますBlockExceptionblockHandlerのデフォルトの関数と同じクラスで、元のメソッドが必要です。あなたが他のタイプの関数を使用したい場合は、指定することができblockHandlerClass、対応のクラスClassに対応する機能に注意を払う、オブジェクトを静的な機能のために必要であり、それ以外に解決することはできません。
  • fallback:フォールバック関数名、例外をスローする場合、フォールバック処理ロジックを提供するためのオプション。フォールバック機能は、(例外のすべてのタイプを除いことができるexceptionsToIgnore処理のために除外される例外タイプ)。フォールバック機能シグネチャと場所の要件:
    • 戻り値関数の戻り値は、元の型と一致していなければなりません。
    • この方法は、オリジナルと一致パラメータおよび機能のリストを必要とする、または追加することができるThrowable受信したパラメータに対応する異常の種類。
    • デフォルトのフォールバック機能と同じクラスで、元のメソッドが必要です。あなたが他のタイプの関数を使用したい場合は、指定することができfallbackClass、対応のクラスClassに対応する機能に注意を払う、オブジェクトを静的な機能のために必要であり、それ以外に解決することはできません。
  • defaultFallback(1.6.0以降):一般的に(多くのサービスや方法のために使用することができます)、一般的なフォールバック・ロジックに使用されるデフォルトのフォールバック関数名、オプション、。デフォルトのフォールバック機能(例外のすべてのタイプを除くことができexceptionsToIgnore、処理除外する例外タイプ)。あなたがフォールバックとdefaultFallbackの両方を設定した場合、唯一のフォールバックが有効になります。defaultFallback機能の署名要件:
    • 戻り値関数の戻り値は、元の型と一致していなければなりません。
    • この方法は、パラメータ・リストが空であるか、または追加することができる必要がありThrowable、受信したパラメータに対応する異常の種類。
    • defaultFallbackのデフォルトの関数と同じクラスで、元のメソッドが必要です。あなたが他のタイプの関数を使用したい場合は、指定することができfallbackClass、対応のクラスClassに対応する機能に注意を払う、オブジェクトを静的な機能のために必要であり、それ以外に解決することはできません。
  • exceptionsToIgnore(1.6.0以降):除外統計的異常に含まれていない、およびフォールバックロジックを入力しないであろうが、それがスローされるようにされている例外を指定するために使用されます。

注:以前のバージョン1.6.0フォールバック機能にのみダウングレードのために非常に(DegradeException)処理され、ビジネスの例外に対処することはできません

blockHandlerとフォールバックが設定されている場合は特に、彼らはダウングレードを制限投げられたBlockException場合にのみ入りますblockHandlerロジックを処理します。設定なした場合blockHandlerfallback及びdefaultFallback、制限されたダウングレードされますBlockException 直接投げます

参考文献センチネル公式文書

奥付:あなたが特定の問題が発生した場合、スプリング・クラウドアリババ-依存関係のバージョン0.2.2に基づいて、バージョンが同じであるチェック、または直接チェックコード例特定のケースにしてください。

サンプルコード

この記事では、クライアントコードの内容を説明し、読者には、次の例の倉庫見ることができますalibaba-sentinel-annotationプロジェクトを:

あなたはこれらのことに興味がある場合は、スターを歓迎し、サポートを転送し、ブックマークに従ってください!

おすすめ

転載: juejin.im/post/5d19643ce51d454fbe24a6cc