开发者学堂课程【全面讲解Spring Cloud Alibaba技术栈(知识精讲+项目实战)第二阶段:@Sentinel Resource注解讲解】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/684/detail/11881
@Sentinel Resource 注解讲解
内容介绍:
一、@Sentinel Resource 的作用
二、自定义 blockHandler 和 fallback
一、@Sentinel Resource 的作用
1.定义一个资源。
2.定义当资源内部发生异常的时候的处理逻辑。
blockHandler 定义当资源内部发生了 BlockException 应该进入的方法(捕获的是Sentinel 定义的异常)
fallback 定义资源内部发生 Throwable 应该进入的方法。
二、自定义 blockHandler 和 fallback
1.自定义 blockHandler
加入 value。
@SentinelResource(
Value=”message”;
value 后加入 blockHandler,它的返回类型和参数类型必须跟原方法一致,允许在参数列表的最后加入一个参数 Blockexception,用来接收原方法中发生的异常。
Blockhandler=”blockhandler”;
)
Public string message()(
Return “message”;
)
2.自定义 fallback
与 blockHandler 的自定义方法基本一致。
要求:
1.当前方法的返回值和参数要跟原方法一致。
2.但是允许在参数列表的最后加入一个参数 BlockException,用来接收原方法中发生的异常。
Public string fallback(string name,Throwable e)(
自定义异常处理逻辑
Log.error(“触发了BlockException,内容为()”,e);
)
试着调用一下。
@sentinelResource(
Value=”message”
blockHandler=”blockHandler”;
Fallback=”fallback”
)
3.做一个测试,看看效果
在 ordercontroller 下添加一个方法。
@RequestMapping(“/order/message3”)
@SentinelResource(“/order/message3”)
Public string message3(string name,Integer age) {
}
@RequestMapping(“/order/message”)
Public string message() {
Return orderserviceimpl3.message(name”xx”);
)
重新启动,重新访问,刷新 message。
4,做一个限流
找到簇点链路,给 message 加入一个流控
5.再来刷新
如果将以下过程注销掉,会发生什么?
Public string fallback(string name,Throwable e)(
自定义异常处理逻辑
Log.error(“触发了BlockException,内容为()”,e);
)
重新启动看一下效果,我们再来刷新。
接下来再来添加一个流控。
再刷新就会发现,就会发现进入了”Throwable”这个分支。
比如,public class OrderServiceImpl3(
Int i=0;
定义一个 inch i=0,单次超出一个,就会出现运行时异常。
重新启动,启动之前将自定义异常处理逻辑打开;就会发现所有 Sentinel 的异常进入了 BlankException 的逻辑,不是 Sentinel 的异常就进入了“单次超出一个运行就异常”这个逻辑。这样就区分过来那个 Sentinel 哪个不是 Sentinel。
我们来设置一下刷新
再给 massage 一个流控再刷新,会出现 BlockException 和 Throwable,现在已经可以去分开,是否是 Sentinel 引发的异常。
为什么有了 fallback还要blockHandler呢?
用blockHandler就可以把Sentinel的所有异常都兜住,fallback中就是业务逻辑异常,通常用fallback给出解决方案也可以。那么就可以把blockHandler的这些方法移到外边。
首先,做一个类。
把这个类当作 Blockexcption 处理的类,并把其方法移动到其中去。
@slf4j
Public class orderserviceImpl3BlockHandler(
)
对应指定哪个类中的方法。
@SentinelResource(
Value=”message”
Blockhandlerclass=OrderServiceImpl3BlockHandler.class
Blockhandler=”Blockhandler”
Fallback=OrderserviceImpl3Fallback.class;
重新启动刷新,
三次就会进入 Throwable。
设置一个流控,再刷新,就会发现进入了 BlockException。