1. 概要

名前が示すように、Sentinelはマイクロサービスの強力なガードです。 フロー制御、同時実行制限、回路遮断、適応システム保護などの機能を提供して、信頼性を保証します。 これは、AlibabaGroupによって積極的に保守されているオープンソースコンポーネントです。 また、正式にはSpring Cloudサーキットブレーカーの一部です。

このチュートリアルでは、Sentinelの主な機能のいくつかを見ていきます。 さらに、その使用方法、注釈のサポート、および監視ダッシュボードの例を示します。

2. 特徴

2.1. フロー制御

Sentinelは、マイクロサービスの過負荷を回避するために、ランダムな着信要求の速度を制御します。 これにより、トラフィックの急増によってサービスが停止することがなくなります。 さまざまなトラフィックシェーピング戦略をサポートします。 これらの戦略は、トラフィックを適切な形に自動的に調整します 1秒あたりのクエリ数(QPS)が高すぎる場合。

これらのトラフィックシェーピング戦略のいくつかは次のとおりです。

  • 直接拒否モード– 1秒あたりのリクエスト数が設定されたしきい値を超えると、それ以降のリクエストは自動的に拒否されます
  • スロースタートウォームアップモード–トラフィックが突然急増した場合、このモードでは、上限に達するまでリクエスト数が徐々に増加し続けます。

2.2. 回路遮断とダウングレード

あるサービスが同期して別のサービスを呼び出す場合、何らかの理由で別のサービスがダウンする可能性があります。 このような場合、スレッドは他のサービスが応答するのを待ち続けるため、ブロックされます。 これはリソースの枯渇につながる可能性があり、呼び出し元サービスもそれ以上の要求を処理できなくなります。 これはカスケード効果と呼ばれ、マイクロサービスアーキテクチャ全体を停止させる可能性があります

このようなシナリオを防ぐために、回路ブレーカーが登場します。 他のサービスへの後続のすべての呼び出しをすぐにブロックします。 タイムアウト期間の後、一部の要求は通過します。 それらが成功すると、回路ブレーカーは通常の流れを再開します。 それ以外の場合は、タイムアウト期間が再開されます。

Sentinelは、最大同時実行制限の原則を使用して、回路遮断を実装します。 同時スレッドの数を制限することにより、不安定なリソースの影響を軽減します。

Sentinelは、不安定なリソースもダウングレードします。 リソースの応答時間が長すぎる場合、指定された時間枠内にリソースへのすべての呼び出しが拒否されます。 これにより、呼び出しが非常に遅くなり、カスケード効果が発生する状況を防ぐことができます。

2.3. 適応システム保護

Sentinelは、システム負荷が高くなりすぎた場合にサーバーを保護します。 トラフィック制御を開始するためのメトリックとしてload1(システム負荷)を使用します。 リクエストは、次の条件下でブロックされます。

  • 現在のシステム負荷( load1 )>しきい値( highestSystemLoad );
  • 現在の同時リクエスト(スレッド数)>推定容量(最小応答時間*最大QPS)

3. 使い方

3.1. Mavenの依存関係を追加する

Mavenプロジェクトでは、pom.xmlsentinel-core依存関係を追加する必要があります。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.0</version>
</dependency>

3.2。 リソースを定義する

Sentinel APIを使用して、try-catchブロック内の対応するビジネスロジックでリソースを定義しましょう。

try (Entry entry = SphU.entry("HelloWorld")) {
    // Our business logic here.
    System.out.println("hello world");
} catch (BlockException e) {
    // Handle rejected request.
}

リソース名が「HelloWorld」のこのtry-catchブロックは、Sentinelによって保護されたビジネスロジックへのエントリポイントとして機能します。

3.3。 フロー制御ルールの定義

これらのルールは、しきい値カウントや制御動作など、リソースへのフローを制御します。たとえば、直接拒否したり、起動を遅くしたりします。 FlowRuleManager.loadRules()を使用して、フロールールを構成しましょう。

