Sentinel服务熔断及Sentinel按资源、按URL限流

本篇继续我们的Sentinel,本篇接着上一篇继续探究一下@SentinelResource注解的其它属性及,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

前几篇中我们在配置限流的时候有使用访问路径为资源名进行配置的,也有是有@SentinelResource注解的value值为资源名进行配置的,接下来我们具体测试下两者的区别。

目录

按照RUL限流

完善测试方法

配置

测试

按照资源名限流

配置

测试

小结

@SentinelResource相关属性测试

blockHandler与fallback

完善测试类

配置blockHandler

配置

测试 

配置fallback 

修改测试类

配置

配置blockHandler和fallback

修改测试类

配置

测试

blockHandler与fallback小结

自定义限流处理

自定义限流处理类

完善测试方法

配置

测试 


按照RUL限流

完善测试方法

在FlowLimitController类中增加以下测试方法:

    @GetMapping("/byUrl_byResource")
    @SentinelResource(value = "byUrl_byResource",blockHandler = "dealHandler_byUrl_byResource")
    public String byUrl_byResource() {
        return "-----byUrl_byResource";
    }

    public String dealHandler_byUrl_byResource(BlockException exception) {
        return "-----dealHandler_byUrl_byResource";
    }

配置

测试

启动服务,浏览器快速访问 http://localhost:8401/byUrl_byResource ,报错如下:

按照资源名限流

配置

使用上面的测试方法,进行如下配置:

测试

启动服务,浏览器快速访问 http://localhost:8401/byUrl_byResource ,报错如下:

小结

 按url限流: 配置资源名为访问路径,使用url限流时触发流控规则会报默认错误。

 按资源限流: 配置资源名为@SentinelResource注解对应的value值。
 如果@SentinelResource
 指定了blockHandler 会执行指定的方法 如上dealHandler_byUrl_byResource
 没指定blockHandler 会执行默认的方法 返回 Blocked by Sentinel (flow limiting)

@SentinelResource相关属性测试

blockHandler与fallback

完善测试类

在FlowLimitController类中增加以下测试方法:

    @GetMapping("/{id}")
    @SentinelResource(value = "fallbackAndBlockHandler",blockHandler = "blockHandler")
    //@SentinelResource(value = "fallbackAndBlockHandler",fallback = "handlerFallback")
    public String fallbackAndBlockHandler(@PathVariable("id") Integer id) {
        if (id == 4) {
            int i = 9/0;
        }
        return "SentinelResource";
    }

    /**
     * 兜底方法
     */
    public String handlerFallback(@PathVariable Integer id,Throwable e){
        return "-----blockHandler,exception内容  "+e.getMessage() + " --- " + e.getCause();
    }

    /**
     * sentinel 违规执行方法
     */
    public String blockHandler(@PathVariable  Long id,BlockException e) {
        return "-----blockHandler,exception内容  "+e.getMessage() + " --- " + e.getCause();
    }

配置blockHandler

配置

测试 

启动服务,浏览器快速访问 http://localhost:8401/1 ,报错如下: 

 

浏览器访问 http://localhost:8401/4,报错如下:

浏览器快速访问 http://localhost:8401/4,报错如下: 

 

配置fallback 

修改测试类

修改FlowLimitController类中的测试方法:

    @GetMapping("/{id}")
    //@SentinelResource(value = "fallbackAndBlockHandler",blockHandler = "blockHandler")
    @SentinelResource(value = "fallbackAndBlockHandler",fallback = "handlerFallback")
    public String fallbackAndBlockHandler(@PathVariable("id") Integer id) {
        if (id == 4) {
            int i = 9/0;
        }
        return "SentinelResource";
    }

配置

同上面的配置

测试

启动服务,浏览器快速访问 http://localhost:8401/1 ,报错如下: 

​ 

浏览器访问 http://localhost:8401/4,报错如下:

浏览器快速访问 http://localhost:8401/4,报错如下: 

 ​​​​​​​​

配置blockHandler和fallback

修改测试类

修改FlowLimitController类中的测试方法:

    @GetMapping("/{id}")
    @SentinelResource(value = "fallbackAndBlockHandler",fallback = "handlerFallback",blockHandler = "blockHandler")
    public String fallbackAndBlockHandler(@PathVariable("id") Integer id) {
        if (id == 4) {
            int i = 9/0;
        }
        return "SentinelResource";
    }

配置

同上面的配置

测试

启动服务,浏览器快速访问 http://localhost:8401/1 ,报错如下:

img

浏览器访问 http://localhost:8401/4,报错如下:

img

浏览器快速访问 http://localhost:8401/4,报错如下:

img

blockHandler与fallback小结

配置blockHandler: 触发配置的限流规则时,会执行blockHandler指定的方法,程序运行异常时,会将异常信息直接返回前端,不友好。

配置fallback:触发配置的限流规则和程序运行异常时,都会进入fallback指定的方法。相比上面只配置blockHandler,在触发配置的限流规则时,避免了直接将系统默认的错误返回前端;在运行异常时,避免了将异常信息直接返回前端。

配置blockHandler和fallback:触发配置的限流规则时进入blockHandler指定的方法,程序运行异常时,进入fallback指定的方法。

自定义限流处理

到此为止存在的问题:自定义的处理方法和业务代码耦合在一块,代码臃肿且不利于复用。我们可以通过自定义处理类的方式将这些处理方法提出来以解决这个问题,下面我们看下自定义限流处理的步骤。

自定义限流处理类

public class CustomerBlockHandler {

    public static String handleException1(BlockException exception){
        return "自定义的限流处理信息......CustomerBlockHandler......1";
    }

    public static String handleException2(BlockException exception){
        return "自定义的限流处理信息......CustomerBlockHandler......2";
    }
}

完善测试方法

FlowLimitController类中新增测试方法,我们可以通过blockHandler指定CustomerBlockHandler类中的某个方法作为处理类,如下我们指定CustomerBlockHandler中的handleException2方法为处理类:

    @GetMapping("/customerBlockHandler")
    @SentinelResource(value = "customerBlockHandler",
            blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handleException2")
    public String customerBlockHandler() {
        return "按客户自定义限流处理逻辑";
    }

配置

测试 

浏览器快速访问  ,报错如下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值