sentinel-自定义错误返回

sentinel-自定义错误返回

起男 944 2021-10-10

sentinel-自定义错误返回

自定义错误页

对所有接口的异常统一返回

  1. 编写错误返回

    @RestController
    @RequestMapping("error")
    public class BlockController {
    
        @RequestMapping("block_handler")
        public Object globalBlockHandler(){
            Map<String,Object> result = new HashMap<>();
            result.put("status", HttpServletResponse.SC_BAD_REQUEST);
            result.put("message","错误");
            return result;
        }
    }
    
  2. 修改配置文件

    spring:
      cloud:
        sentinel:
          block-page: /error/block_handler #阻断页
    

fallback

这种方式可以为指定接口定制返回格式

  1. 编写配置类

    @Configuration
    @EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass = true) //cglib代理
    public class SentinelAOPConfig {
    
        /**
         * 所有的fallback的处理操作都是基于切面的形式完成的
         * @return
         */
        @Bean
        public SentinelResourceAspect getSentinelResourceAspect(){
            return new SentinelResourceAspect();
        }
    }
    
  2. 业务代码

        @SentinelResource(value = "getTest",fallback = "testFallback")//兜底方法名
        @GetMapping
        public String getTest(){
            return "正常返回";
        }
    
        public String testFallback(){ //方法参数和返回值和原方法一样
            return "发生异常";
        }
    

BlockHandler

将所有fallback处理方法定义再一个专属的类中

  1. 将错误处理方法提取出来

    public class MyBlockHandler {
    
        /**
         * 兜底方法
         * @param e 可能出现的限流异常的最大父类(其他参数要和原方法一样)
         * @return 返回值和原方法相同
         */
        public static String getBlockHandler(BlockException e){ //需要有static
            return "失败:"+e.getRule();
        }
    }
    
  2. 原方法

        @SentinelResource(value = "getTest",blockHandlerClass = MyBlockHandler.class, blockHandler = "getBlockHandler")
        @GetMapping
        public String getTest(){
            return "正常返回";
        }
    

优先级:BlockHandler>fallback>自定义错误页