List<FlowRule> flowRules = new ArrayList<>();
FlowRule flowRule = new FlowRule();
flowRule.setResource(RESOURCE_NAME);
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
flowRule.setCount(1);
flowRules.add(flowRule);
FlowRuleManager.loadRules(flowRules);

このルールは、リソース「RESOURCE_NAME」が1秒あたり最大1つのリクエストに応答できることを定義しています。

3.4. 劣化ルールの定義

劣化ルールを使用して、回路ブレーカーのしきい値要求数、回復タイムアウト、およびその他の設定を構成できます。 DegradeRuleManager.loadRules()を使用して劣化ルールを構成しましょう。

List<DegradeRule> rules = new ArrayList<DegradeRule>();
DegradeRule rule = new DegradeRule();
rule.setResource(RESOURCE_NAME);
rule.setCount(10);
rule.setTimeWindow(10);
rules.add(rule);
DegradeRuleManager.loadRules(rules);

このルールは、リソース RESOURCE_NAME が10個のリクエスト(しきい値カウント)を処理できない場合、回線が切断されることを指定します。 リソースへの後続のすべてのリクエストは、Sentinelによって10秒間ブロックされます(時間枠)。

3.5. システム保護ルールの定義

システム保護ルールを使用して、適応システム保護( load1 のしきい値、平均応答時間、同時スレッド数)を構成および保証できます。 SystemRuleManager.loadRules()メソッドを使用してシステムルールを構成しましょう。

List<SystemRule> rules = new ArrayList<>();
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(10);
rules.add(rule);
SystemRuleManager.loadRules(rules);

このルールは、私たちのシステムでは、最大のシステム負荷が1秒あたり10リクエストであることを指定しています。 現在の負荷がこのしきい値を超えると、それ以降のすべての要求はブロックされます。

4. 注釈のサポート

Sentinelは、リソースを定義するためのアスペクト指向の注釈サポートも提供します

まず、sentinel-annotation-aspectjのMaven依存関係を追加します。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>1.8.0</version>
</dependency>

次に、 @Configuration を構成クラスに追加して、センチネルアスペクトをSpringBeanとして登録します。

@Configuration
public class SentinelAspectConfiguration {

    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

@SentinelResourceはリソース定義を示します。 リソース名を定義するvalueのような属性があります。 属性fallbackは、フォールバックメソッド名です。 回路が壊れたとき、このフォールバックメソッドはプログラムの代替フローを定義します。 @SentinelResourceアノテーションを使用してリソースを定義しましょう。

@SentinelResource(value = "resource_name", fallback = "doFallback")
public String doSomething(long i) {
    return "Hello " + i;
}

public String doFallback(long i, Throwable t) {
    // Return fallback value.
    return "fallback";
}

これは、 resource_name という名前のリソースと、フォールバックメソッドを定義します。

5. 監視ダッシュボード

Sentinelは監視ダッシュボードも提供します。これにより、クライアントを監視し、ルールを動的に構成できます。 定義したリソースへの着信トラフィックの量をリアルタイムで確認できます。

5.1. ダッシュボードの開始

まず、Sentinelダッシュボードjarをダウンロードする必要があります。 次に、次のコマンドを使用してダッシュボードを開始できます。

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

ダッシュボードアプリケーションが起動したら、次のセクションの手順に従ってアプリケーションを接続できます。

5.2. アプリケーションの準備

sentinel-transport-simple-http依存関係をpom.xmlに追加しましょう。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.8.0</version>
</dependency>

5.3. アプリケーションをダッシュボードに接続する

アプリケーションを起動するときに、ダッシュボードのIPアドレスを追加する必要があります。

-Dcsp.sentinel.dashboard.server=consoleIp:port

これで、リソースが呼び出されるたびに、ダッシュボードはアプリケーションからハートビートを受信します。

ダッシュボードを使用して、フロー、劣化、およびシステムルールを動的に操作することもできます。

6. 結論

この記事では、Alibaba Sentinelのフロー制御、回路ブレーカー、および適応システム保護の主な機能について説明しました。

対応する例は、GitHubにあります。