Sentionel统一异常处理
五。统一异常处理BlockException
在上述规则测试中,当违反规则时,出来的异常信息页面不够友好和统一,我们可以通过设置统一的异常处理类,针对不同规则显示不同异常信息。
创建一个配置类,实现BlockExceptionHandler接口ComponentpublicclassMyBlockExceptionHandlerimplementsBlockExceptionHandler{Overridepublicvoidhandle(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,BlockExceptione)throwsException{ResponseResultrsnull;if(einstanceofFlowException)rsResponse。createFailResp(1,接口限流了);elseif(einstanceofDegradeException)rsResponse。createFailResp(2,服务降级了);elseif(einstanceofParamFlowException)rsResponse。createFailResp(3,参数限流了);elseif(einstanceofAuthorityException)rsResponse。createFailResp(4,权限规则不通过);elseif(einstanceofSystemBlockException)rsResponse。createFailResp(5,系统保护);httpServletResponse。setContentType(applicationjson;charsetutf8);httpServletResponse。getWriter()。write(JSON。toJSONString(rs));}}
添加规则测试:
六SentinelResource注解详解
通过前面的学习,我们了解到通过Sentinel除了可以控制对SpringMvc接口层级的控制,也可以对service层的某个方法控制,也就是说在我们实际项目开发时不仅仅限于接口,可能对于某个方法的调用限流,对于某个外部资源的调用限流等都希望做到控制。
那么如何使用SentinelResource注解灵活的定义控制资源以及如何配置控制策略。我们来系统学习一下。1。自定义资源点
我们可以对这个资源点做限流处理2实现异常处理
默认情况下,Sentinel对控制资源的限流处理是直接抛出异常。设置了统一异常处理BlockExceptionHandler也会发现对非控制层的资源没有用,这样对用户交流不友好,我们需要处理一下SentinelResource资源的异常信息。
SentinelResource资源的异常处理有两种方式:
blockHandler:sentinel定义的失败调用或限制调用,若本次访问被限流或服务降级,则调用blockHandler指定的接口
fallback:失败调用,若本接口出现未知异常,则调用fallback指定的接口。
当两个都配置时,也就是当出现sentinel定义的异常时,调用blockHandler,出现其它异常时,调用fallback。2。1blockhandler的使用
blockhandler定义当资源内部发生了BlockException(也就是sentinel定义的失败异常或限制异常),应该走的处理逻辑。
要求:
1。当前方法的返回值和参数要和原方法一致
2。允许在参数列表的最后加入一个参数BlockException,用来接收原方法中发生的异常。
2。2fallback的使用
要求:
1。当前方法的返回值和参数要和原方法一致
2。允许在参数列表的最后加入一个参数Throwable,用来接收原方法中发生的异常。
2。3测试
3。怎么将异常处理放在资源类的外面
如果将所有的异常处理都放在资源类里面,会导致类很臃肿,不利于维护,外面可以将异常处理放在类外面
4。SentinelResource的其它属性
value:Sentinel资源的名称,我们不仅可以通过url进行限流,也可以把此值作为资源名配置,一样可以限流。
entryType:条目类型(入站或出站),默认为出站(EntryType。OUT)
resourceType:资源的分类(类型)
blockHandler:块异常函数的名称,默认为空
blockHandlerClass:指定块处理方法所在的类
默认情况下,blockHandler与原始方法位于同一类中。但是,如果某些方法共享相同的签名并打算设置相同的块处理程序,则用户可以设置存在块处理程序的类。请注意,块处理程序方法必须是静态的。
fallback:后备函数的名称,默认为空
defaultFallback:默认后备方法的名称,默认为空
defaultFallback用作默认的通用后备方法。它不应接受任何参数,并且返回类型应与原始方法兼容
fallbackClass:fallback方法所在的类(仅单个类)
默认情况下,fallback与原始方法位于同一类中。但是,如果某些方法共享相同的签名并打算设置相同的后备,则用户可以设置存在后备功能的类。请注意,共享的后备方法必须是静态的。
exceptionsToTrace:异常类的列表追查,默认Throwable
exceptionsToIgnore:要忽略的异常类列表,默认情况下为空。七Sentinel整合OpenFeign实现服务降级(服务容错)
如果一个服务(服务消费者)调用了另一个服务(服务生产者),服务生产者有异常,会导致服务消费者出错,我们希望不仅仅只是显示错误,而是能启动熔断器,对服务消费者做降级(容错)处理。
那么应该怎么实现呢?
1。添加jar包
我们当前项目里已添加!添加openFeigndependencygroupIdorg。springframework。cloudgroupIdspringcloudstarteropenfeignartifactIddependency
2。添加配置信息
在服务消费者的配置文件中添加
3。添加降级处理类
4。在feign客户端关联对应的降级处理类
5。在服务提供者中模拟一个异常
比如inti10;
6。测试
八Sentinel规则持久化
SentinelDashboard中添加的规则是存储在内存中的,只要项目一重启规则就丢失了
我们可以将规则持久化到nacos中,在nacos中添加规则,然后同步到dashboard中。
方法如下:
1。添加jar包!将持久化到nacos中dependencygroupIdcom。alibaba。cspgroupIdsentineldatasourcenacosartifactIddependency
2。在nacos配置中心添加配置文件
〔{resource:goods,limitApp:default,grade:1,count:2,strategy:0,controlBehavior:0,clusterMode:false}〕
注意:
配置格式:选择json选项
配置内容:
resource:资源名称
limitApp:来源应用
grade:阈值类型,0表示线程,1表示QPS
count:单机阈值
strategy:流控模式,0表示直接,1表示关联,2表示链路
controlBehavior:流控效果,0表示快速失败,1表示WarmUp,2表示排队等待
clusterMode:是否集群
3。修改微服务配置信息,添加sentinel规则配置信息到微服务的配置文件中
4。重启服务