Spring Cloud Alibaba(四)简单接入Sentinel(fallback用法)
@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 控制台)
Spring Cloud Alibaba(四)简单接入Sentinel(fallback用法)
Spring Cloud Alibaba(五)简单接入Sentinel(blockHandler 用法)
- 点赞
- 收藏
- 分享
- 文章举报
- Spring Cloud Alibaba(五)简单接入Sentinel(blockHandler 用法)
- Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Nacos
- SpringCloud Alibaba Nacos作为配置中心(九)--------简单登录功能
- Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则
- Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Nacos
- Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则
- Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流
- SpringCloud Alibaba框架搭建(二)之中间件Sentinel
- Spring Cloud Alibaba迁移指南2:一行代码从Hystrix迁移到Sentinel
- SpringCloud Alibaba Sentinel
- Spring Cloud Alibaba Sentinel 整合 Feign 的设计实现
- Spring Cloud Alibaba使用Sentinel实现接口限流
- Spring Cloud Alibaba教程之Sentinel的使用
- [Spring-Cloud-Alibaba] Sentinel 规则持久化
- Spring Cloud Alibaba从入门到放弃-Nacos集成Sentinel实现限流降级熔断
- Spring Cloud Alibaba | Sentinel: 服务限流高级篇
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战
- Spring Cloud alibaba网关 sentinel zuul 四 限流熔断
- 简单springboot及springboot cloud环境搭建
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)