springCloud Alibaba实战五之Sentinel(熔断处理)

上一篇博客我已经介绍了sentinel的控制台功能,以及他的限流处理
接下来我们实现sentinel的熔断保护功能
什么叫熔断保护,当我们的某个服务接口出现了问题,不能正常提供服务,或者该接口响应速度很慢,导致调用方大量请求堆积,此时需要将该接口降级服务,从而保护调用该接口的服务,快速返回降级结果,防止因为过多的服务等待该接口的返回,导致系统雪崩
启动控制台, 启动nacos server, 这个就不在多说了, 请查看前期博客
接下来我们对payment-service进行改造
新增PaymentService接口

public interface PaymentService {
    Balance getBalance(Integer id);
}

PaymentServiceImpl实现类

@Service
@RefreshScope
public class PaymentServiceImpl implements PaymentService {
    final static Map<Integer, Balance> balanceMap = new HashMap() {
        {
        put(1, new Balance(1, 10, 1000));
        put(2, new Balance(2, 0, 10000));
        put(3, new Balance(3, 100, 0));
        }
    };
    @Value("${sleep:0}")
    private int sleep;

    @Value("${server.port:0}")
    private int port;

    @Override
    @SentinelResource(value = "getBalance", fallback = "getBalanceFallBack", blockHandlerClass = SentinelExceptionHandler.class, blockHandler = "blockExceptionHandle")
    public Balance getBalance(Integer id) {
        System.out.println("request: " + port + ", /pay/balance?id=" + id + ", sleep: " + sleep);
        if(sleep > 0) {
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //制造异常
        for (int i = 0; i < 100000000L; i++) {
            throw new RuntimeException();
        }

        if(id != null && balanceMap.containsKey(id)) {
            return balanceMap.get(id);
        }
        return new Balance(0, 0, 0);
    }

    // 该方法降级处理函数,参数要与原函数getBalance相同,并且返回值类型也要与原函数相同,此外,该方法必须与原函数在同一个类中
    public Balance getBalanceFallBack(Integer id){
        return new Balance(0, 0, 0, "sentinel降级处理");
    }
}

改造controller
将原有逻辑代码移动到实现类中,将@SentinelResource注解移动到实现类方法上面, 并添加fallback属性,
添加对应的降级方法, 如上PaymentServiceImpl中的getBalanceFallBack, 解释如上注解

@RestController
public class PaymentController {

    @Autowired
    private PaymentService service;


    /**
     *
     * @param id
     * @return
     */
    @RequestMapping("/pay/balance")
    public Balance getBalance(Integer id) {
        return service.getBalance(id);
    }

}

代码基本改造完成
sentinel又3中降级处理方法,
1.超时降级: 在超过多少次的超时后,下一次尝试访问超时就降级
2.异常比率: 在达到一定比率后的下一次访问异常就降级
3.异常数:在到达多少次异常后,下一次异常就降级
sentinel控制台中3中规则配置如下窗口
在这里插入图片描述
配置好降级规则
在这里插入图片描述
我这里配置的时异常数, 印为我代码里写的时抛出异常

然后我们访问
http://localhost:8081/acc/user?id=1
在这里插入图片描述
或者访问http://localhost:8082/pay/balance?id=3
在这里插入图片描述
返回的都是降级处理的结果,不会出现异常页面

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值