目次
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 を使用する
詳細については、以下を参照してください。