首页 > 其他分享 >统一异常处理——BlockException

统一异常处理——BlockException

时间:2022-12-25 22:02:42浏览次数:40  
标签:添加 处理 异常 默认 限流 BlockException 方法 统一

五.统一异常处理—BlockException

在上述规则测试中,当违反规则时,出来的异常信息页面不够友好和统一,我们可以通过设置统一的异常处理类,针对不同规则显示不同异常信息。

创建一个配置类,实现BlockExceptionHandler接口


@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {

    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {

        ResponseResult rs=null;

        if(e instanceof FlowException)
            rs= Response.createFailResp(-1,"接口限流了");
        else if(e instanceof DegradeException)
            rs=Response.createFailResp(-2,"服务降级了");
        else if(e instanceof ParamFlowException)
            rs=Response.createFailResp(-3,"参数限流了");
        else if(e instanceof AuthorityException)
            rs=Response.createFailResp(-4,"权限规则不通过");
        else if(e instanceof SystemBlockException)
            rs=Response.createFailResp(-5,"系统保护");

        httpServletResponse.setContentType("application/json;charset=utf-8");
        httpServletResponse.getWriter().write(JSON.toJSONString(rs));

    }
}

添加规则测试:

在这里插入图片描述

六 @SentinelResource注解详解

通过前面的学习,我们了解到通过Sentinel除了可以控制对Spring Mvc接口层级的控制,也可以对service层的某个方法控制,也就是说在我们实际项目开发时不仅仅限于接口,可能对于某个方法的调用限流,对于某个外部资源的调用限流等都希望做到控制。
那么如何使用@SentinelResource注解灵活的定义控制资源以及如何配置控制策略。我们来系统学习一下。

1.自定义资源点

在这里插入图片描述

我们可以对这个资源点做限流处理

2 实现异常处理

默认情况下,Sentinel对控制资源的限流处理是直接抛出异常。设置了统一异常处理BlockExceptionHandler也会发现对非控制层的资源没有用,这样对用户交流不友好,我们需要处理一下@SentinelResource资源的异常信息。

@SentinelResource资源的异常处理有两种方式:

blockHandler:sentinel定义的失败调用或限制调用,若本次访问被限流或服务降级,则调用blockHandler指定的接口

fallback:失败调用,若本接口出现未知异常,则调用fallback指定的接口。

当两个都配置时,也就是当出现sentinel定义的异常时,调用blockHandler,出现其它异常时,调用fallback。

2.1 blockhandler 的使用

blockhandler 定义当资源内部发生了BlockException(也就是sentinel定义的失败异常或限制异常),应该走的处理逻辑。

要求:

1.当前方法的返回值和参数要和原方法一致

2.允许在参数列表的最后加入一个参数BlockException,用来接收原方法中发生的异常。

在这里插入图片描述

2.2 fallback的使用

要求:

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包

我们当前项目里已添加

<!-- 添加openFeign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.添加配置信息

在服务消费者的配置文件中添加

在这里插入图片描述

3.添加降级处理类

在这里插入图片描述

4.在feign客户端关联对应的降级处理类

在这里插入图片描述

5.在服务提供者中模拟一个异常

比如 int i=1/0;

6.测试

在这里插入图片描述

八 Sentinel 规则持久化

Sentinel Dashboard中添加的规则是存储在内存中的,只要项目一重启规则就丢失了

我们可以将规则持久化到nacos中,在nacos中添加规则,然后同步到dashboard中.

方法如下:

1.添加jar包

<!--将持久化到nacos中 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

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表示Warm Up,2表示排队等待

clusterMode: 是否集群

3.修改微服务配置信息,添加sentinel规则配置信息到微服务的配置文件中

在这里插入图片描述

4.重启服务

  1. 配置信息查询

https://github.com/alibaba/Sentinel/wiki

标签:添加,处理,异常,默认,限流,BlockException,方法,统一
From: https://www.cnblogs.com/daimenglaoshi/p/17004671.html

相关文章

  • 统一异常处理—BlockException
    五.统一异常处理—BlockException在上述规则测试中,当违反规则时,出来的异常信息页面不够友好和统一,我们可以通过设置统一的异常处理类,针对不同规则显示不同异常信息。创建一......
  • JAVA异常
    JAVA异常异常:指程序运行中出现的不期而至的各种状况(例:文件找不到、网络连接失败...)异常发生在程序运行期间,它影响了正常的程序执行流程简单分类:检查性异......
  • Windows10系统 无法更换锁屏图片一直转圈圈(含替换系统默认锁屏壁纸教程)异常处理
    (目录)一、异常错误Windows10系统锁屏界面无法更换图片,浏览选择别的壁纸后一直转圈二、原因联想电脑管家中,联想锁屏强制开启,导致无法更换壁纸,需要手动关闭还是联想......
  • UncaughtExceptionHandler 是什么?线程池如何处理异常?
      UncaughtExceptionHandler在ThreadAPI中提供了UncaughtExceptionHandler,它能检测出某个线程由于未捕获的异常而终结的情况,能有效地防止线程泄漏问题当一个线程......
  • Java中的异常、IO与NIO面试题
    ✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。......
  • 【实践】推荐、搜索、广告多业务多场景统一预估引擎实践与思考
    ​今天给大家带来OPPO机器学习部预估组负责人魏刚先生在全球人工智能与机器学习技术大会上所做的分享《推搜广多业务多场景统一预估引擎实践与思考.pdf》,关注推荐、搜索、广......
  • Java异常
    什么是异常?指程序在运行过程中发生的不正常事件,他会中断程序运行打印错误信息语句:System.err.println("");系统强制退出:System.exit(1);异常的关键字:try执行可能......
  • python:了解异常
    当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUGbug单词的诞生早期计算机采用大量继电器工作,马克......
  • python:异常的捕获方法
    世界上没有完美的程序,任何程序在运行的过程中,都有可能出现:异常,也就是出现bug导致程序无法完美运行下去。我们要做的,不是力求程序完美运行。而是在力所能及的范围内,对可......
  • Unsupported major.minor version 52.0异常解决
    java.lang.UnsupportedClassVersionError:com/mysql/jdbc/Driver:Unsupportedmajor.minorversion52.0异常解决一.异常问题我在写某个项目的时候,连接的数据库是5.7,用......