4. SpringCloud: Sentinel サービス フロー制御とサービス低下

目次

1. ガイド

2. Sentinelの基本概念

リソース

ルール

3、センチネルコンソール

4、Sentinelクライアント(アプリケーション)

5. フロー制御ルールを定義する

6. リソースを定義する

7. ホットスポットのルール

8. APIアクセス

9. ルールの永続化 (ルール センター)

10. 本番環境で Sentinel を使用する


1. ガイド

        Sentinel は、Hystrix と同様、Spring Cloud Circuit Breaker の具体的な実装です (実際、Sentinel は Spring Cloud に依存していないため、この記述は厳密ではありません)。

Sentinel は、サービス フロー制御やサーキット ブレーカーのダウングレードなどの機能をサポートします。

Sentinel の使用は 2 つの部分に分けることができます。

  • コア ライブラリ (Java アプリケーション クライアント): フレームワーク/ライブラリに依存せず、Java 8 以降のランタイム環境で実行でき、Dubbo / Spring Cloud などのフレームワークも適切にサポートしています (メインストリーム フレームワークの適応を参照 )本当のルールの執行者です。
  • コンソール (ダッシュボード): ダッシュボードは主にプッシュ ルールの管理、監視、およびマシン情報の管理を担当します。これは単なるコンソール (コンソールはオプション) であり、ルールやフロー制御自体を保存する責任はありません。

2. Sentinelの基本概念

リソース

リソースは Sentinel の重要な概念です。これは、アプリケーションによって提供されるサービス、アプリケーションによって呼び出される別のアプリケーションによって提供されるサービス、さらにはコードの一部など、Java アプリケーション内のあらゆるものである可能性があります。次のドキュメントでは、リソースを使用してコード ブロックを説明します。

Sentinel API で定義されたコードがリソースである限り、Sentinel で保護できます。ほとんどの場合、メソッド シグネチャ、URL、さらにはサービス名をリソース名として使用して、リソースを識別できます。

ルール

リソースのリアルタイム ステータスに関して設定されたルールには、フロー制御ルール、ヒューズ ダウングレード ルール、およびシステム保護ルールが含まれる場合があります。すべてのルールはリアルタイムで動的に調整できます。

3. Sentinel コンソールのダッシュボード

Sentinel は、マシンの検出と健全性管理、モニタリング (単一マシンとクラスター)、ルール管理、およびプッシュ機能を提供する軽量のオープン ソース コンソールを提供します。(トラフィック制御とサービス低下ルールの具体的な実行は、コンソールではなくアプリケーション内の Sentinel で行われます)

Sentinel コンソールには次の機能が含まれています。

  • マシンのリストと健全性ステータスを確認します。Sentinel クライアントから送信されたハートビート パケットを収集して、マシンがオンラインかどうかを判断します。
  • 監視 (スタンドアロンおよびクラスター集約) : Sentinel クライアントによって公開される監視 API を通じて、アプリケーション監視情報が定期的に取得および集約され、最終的に第 2 レベルでのリアルタイム監視を実現できます。
  • ルール管理とプッシュ: 統合管理プッシュ ルール (ただし、ルールは保存されず、ルールは実行されません)。
  • 認証: 実稼働環境では認証は非常に重要です。ここで、各開発者は実際の状況に応じてカスタマイズする必要があります。

   1. ダウンロード: https://github.com/alibaba/Sentinel/releases

   2. 以下を実行します。

java -Dserver.port=8383 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.2.jar

-Dserver.port=8383 Sentinel コンソールのリスニング ポートを次のように指定するために使用されます 。 8383 

 3、启动后浏览器访问:http://IP:端口   (用户名密码默认都是sentinel)

 アプリケーションはまだここには表示されていません。現時点では Sentinel に状況を報告するアプリケーションがないためです。

4、Sentinelクライアント(アプリケーション)

Sentinel 自体は独立したコンポーネントであり、Spring Cloud にバインドされていない場合があります。ただし、Spring Cloud がよく使用されるため、ここでも Spring を例として使用します。

