マイクロサービスセンチネルの詳細な説明

I.はじめに

分散システムの分野では、フロー制御とシステム融合は、システムの安定性と可用性を確保するための重要な手段です。Spring Cloud は、マイクロサービス アーキテクチャの代表的なフレームワークとして、さまざまなフロー制御コンポーネントやヒューズ コンポーネントを提供します。その中でもSentinelは、フロー制御やシステム融合に特化したアリババ社製コンポーネントで、軽量、高性能、使いやすいという利点を持っています。

この記事では、Sentinel の基本概念、コア機能、使用方法、Spring Cloud の他のコンポーネントとの統合など、Sentinel のあらゆる側面を詳しく紹介します。この記事を読むことで、Sentinel を使用してフロー制御とシステム融合を実装する方法を学び、実際のアプリケーションで Sentinel を構成および使用する方法を習得できます。

2. 知識ポイントの主な構成

1. センチネルの基本的な考え方

1.1. リソース

リソースは Sentinel の重要な概念です。これは、アプリケーションによって提供されるサービス、アプリケーションによって呼び出される別のアプリケーションによって提供されるサービス、さらにはコードの一部など、Java アプリケーション内のあらゆるものにすることができます。

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

1.2. ルール

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

2. センチネルの基本機能

2.1、フロー制御

フロー制御はネットワーク伝送で一般的に使用される概念であり、ネットワーク パケットの送信データを調整するために使用されます。ただし、システムの安定性の観点からは、リクエストの処理速度も重視されます。いつでも届くリクエストはランダムで制御できないことが多く、システムの処理能力には限界があります。システムの処理能力に応じてトラフィックを制御する必要があります。以下の図に示すように、Sentinel は調整者として、ランダムなリクエストを必要に応じて適切な形に調整できます。
ここに画像の説明を挿入
フロー制御には次の角度があります。

  • リソースの呼び出し関係(リソースの呼び出しリンク、リソースとリソース間の関係など)。
  • QPS、スレッドプール、システム負荷などの動作指標。
  • 直流制限、コールドスタート、キューイングなどの制御の影響。

2.2. ヒューズのダウングレード

サーキットブレーカーのダウングレードとは何ですか

フロー制御に加えて、呼び出し側リンクの不安定なリソースを減らすことも Sentinel の使命の 1 つです。通話関係の複雑さにより、通話リンク内の特定のリソースが不安定になると、最終的にリクエストが蓄積されます。
ここに画像の説明を挿入

3. コンソールのインストール

3.1. 公式 Web サイトから jar パッケージをダウンロードする

ブロガーは、sentinel1.8.4 のバージョンが使用されていること、およびダウンロード アドレスがSentinel-1.8.4 であることを示すためにここにいます。

3.2. コンソールの起動

ダウンロード後、jar パッケージを直接起動すると、Sentinel コンソール ページが表示されます
ここに画像の説明を挿入
。localhost:8080 にアクセスしてコンソール ページを開きます。デフォルトのアカウントは Sentinel、パスワードも Sentinel です。

ここに画像の説明を挿入
入力後は、Sentinel と統合するプロジェクトがないため、ホームページ ページのみが表示されます。統合後、プロジェクトの特定のインターフェイスが呼び出されたときに、Sentinel コンソールでフロー制御などのルールを設定できます;
ここに画像の説明を挿入
ここに画像の説明を挿入

4. プロジェクト統合の監視員

4.1、依存構成

関連する依存関係を紹介します: SpringBoot、SpringCloudAlibaba、SpringCloudAlibaba-Sentinel
私のプロジェクト構造を見てみましょう:
ここに画像の説明を挿入
ここでは、親 pom 内の SpringBoot と Spring Cloud Alibaba の関連する依存関係を紹介します。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.12.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<!--版本管理-->
<properties>
    <java.version>11</java.version>
    <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    <spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version>
</properties>

<!--依赖管理-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

子pomにsentinelとspringbootのWebモジュールの依存関係を導入します。

<!--sentinel相关依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--springbootweb模块相关-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

4.2. 設定ファイルでセンチネルコンソールのアドレス情報を設定する

server:
  port: 9000
  servlet:
    context-path:

