Spring Cloud Alibaba Sentinel:Boot 3での導入、ルール永続化と保護範囲
基準:Spring Boot 3、Spring Cloud 202x.x、対応するSpring Cloud AlibabaのBOM、Sentinel 1.8.x、Nacos 2.x。バージョンの組み合わせは、必ず公式の互換性マトリックスに従ってください。
1. Sentinelが解決する問題
Sentinelは、リソース単位の流量制御、サーキットブレーカーと縮退処理、システム保護、ホットスポットパラメータのレート制限を行います。解決できるのはサービスの過負荷と障害の伝播であり、データ整合性、メッセージの信頼性、業務リトライは対象外です。
典型的な呼び出しチェーンは次のとおりです。
HTTP / RPC / 方法调用
-> Sentinel 资源入口
-> Slot 链
-> 规则检查
-> 放行或 BlockException
2. Spring Boot 3での導入
依存関係はSpring Cloud AlibabaのBOMで管理し、各starterのバージョンを手作業で組み合わせないでください。Boot 3はJakarta名前空間を使うため、古いBoot 2向け依存関係と混在させることはできません。
spring:
application:
name: order-service
cloud:
sentinel:
enabled: true
eager: false
transport:
dashboard: <SENTINEL_DASHBOARD_HOST>:8719
port: 8719
プロパティ名は、現在使っているstarterの設定メタデータを参照してください。Dashboardのポートとクライアントのハートビート用ポートは、どちらも内部ネットワークまたは保護されたネットワーク内に配置してください。
3. 業務リソースの保護
@SentinelResource(
value = "order.create",
blockHandler = "blocked",
fallback = "fallback")
public Order create(CreateOrderCommand command) {
return service.create(command);
}
public Order blocked(CreateOrderCommand command, BlockException ex) {
throw new TooManyRequestsException();
}
public Order fallback(CreateOrderCommand command, Throwable ex) {
throw new ServiceUnavailableException(ex);
}
blockHandlerはSentinelのレート制限や縮退で発生した例外を処理し、fallbackは業務実行中の例外を処理します。すべての例外を「レート制限」に変換すると、実際の障害を隠してしまうので、そうしないでください。
4. ルールの永続化
Dashboardのメモリ内だけにルールを作成すると、クライアントが再起動した際に失われる可能性があります。本番環境ではNacosなどの外部データソースを使って、流量制御ルール、縮退ルール、ホットスポットルール、システムルールを永続化してください。namespace、group、dataId、認証設定、ロールバック方針も明示的に設定してください。
ルール変更には監査、段階展開、バージョン管理が必要です。Dashboard単体で本番設定のガバナンスを完結させることはできません。
5. WebとFeignのアダプタ対応
Spring MVC、WebFlux、RestTemplate、Feignのリソース名付けとインタセプターは、それぞれのアダプタモジュールが担当します。アダプタを有効にした後は、次の点を確認してください。
- URLが正規化され、IDごとに別リソースが生成されていないか
- HTTPメソッドがリソース名に含まれているか
- BlockExceptionが正しいステータスコードを返すか
- FeignのリトライとSentinelfallbackで、副作用のある処理が重複して実行されないか
6. 本番運用で守るべきこと
すべての依存関係とイメージのバージョンを固定してください。DashboardとActuatorを保護し、ルール変更の権限を制限してください。ブロック数、拒否数、例外率、RT、スレッドプール、下流側のコネクションプールを監視してください。Sentinelは、タイムアウト、コネクションプールの上限、冪等性、業務レベルの縮退処理を代替することはできません。
ソースを読むときは、実装で使っている依存関係のバージョンを基準にしてください。自動設定のエントリーポイントは、spring.factoriesからAutoConfiguration.importsへ移行している可能性があります。クラス名や初期化順序は、バージョンをまたいでそのまま流用しないでください。