SpringCloud 2020 Alibaba微服务实战八 sentinel实战之优雅的处理限流异常

一,blockHandler

使用blockHandler指定发生BlockException时进入的方法,方法需满足以下条件

  • 必须是 public 修饰
  • 返回类型、参数与原方法一致,并在最后加BlockException 类型的参数
  • 默认需和原方法在同一个类中

代码

package com.liu.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class SentinelTestController {

    @GetMapping(value = "/hello")
    @SentinelResource(value = "hello",blockHandler = "handleException")
    public String hello() {
        log.info("****hello-hello-hello-hello-hello");
        return "Hello Sentinel";
    }
    /**
     * 自定义异常策略
     * 返回值和参数要跟目标函数一样,参数可以追加BlockException
     */
    public String handleException( BlockException exception){
        log.info("flow exception{}",exception.getClass().getCanonicalName());
        return  "达到阈值了,不要再访问了!";
    }
}

此种方式,每个服务类至少要写一个异常处理方法,并且每个服务资源,必须写处理方法,加大了代码量

 

blockHandlerClass

将限流和降级方法外置到单独的类中,需满足以下条件:

  • 方法必须 使用public static 修饰
  • 满足blockHandler处理条件
  1. 编写类
package com.liu.exception;

import com.alibaba.csp.sentinel.slots.block.BlockException;

public class ConstomerBlockHandler {

    public static String blockHandler(BlockException exception) {
        return "被限流了哦!!!by ConstomerBlockHandler";
    }
}
package com.liu.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.liu.exception.ConstomerBlockHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class SentinelTestController {

    @GetMapping(value = "/hello")
    @SentinelResource(value = "hello",blockHandler = "handleException")
    public String hello() {
        log.info("****hello-hello-hello-hello-hello");
        return "Hello Sentinel";
    }
    @GetMapping(value = "/hello2")
   //blockHandler 对应处理类的方法名
    @SentinelResource(value = "hello2",blockHandler = "blockHandler",blockHandlerClass = ConstomerBlockHandler.class)
    public String hello2() {
        log.info("****hello2-hello2-hello-hello-hello");
        return "Hello2 Sentinel";
    }
    /**
     * 自定义异常策略
     * 返回值和参数要跟目标函数一样,参数可以追加BlockException
     */
    public String handleException( BlockException exception){
        log.info("flow exception{}",exception.getClass().getCanonicalName());
        return  "达到阈值了,不要再访问了!";
    }
}

 

fallback
用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理,满足条件同blockHandler大致一致(BlockException替换为Throwable)。
 

fallbackClass
处理fallback的类。大致和blockHandlerClass一样

defaultFallback
用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。

exceptionsToIgnore
指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。
 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值