spring:
  application:
    name: user-demo
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 # 控制台地址
        port: 9000 # 启动该服务,会在应用程序的相应服务器上启动HTTP Server,并且该服务器将与Sentinel dashboard进行交互
        #这个端口是自己项目服务器所要开放的端口,不然会出现sentinel控制台上显示有服务注册进来,
        #这里是配置的一个开始端口号,每一个服务都需要使用一个端口号来和sentinel控制台进行交互,
        #如果当前配置的端口号被占用以后会在该端口号基础上自动加1进行连接,如果还是被占用则继续加1进行连接,直到连接成功位置。

4.3、フロー制御を構成する

ここに画像の説明を挿入
クラスター ポイントのリンクでは、先ほど呼び出したインターフェイスが表示されます。ここで、このインターフェイスを構成できます: フロー制御、ヒューズ、ホットスポット、承認

4.3.1、フロー制御

ここでは、効果を示すためにフロー制御ルールを設定するだけです。リソース名は呼び出されるインターフェイス パス、しきい値タイプは QPS、しきい値は 1 です。ここで、実際のプロジェクトの QPS サイズに応じて特定のしきい値を決定するか、同時スレッドの数に応じて選択する必要があります。
ここに画像の説明を挿入
フロー制御ルールを構成した後、インターフェイスを再度呼び出して、フロー制御ルールが適用されていることを確認できます。発効しました:
ここに画像の説明を挿入

4.3.2 融着

Fuse ここでは、次のような融合戦略を紹介します. デモ表示なので、デモはクラスター形式でデプロイされていません. インターフェースは単純なクエリだけであり、呼び出しが遅くなるのは簡単ではありません.

コール率が遅い

低速通話率 (SLOW_REQUEST_RATIO): 低速通話率をしきい値として選択するには、許可される低速通話 RT (つまり、最大応答時間) を設定する必要があります。リクエストの応答時間がこの値より大きい場合、低速通話としてカウントされます。単位統計期間 (statIntervalMs) 内のリクエストの数が設定された最小リクエスト数より大きく、低速呼び出しの割合がしきい値より大きい場合、リクエストは次の割り込み期間で自動的に中断されます。切断時間が経過すると、ヒューズは検出回復状態 (HALF-OPEN 状態) に入り、次のリクエストの応答時間が設定スローコール RT 未満の場合はヒューズが終了し、設定スローコール RT より大きい場合はヒューズが終了します。 RT呼ぶとまた吹かれます。
ここに画像の説明を挿入

異常な比率

異常な比率 (DEGRADE_GRADE_EXCEPTION_RATIO): 1 秒あたりのリソース リクエスト >= N (構成可能)、およびスループットに対する 1 秒あたりの例外の合計数の比率がしきい値 (DegradeRule のカウント) を超えると、リソースは劣化状態に入ります。つまり、次の時間枠内 (DegradeRule の timeWindow、秒) で、このメソッドへの呼び出しが自動的に返されます。外れ値比率のしきい値範囲は [0.0, 1.0] で、0% ~ 100% を表します。
ここに画像の説明を挿入

異常な数値

例外数 (DEGRADE_GRADE_EXCEPTION_COUNT): 過去 1 分間のリソース内の例外の数がしきい値を超えると、サーキット ブレーカーが実行されます。統計時間ウィンドウは分レベルであるため、timeWindow が 60 秒未満の場合、ヒューズ状態の終了後もヒューズ状態に入る可能性があることに注意してください。
ここに画像の説明を挿入

4.3.3. 認可

認可は比較的理解しやすいもので、ここでは発信者のIPを指しますが、IPが複数ある場合は英語のカンマで区切ることができます。
ここに画像の説明を挿入

4.3.4. ホットスポット

ホットスポット構成、つまり、電流を制限するリクエスト内のホットスポット パラメーターです。設定された電流制限パラメーターがしきい値に達すると、電流制限が実行されます。まず、パラメーターを使用して API を準備します。SentinelResource が追加されたことがわかり
ます
ここに画像の説明を挿入
。 getAllUser インターフェイスにアノテーションを追加します。このインターフェイスを再度呼び出すと、リソースがセンチネル コンソールに追加されることがわかります。
ここに画像の説明を挿入
次のステップは、hot という名前のこのリソースのホットスポット ルールを構成することです。パラメーター インデックスは getAllUser インターフェイスの入力パラメーターのインデックスで、0 は最初のパラメーターを指し、1 は 2 番目のパラメーターを指します。
ここに画像の説明を挿入
このインターフェイスを複数回呼び出すと、このパラメータで設定されたしきい値を超えるとエラーが報告されます。
ここに画像の説明を挿入

