Sentinelリソース管理のためのアノテーション

アノテーションによるリソース管理

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方式を検討する。

タグ: Sentinel AspectJ Spring AOP

5月23日 06:45 投稿