美文网首页
Sentinel服务熔断[fallBack/blockHandl

Sentinel服务熔断[fallBack/blockHandl

作者: CodeYang | 来源:发表于2021-09-10 13:42 被阅读0次

一、测试 fallBack

@SentinelResource(value = "fallback",fallback = "handlerFallBack")
fallBack 是负责所有异常的,如果没有配置blockHandler,那么超出sentinel设置阈值的请求也会进到fallback里面

  1. 修改 CCircleBreakerController
@RestController
public class CCircleBreakerController {

    @Value("${service-url.nacos-provider-service}")
    private String url;

    @Resource
    private RestTemplate restTemplate;
    //1.FallBack 只负责业务异常
    @SentinelResource(value = "fallback",fallback = "handlerFallBack")
    @GetMapping(value = "/consumer/fallback/{id}")
    public String testRestTemplate(@PathVariable("id") Integer id){
        String result = restTemplate.getForObject(url + "/provider/fallback/" + id, String.class);
        if(id==4){
            throw new IllegalArgumentException("IllegalArgumentException,非法参数异常....");
        }else if(result==null){
            throw new NullPointerException("NullPointerException,该id没有对应记录,空指针异常");
        }
        return "Consumer 远程调用 --> "+result;
    }

    /**
     * 本例是 fallBack
     * @param id
     * @return
     */
    public String handlerFallBack(@PathVariable("id") Integer id, Throwable e){
        return "系统异常,Consumer 进行服务降级处理 handlerFallBack: "+e.getMessage();
    }
}
  1. 配置流控:新建流控规则


    新建流控规则
  2. 测试,当程序出现异常时,会调用服务降级方法,当sentinel 控制台配置 违规时,不会调用该方法。

Java程序异常 超过设定的QPS

====================================================================================

二、测试 blockHandler

@SentinelResource(value = "fallback",blockHandler = "blockHandler")
只负责 sentinel 控制台配置违规
blockHandler只是fallBack 的一个特殊情况,只捕捉BlockHandlerException

  1. 修改 CCircleBreakerController
@RestController
public class CCircleBreakerController {
    @Value("${service-url.nacos-provider-service}")
    private String url;

    @Resource
    private RestTemplate restTemplate;

    //2.blockHandler 只负责 sentinel 控制台配置违规
    @SentinelResource(value = "fallback",blockHandler = "blockHandler")
    @GetMapping(value = "/consumer/fallback/{id}")
    public String testRestTemplate(@PathVariable("id") Integer id){
        String result = restTemplate.getForObject(url + "/provider/fallback/" + id, String.class);
        if(id==4){
            throw new IllegalArgumentException("IllegalArgumentException,非法参数异常....");
        }else if(result==null){
            throw new NullPointerException("NullPointerException,该id没有对应记录,空指针异常");
        }
        return "Consumer 远程调用 --> "+result;
    }

    /**
     * 本例是 blockHandler
     * @param id
     * @return
     */
    public String blockHandler(@PathVariable("id") Integer id, BlockException e){
        return "系统异常,Consumer 进行服务降级处理 BlockException : "+e.getMessage();
    }
}

  1. 配置流控:新建流控规则


    新建流控规则
  2. 测试,只负责 sentinel 控制台配置违规,不负责 Java程序异常


    超过设定的QPS
Java程序异常

====================================================================================

三、测试 fallBack + blockHandler

fallBack 负责程序异常,blockHandler负责 sentinel 控制台异常
当两者异常都有的话 只会进入 blockHandler 异常处理

  1. 修改 CCircleBreakerController
@RestController
public class CCircleBreakerController {
    @Value("${service-url.nacos-provider-service}")
    private String url;
    @Resource
    private RestTemplate restTemplate;

    //3.两者都配置 fallBack 负责程序异常,blockHandler负责 sentinel 控制台异常
    @SentinelResource(value = "fallback",fallback = "handlerFallBack",blockHandler = "blockHandler")
    @GetMapping(value = "/consumer/fallback/{id}")
    public String testRestTemplate(@PathVariable("id") Integer id){
        String result = restTemplate.getForObject(url + "/provider/fallback/" + id, String.class);
        if(id==4){
            throw new IllegalArgumentException("IllegalArgumentException,非法参数异常....");
        }else if(result==null){
            throw new NullPointerException("NullPointerException,该id没有对应记录,空指针异常");
        }
        return "Consumer 远程调用 --> "+result;
    }

    /**
     * 本例是 fallBack
     * @param id
     * @return
     */
    public String handlerFallBack(@PathVariable("id") Integer id, Throwable e){
        return "系统异常,Consumer 进行服务降级处理 handlerFallBack: "+e.getMessage();
    }

    /**
     * 本例是 blockHandler
     * @param id
     * @return
     */
    public String blockHandler(@PathVariable("id") Integer id, BlockException e){
        return "系统异常,Consumer 进行服务降级处理 BlockException : "+e.getMessage();
    }
}
  1. 配置流控:新建流控规则


    新建流控规则

3.测试, fallBack 负责程序异常,blockHandler负责 sentinel 控制台异常


超过设定的QPS Java程序异常 超过设定的QPS并且Java程序异常

四、程序忽略异常

exceptionsToIgnore = {IllegalArgumentException.class}),假如出现该异常,fallBack兜底,不没有降级效果

  1. Java代码修改,只修改注解
@SentinelResource(value = "fallback"
            ,fallback = "handlerFallBack"
            ,blockHandler = "blockHandler"
            ,exceptionsToIgnore = {IllegalArgumentException.class})//假如出现该异常,fallBack兜底,不没有降级效果
  1. 测试,发现不会做降级处理,直接抛出异常


    不会做降级处理

相关文章

网友评论

      本文标题:Sentinel服务熔断[fallBack/blockHandl

      本文链接:https://www.haomeiwen.com/subject/hreuiltx.html