5. Sentinel+nacos 永続フロー制御ルール

Sentinel は、分散サービス アーキテクチャ向けの高可用性トラフィック保護コンポーネントであり、主にトラフィックをエントリ ポイントとして使用して、開発者が電流制限、トラフィック シェーピング、サーキット ブレーカーの劣化、システム負荷保護などのさまざまな側面からマイクロサービスの安定性を確保できるようにします。ホットスポット保護、セックス。ただし、Sentinel はトラフィック制御ルールを永続化することができません。プロジェクトが再開されると、関連するトラフィック制御ルールを再構成する必要があります。次に、Sentinel と nacos を組み合わせてトラフィック制御ルールを永続化する方法を説明します。

5.1. 設定ファイルの変更

Sentinel の下に Sentinel のデータソース関連の設定を追加します。

spring:
  application:
    name: user-demo
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 # 控制台地址
        port: 9000 # 启动该服务,会在应用程序的相应服务器上启动HTTP Server,并且该服务器将与Sentinel dashboard进行交互
        #这个端口是自己项目服务器所要开放的端口,不然会出现sentinel控制台上显示有服务注册进来,
        #这里是配置的一个开始端口号,每一个服务都需要使用一个端口号来和sentinel控制台进行交互,
        #如果当前配置的端口号被占用以后会在该端口号基础上自动加1进行连接,如果还是被占用则继续加1进行连接,直到连接成功位置。
      datasource:
        # 流控规则
        flow:
          nacos:
            server-addr: localhost:8848
            namespace: sentinel-test
            group-id: DEFAULT_GROUP
            data-id: ${
    
    spring.application.name}-sentinel-flow-rules
            # 规则类型:flow、degrade、param-flow、system、authority
            data-type: json
            rule-type: flow
        # 熔断降级
        degrade:
          nacos:
            server-addr: localhost:8848
            namespace: sentinel-test
            group-id: DEFAULT_GROUP
            data-id: ${
    
    spring.application.name}-sentinel-degrade-rules
            rule-type: degrade
        # 热点规则
        param-flow:
          nacos:
            server-addr: localhost:8848
            namespace: sentinel-test
            group-id: DEFAULT_GROUP
            data-id: ${
    
    spring.application.name}-sentinel-param-flow-rules
            rule-type: param-flow
        # 系统规则
        system:
          nacos:
            server-addr: localhost:8848
            namespace: sentinel-test
            group-id: DEFAULT_GROUP
            data-id: ${
    
    spring.application.name}-sentinel-system-rules
            rule-type: system
        # 授权规则
        authority:
          nacos:
            server-addr: localhost:8848
            namespace: sentinel-test
            group-id: DEFAULT_GROUP
            data-id: ${
    
    spring.application.name}-sentinel-authority-rules
            rule-type: authority

5.2. センチネル設定の変更

ダウンロードした Sentinel のソース コードの場合は、プロジェクトを直接開いて構成情報を変更できます。

server.port=8080
nacos.server-addr=localhost:8848
nacos.namespace=sentinel-test
nacos.group=DEFAULT_GROUP

直接ダウンロードされた jar パッケージの場合は、jar の起動時にコマンドでこれらの構成情報を指定できます。
nohup java -Dnacos.server-addr=localhost:8848 -Dnacos.namespace=sentinel-test -Dnacos.group=DEFAULT_GROUP -jar sentinel-dashboard-1.8.4.jar

3. まとめと改善

以上が Sentinel 関連のフロー制御ルールと設定永続化の全プロセスです. フロー制御パラメータの設定方法については, プロジェクトの実際の状況に応じて設定する必要があります. Sentinel は強力な機能を備えた強力な分散サービス フロー制御コンポーネントです幅広いアプリケーションシナリオに対応します。Sentinelを利用することでシステムの安定性やセキュリティの向上、運用コストの削減が可能になります。

このブログがお役に立ちましたら、メッセージ + いいね + ブックマークを忘れずに残してください。

おすすめ

転載: blog.csdn.net/wmj20001225/article/details/132610360