【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

导读:本篇文章讲解 【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

本章进行自定义sentinel的返回值处理,默认处理的返回值是Blocked by Sentinel (flow limiting),下面进行自定义的返回值处理,先实现通过Sentinel注解的方式实现,单个接口资源流控之后的返回值自定义处理,再实现针对BlockException的全局的流控处理,下面开整。

目录

一、基于SentinelResource注解

二、全局处理 


一、基于SentinelResource注解

目前的代码结构:

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

框选部分为本章新增和修改的类。

1、新增一个处理sentinel自定义返回的类,编写自定义返回方法,如下:

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

2、 新增测试接口

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

使用sentinel的注解sentinelresource,他有如下参数:

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

value:定义sentinel的资源名称。ps:一定要注意,sentinelresource的名字不要相同,controller下面的方法,sentinel他会默认加载成sentinel资源,名字为mapping映射注解的值,所以若在方法上新增一个sentinelresource注解,一定记得不能重名,否则会失效。!!!!!)。

entryType:资源调用的流量类型,默认是出口流量(OUT),可以设置为入口流量(IN),注意系统规则只对 IN 生效(没用过)。

resourceType:资源类型,默认是0,(1:web,2:prc,3:gateway,4:sql)。

blockHandler:自定义流控处理方法的方法名(只能处理BlockException异常)。

blockHandlerClass:自定义流控处理方法的所在的类名。

allback:可以处理所有类型的异常,值是处理异常的方法名,配合fallbackClass使用。

defaultFallback:设置默认的异常处理,值是处理异常的方法名,配合fallbackClass使用,若同时设置了allback的值,则不会走默认的defaultfallback指定的方法名所在方法,而是走allback设置的方法。

fallbackClass:配合defaultFallback或者allback使用,值为处理异常的方法所在的类的类名。

exceptionsToTrace:sentinel默认会有可以处理的异常类型但不是所有都能处理,若需要处理其他异常,通过该属性设置异常类型的值,进行一个类似追加的操作,追加sentinel可以操作的异常列表数据。

exceptionsToIgnore:值为异常类,表示指定的异常类不会走自定义的异常处理方法(allback或者defaultfallback或者blockhandler),而是走他自己默认的处理。

3、新增流控规则

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

ps:流控规则加到sentinelresouce注解设置的value值对应的资源上,而不是加到mapping映射注解名称自动生成的sentinel资源上,如上加到test33上而不是test3上!!。

4、演示(只使用了blockHandler和blockHandlerClass属性)

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

不再是返回默认的Blocked by Sentinel (flow limiting)。

二、全局处理 

1、BlockException异常类

先了解一下BlockException:他是Sentinel里面的一个父异常类,集成了Exception异常类,有多个子类,FlowException(流控),ParamFlowException(热点),DegradeException(熔断),AuthorityException(授权),SystemBlockException(系统),对应了Sentinel功能列表的各个功能对应的处理依据异常。一旦超过设定的值,就会触发sentinel机制(例如:流控效果),都会抛出一个BlockException。所以,可以通过重写sentinel提供的BlockException异常的BlockExceptionHandler接口或者UrlBlockHandler接口去重写BlockException抛出前的处理逻辑,进行针对BlockException异常的细分化的全局异常处理。

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

2、自定义全局异常类处理BlockException

这里需要提到一点,此处我使用的是2.1.1版本的sentinel,所以通过实现UrlBlockHandler的方式。

alibaba sentinel版本 全局异常实现方式
2.2.0以下版本 需要实现UrlBlockHandler接口
2.2.0以上 实现 BlockExceptionHandler接口

实现(新增配置文件):

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)注意:加上Component注解,重写UrlBlockHandler接口的blocked方法。 

3、演示

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

 【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

测试test2接口资源,设置流控规则,由于是流控,所以会在产生流控时,new一个 FlowException异常出来,上面有提到,所以会走【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

这一步,启动jmeter的测试计划,查看结果,如下:

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)

http请求返回指定的500错误码, 相应的信息为“被限流”,全局异常处理设置成功。

2022.3.21修改:使用全局处理不能使用sentinelresource注解,否则失效。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/12761.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!