Sentinel支持通过@SentinelResource注解定义资源并配置blockHandler和fallback函数来进行限流之后的处理。
Sentinel提供了@SentinelResource注解用于定义资源,并提供了AspectJ的扩展用于自动定义资源、处理BlockException等。使用Sentinel Annotation AspectJ Extension的时候需要引入以下依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.8.0</version>
</dependency>
若您是通过Spring Cloud Alibaba接入的Sentinel,则无需额外进行配置即可使用@SentinelResource注解。
若您的应用使用了Spring AOP(无论是Spring Boot还是传统Spring应用),您需要通过配置的方式将SentinelResourceAspect注册为一个Spring Bean:
@Configuration
public class SentinelAspectConfiguration
{
@Bean
public SentinelResourceAspect sentinelResourceAspect()
{
return new SentinelResourceAspect();
}
}
package com.shenmazong.hello.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 军哥
* @version 1.0
* @description: AntiController
* @date 2022/12/27 20:20
*/
@RestController
@Slf4j
@RequestMapping(value = "/anti")
public class AntiController {
/**
* 注解方式定义资源
* @SentinelResource value 资源名称
* @SentinelResource blockHandler 调用被限流/降级/系统保护的时候调用的方法
* @return
*/
@SentinelResource(value = "helloWorld3", blockHandler = "blockHandlerForHelloWorld3")
@RequestMapping(value = "/helloWorld3")
public String helloWorld3() {
String msg = "helloWorld3:" + System.currentTimeMillis();
return msg;
}
/**
* 原方法调用被限流/降级/系统保护的时候调用
* @param ex
* @return
*/
public String blockHandlerForHelloWorld3(BlockException ex)
{
ex.printStackTrace();
return "系统繁忙,请稍后!";
}
}
浏览器请求: http://localhost:8080/anti/helloWorld3