アノテーションによるリソース管理
Sentinelは、@SentinelResourceアノテーションを使用してリソースを定義し、AspectJ拡張機能を利用して自動的にリソースを設定したりBlockExceptionを処理することができます。この機能を利用するには以下の依存関係が必要です:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>x.y.z</version>
</dependency>
1. @SentinelResource アノテーション
注意: アノテーション方式ではprivateメソッドはサポートされません。
@SentinelResourceはリソースを定義し、オプションで例外処理やフォールバック設定を提供します。このアノテーションには以下のような属性があります:
- 名前: リソース名(必須)
- エントリタイプ: EntryType.OUTがデフォルト
- blockHandler/blockHandlerClass: BlockException処理用関数名とクラス。関数はpublicかつ元のメソッドと同じ戻り値・引数を持ち、最後にBlockException型のパラメータが必要。
- fallback/fallbackClass: 元のメソッドの例外処理用関数名とクラス。戻り値と引数リストは元のメソッドと一致し、Throwable型の追加パラメータも可能。
- defaultFallback: よく使うフォールバックロジック用関数名。引数なしまたはThrowableを受け取る。
- exceptionsToIgnore: 特定の例外を無視する設定。
例:
public class SampleService {
// 元のメソッド
@SentinelResource(value = "greeting", blockHandler = "errorHandler", fallback = "greetFallback")
public String greet(long time) {
return String.format("Greetings at %d", time);
}
// Fallback関数
public String greetFallback(long time, Throwable ex) {
return String.format("Greeting fallback for %d", time);
}
// BlockException処理関数
public static String errorHandler(long time, BlockException e) {
e.printStackTrace();
return "Error at " + time;
}
// 別クラスでのblockHandler使用例
@SentinelResource(value = "check", blockHandler = "handleCheck", blockHandlerClass = {Util.class})
public void check() {
System.out.println("Checking...");
}
}
1.4.0以降では業務例外の自動記録に対応しています。
二、設定方法
1. Spring Cloud Alibaba
Spring Cloud Alibaba経由でSentinelを利用している場合、特に設定は不要です。
2. Spring AOP
Spring AOPを使用している場合、SentinelResourceAspectをBeanとして登録する必要があります。
@Configuration
public class ConfigAspect {
@Bean
public SentinelResourceAspect aspectConfig() {
return new SentinelResourceAspect();
}
}
3. AspectJ
AspectJを使用する場合は、aop.xmlに以下を追加します。
<aspects>
<aspect name="com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect"/>
</aspects>
4. アノテーション使用時の注意点
アノテーションが有効でない場合、以下を確認してください:
- Spring AOPおよび関連ライブラリが正しく導入されているか
- アノテーション付きクラスがSpring Beanとして登録されているか
- privateメソッドやstaticメソッド、内部呼び出しはサポートされていないか
- 不適切なAOP環境(例えばjavax WebSocket)ではSphU方式を検討する。