@SentinelResource 注解
接着 Spring Cloud Alibaba(三)简单接入Sentinel(Sentinel 控制台),来看一下 @SentinelResource 一些常用的属性:
value : 资源名称,必需项(不能为空)
fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析
首先我们需要开启注解支持,SpringBootApplication 入口添加注解支持。
// 注解支持的配置Bean
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect ();
}
先测试一下 fallback,新增一个SentinelTest 方法并增加一个SentinelTestException方法:
@GetMapping ("/sentinel-test/{id}")
@SentinelResource ( value = "SentinelTest",fallback = "SentinelTestException")
public String SentinelTest(@PathVariable("id") long id){
long defaultId = 10L;
if (id < defaultId) {
throw new RuntimeException ("id bad");
}
return "Sentinel test OKK!";
}
/**
* fallback
* @param id
*/
public String SentinelTestException (long id) {
log.error ("id={}",id);
return "Sentinel test Error!";
}
启动应用,在浏览器直接访问 http://localhost:1889/sentinel-test/1 和 http://localhost:1889/sentinel-test/11 来看结果。可以看到当id = 1 时,抛出异常,然后通过fallback 属性执行了 SentinelTestException 方法,最后返回的是 "Sentinel test Error!"
,而id = 11 时,程序正常执行完成 返回 "Sentinel test OKK!";
。
这里 SentinelTestException 还可以增加一个Throwable 类型的参数,可以通过这个参数来实现捕获不同的异常,从而做对应的异常处理。
fallback 函数位置有要求,必须和原方法在同一个类中,实际需求中,我们需要放在其他地方。 通过fallbackClass 指定对应的类的 Class 对象,添加一个 static 函数,否则无法解析。
首先添加一个SentinelController
@RestController
@Slf4j
public class SentinelController {
@Autowired
private SentinelService sService;
@GetMapping ("/sentinel-test2/{id}")
public String SentinelTest(@PathVariable("id") long id){
return sService.sentinelTest (id);
}
}
创建一个SentinelService接口以及其实现类,实现类代码如下:
@Service ("sService")
@Slf4j
public class SentinelServiceImpl implements SentinelService{
@Override
@SentinelResource ( value = "SentinelTest2",
fallback ="sentinelTestFallBackClass",
fallbackClass = {FallBackService.class})
public String sentinelTest ( long id ) {
long defaultId = 10L;
if (id < defaultId) { //抛出异常,触发熔断降级
throw new RuntimeException ("id bad");
}
return id+" hello OKK!";
}
}
创建一个FallBackService类,并定义一个static 函数
@Slf4j
public class FallBackService {
public static String sentinelTestFallBackClass ( long id,Throwable e ) {
log.error ("异常降级处理");
//可以处理各种类型的异常,自定义异常
if (e instanceof RuntimeException) {
System.out.println ("异常类型");
}
return id+" Error";
}
}
启动应用,在浏览器访问:http://localhost:1889/sentinel-test2/11
然后访问:http://localhost:1889/sentinel-test2/1
后台日志也打印了对应的信息:
ERROR 10712 --- [nio-1889-exec-8] c.f.n.c.service.impl.FallBackService : 异常降级处理
接下来看一下 defaultFallback说明,用法很明显了。需要注意的是 :1.6.0 之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。
defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。
若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。
defaultFallback 函数签名要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
刚入坑学习记录一下,如果错误不足,欢迎指出。
Spring Cloud Alibaba 系列学习笔记
Spring Cloud Alibaba(一) 简单实现服务注册与发现
Spring Cloud Alibaba(二) 简单使用nacos配置中心
Spring Cloud Alibaba(三)简单接入Sentinel(Sentinel 控制台)