[toc]

零、遇到的问题

由于之前,实践过程中,接口被限流后,异常返回的是默认异常
image.png

问题小结:

  1. 系统默认的,没有体现我们自己的业务要求。
  2. 依照现有条件,我们自定义的处理方法又和业务代码耦合在一块,不直观。
  3. 每个业务方法都添加一个兜底的,那代码膨胀加剧。
  4. 全局统—的处理方法没有体现。

一、捕获sentinel限流异常

1. 修改模块cloudalibaba-sentinel-service8401中的pom文件

新增公共模块

<dependency>
    <groupId>com.atguigu.springcloud</groupId>
    <artifactId>cloud-api-commons</artifactId>
    <version>${project.version}</version>
</dependency>

2. 控制层新增接口

    @GetMapping("/byResource")
    @SentinelResource(value = "byResource",blockHandler = "handleException")
    public CommonResult byResource(){
        return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001"));
    }
    
    public CommonResult handleException(BlockException exception) {
        return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");
    }

3. 启动服务

  1. 启动nacos
  2. 启动sentinel
  3. 启动模块

4. 配置测试接口限流

进行限制资源
image.png

5. 测试

测试接口:
测试类型:GET
测试结果:
频繁刷新接口
image.png

6. 捕获异常抽取

  1. 异常返回抽取为公共类CustomerBlockHandler
package org.learn.cloud.myhandler;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.learn.cloud.entities.CommonResult;

public class CustomerBlockHandler {

    public static CommonResult handleException(BlockException exception) {
        return new CommonResult(2020, "自定义限流处理信息....CustomerBlockHandler");

    }
}

image.png

  1. 注解修改
    @SentinelResource(value = "byResource",
            blockHandlerClass = CustomerBlockHandler.class, 
            blockHandler = "handleException")

image.png

  1. 测试
    频繁刷新接口,结果如下:
    image.png

7. 遗留问题

修改程序,增加int i = 10/0;
image.png

发现,代码发生异常,没有走blockHandler中返回。
image.png

二、捕获运行时异常

1. 控制层修改代码

    @GetMapping("/byResource")
//    @SentinelResource(value = "byResource",blockHandler = "handleException")
    @SentinelResource(value = "byResource",
            blockHandlerClass = CustomerBlockHandler.class,
            blockHandler = "handleException",
            fallback = "fallException")
    public CommonResult byResource(){
        int i = 10/0;
        return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001"));
    }

    public CommonResult handleException(BlockException exception) {
        return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");
    }

    public CommonResult fallException(Throwable e) {
        return new CommonResult(555,e.getMessage()+"\t 服务不可用");
    }

image.png

2. 测试

测试接口:http://localhost:8401/byResource
频繁刷新:
image.png

Q.E.D.


只有创造,才是真正的享受,只有拚搏,才是充实的生活。