以前のプロジェクトに基づいています (このプロジェクトに基づいています  https://blog.csdn.net/zyplanke/article/details/120860958  )。

1. センチネルへの依存度を高める

  ------ 省略 ------
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>${springcloudalibaba.version}</version>
        </dependency>
  ------ 省略 ------

2. アプリケーションとコンソール間の相互接続パラメータを増やします。

[方法 1]: Java の起動時に 2 つの JVM パラメータを追加します

-Dcsp.sentinel.dashboard.server=IP:8383 
-Dcsp.sentinel.api.port=8719 

最初の JVM パラメータは Sentinel コンソール アドレスです。アプリケーション (クライアント) はハートビート パケットをコンソール アドレスに自動的に送信します。

2 番目の JVM パラメータは次のとおりです。アプリケーション (クライアント) がローカルで開始する HTTP ポート (デフォルトの開始ポートは 8719 です。ポートがすでに占有されている場合、空きポートが見つかるまで自動的に増分されます)。Sentinel コンソールはこのポートにアクセスします (たとえば、コンソールがルールを追加すると、このポートを介してルールがアプリケーションにプッシュされます)。

[方法 2]: Spring の application.properties 構成ファイル (または構成センター) でパラメーターを渡します。

spring.cloud.sentinel.transport.dashboardおよびspring.cloud.sentinel.transport.port構成仕様 (方法 1 と方法 2、2 つの構成効果は同等です)

注: アプリケーションと Sentinel コンソール間のネットワークに障害物がないことを確認してください。

3. コンソールから状況を確認する

アプリケーション (クライアント) にトラフィックがあることを確認する必要があります。Sentinel の初期化を完了するには、アプリケーションに少なくとも 1 つのアクセスが必要です (Sentinel コンソールで確認できるようにするため)。

5. フロー制御ルールを定義する

Sentinel コンソールで、次のように支払いサービスのトラフィック ルールを追加します。

注: QPS しきい値が 0 の場合、すべての障害を処理することと同じになります。

コンソールでルールを定義すると、ルールはアプリケーション (ここでは支払いアプリケーション) に自動的に転送されます。

ルールの保存と実行はすべてアプリケーション側で完了します。コンソールはアプリケーションからレポートを受信するだけであり、ルール自体は保存しません (メモリ内にスクラッチされるだけです)。

このとき、支払いが呼び出されると、センチネルはこのフロー制御ルールを実行します。このルールを超えるものは、ルール定義に従って失敗を返します。

拒否されたアクセスは、呼び出し元のログ「Sentinel によってブロックされました (フロー制限)」で確認できます。

パラメータの設定や各ルールの意味については、公式サイトhttps://sentinelguard.io/zh-cn/docs/introduction.htmlを参照してください。

6. リソースを定義する

 Sentinel はデフォルトで公開された HTTP サービスをリソースとして使用するため、場合によってはリソースを自分で定義する必要があります。(関数をリソースとして定義するなど)。リソースを定義する方法は次のとおりです。

1. Spring で、  SentinelResourceAspect Java Config を通じて Spring Bean として登録します。メイン SpringBoot に関数を追加します (支払いを例にします)

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentApplication {

    public static void main(String[] args) {
        SpringApplication.run(PaymentApplication.class, args);
    }
    
    @Bean  // 将SentinelResourceAspect 注册为Bean,以支持@SentinelResource注解
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

2. @SentinelResource アノテーションを使用して、必要に応じて関数をリソースとして定義します。例えば:

@RestController
public class PaymentController {
    @Value("${server.port}")
    private int myport;

    @GetMapping("/dopay/{orderid}")
    @SentinelResource(value = "resourcePayPPP", entryType = EntryType.IN, fallback = "fallbackHandler")
    public ResponseEntity<String> paylogic(@PathVariable("orderid") Long orderid) {
        return ResponseEntity.ok("支付服务successful! orderid=" + orderid + ", 支付成功。 支付服务的端口为port=" + myport );
    }

    /**
     * 服务降级的处理函数,需要与原函数的返回类型、入参保持一致(入参最后需要增加一个BlockException)
     */
    public ResponseEntity<String> fallbackHandler (Long orderid, BlockException e) {
        System.err.println("fallbackHandler 限流,当前系统忙");
        return ResponseEntity.ok("限流,当前系统忙");
    }
}

その中で: @SentinelResource(value = "resourcePayPPP"、entryType = EntryType.IN、fallback = "fallbackHandler") はそれぞれ、リソース名、IN または OUT、ダウングレードされた関数名を指定します。

3. 起動後 (トラフィックが存在する必要があります)、コンソールの「クラスター リンク」メニュー インターフェイスでアプリケーションのリソース ステータスを確認できます (次のように)。次に、リソース名のルールを設定できます (詳細については、コンソールでの操作を参照してください)。

7. ホットスポットのルール

ホットスポットとは何ですか? ホットスポットは頻繁にアクセスされるデータです。特定のホットスポット データの中でアクセス頻度が最も高い上位 N データをカウントし、アクセスを制限したい場合がよくあります。例えば:

  • 商品IDはパラメータであり、一定期間内に最も頻繁に購入された商品IDをカウントして制限します。
  • ユーザーIDはパラメータであり、一定期間内に頻繁にアクセスするユーザーIDに制限されます。

ホットスポット パラメータの現在の制限は、受信パラメータ内のホットスポット パラメータをカウントし、設定されたスロットルしきい値とモードに従ってホットスポット パラメータを含むリソース呼び出しを制限します。ホットスポット パラメータの電流制限は、ホットスポット パラメータを含むリソース呼び出しに対してのみ有効となる特別なフロー制御とみなすことができます。

 1. ホットスポット ルールを追加する

上の図では:

  • 電流制限モード: QPSのみ
  • パラメーター インデックスは、リソース関数の入力パラメーターから左から右にツリー化され、最初のパラメーターは 0、2 番目のパラメーターは 1 です。
  • スタンドアロンしきい値: 電流制限 QPS しきい値
  • 統計ウィンドウの長さ: しきい値統計の時間ウィンドウ。

2. ルールの追加後、入力パラメータ値が通話ごとに異なる場合、ホットスポット ルールはトリガーされません。一定期間内で毎回渡される多数の入力パラメータが同じ場合(たとえば、同じタイムクラス、同じ入力パラメータ値での呼び出しとアクセス)、ホットスポットが形成され、ホットスポット電流制限がトリガーされます。 。

 HTTP リクエストは Jmeter などのツールでシミュレートできます

 

8. APIアクセス

アプリケーション (クライアント) の既存のルールは 次の API を通じて取得でき、ルール データは JSON 配列の形式で返されます (以下はクライアントの IP とポートであり、Sentinel コンソールの IP ではありません)。 。

# 获取应用程序的 流控规则
curl http://应用程序ip:sentinel端口/getRules?type=flow

# 获取应用程序的 服务熔断降级规则
curl http://应用程序ip:sentinel端口/getRules?type=degrade 

# 获取应用程序的 系统保护规则
curl http://应用程序ip:sentinel端口/getRules?type=system

# 获取应用程序的 某个资源的统计信息
curl http://应用程序ip:sentinel端口/cnode?id=resourceName

9. ルールの永続化 (ルール センター)

Sentinel はデフォルトでルールをアプリケーションのメモリに保存するため、アプリケーションを再起動するとルール データは失われます。したがって、フロー制御および劣化ルールを外部データ ソース (ファイル、データベース、Nacos など) に保持し、アプリケーションの起動時にルールが外部データ ソースから読み取られるようにする必要があります。

  ここでは Nacos を例として取り上げます ( https://blog.csdn.net/zyplanke/article/details/120860958はこのプロジェクトに基づいて実証されています)。

1. Nacos 構成センターを Sentinel の外部データ ソースとして使用する場合、アプリケーションに依存関係を追加する必要があります。

  ------ 省略 ------
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>${springcloudalibaba.version}</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.8.0</version>
        </dependency>
  ------ 省略 ------

2. アプリケーションはすでに Nacos を構成センターとして使用しているため、Nacos 上のアプリケーション構成データ ID=paymentService.properties の内容に Sentinel 外部データ ソース構成を追加します。内容は次のとおりです。

# 指定Sentinel控制台的IP和端口
#spring.cloud.sentinel.transport.dashboard=ip:port

#配置Sentinel规则中心来源(持久化存放在Nacos配置中心)
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=39.100.80.168:8848
spring.cloud.sentinel.datasource.ds1.nacos.data-id=sentinel_rules_flow.json
spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.data-type=json

3. Nacos 構成センターにデータ ID 構成 (前のステップの構成に対応) を追加します。JSON ルールは次のとおりです。

 JSON コンテンツには角括弧が付いていることに注意してください ( curl 経由で API にアクセスして取得した JSON コンテンツを参照として参照できます )

[
    {
        "resource": "/dopay/{orderid}", 
        "limitApp": "default", 
        "grade": 1, 
        "count": 1, 
        "controlBehavior": 0, 
        "strategy": 0, 
        "clusterMode": false
    }
]

 4. アプリケーションを再起動します (起動後、少なくとも 1 つのフローが必要です)。

 5. テスト検証。これは、フロー制御ルールが有効になっていることを確認するためのテストであり、このフロー制御ルールは Sentinel コンソールでも確認できます。

プロセス: クライアント アプリケーションは、Nacos 構成センターからルールを取得し、アプリケーションに適用します。その後、クライアント アプリケーションが Sentinel コンソールにアクティブにレポートするため、Sentinel コンソール インターフェイスでもルールを確認できるようになります。

10. 本番環境で Sentinel を使用する

詳細については、以下を参照してください。

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD %E4%BD%BF%E7%94%A8-センチネル

おすすめ

転載: blog.csdn.net/zyplanke/article/details/120980633