小卓仔 2023-12-21 15:12 采纳率: 93.3%
浏览 2
已结题

如何在 Sentinel 中使用代码的形式实现熔断降级服务?

如何在 Sentinel 中使用代码的形式实现熔断降级服务?
通过官方文档可知实现 熔断降级服务一般使用 @SentinelResource 中的 fallback() 属性指定一个降级服务函数。
如果想用代码的形式来实现的话,涉及到了哪些类?我 已经定义好了 熔断规则。当触发熔断时调用 降级函数,这个降级函数如何写?写在哪里?

Sentinel 中的 流量控制 限流后用代码的形式我会,简单写法如下:

@GetMapping("/testA")
 public String testA() {
     initFlowRules()   // 定义限流规则方法。
     try( Entry entry=SphU.entry("testAbySphU");) {  //开始定义资源
                   return "服务访问成功------testA"; 
                  } catch (BlockException e1) {  // BlockException 为限流抛出的异常。
                            return "提醒您,testA 服务被限流";   //流控逻辑处理 - 开始    
                                 }                           
}

但是 熔断降级 用代码形式也是这样写吗?是不是只需要把 限流规则换成 熔断降级的规则。那BlockException 异常换成哪个异常?
还是说,我的这个思路本身就不对?

  • 写回答

1条回答 默认 最新

  • 刘家旺1 2023-12-21 15:17
    关注

    该回答引用Spark Ai:在Sentinel中,除了使用@SentinelResource注解来配置熔断降级之外,也可以通过编程的方式来实现。Sentinel的熔断降级主要是通过DegradeRule(熔断规则)来定义的,当资源符合熔断条件时,Sentinel会抛出DegradeException异常。

    以下是使用编码方式实现Sentinel熔断降级的一个示例:

    首先,你需要定义你的熔断降级规则。你已经提到你定义过熔断规则,假设你的规则是根据异常数量来触发熔断,你可以这样设置规则:

    public void initDegradeRules() {
        List<DegradeRule> rules = new ArrayList<>();
        DegradeRule rule = new DegradeRule();
        rule.setResource("testAbySphU");
        // 设置熔断策略,此处我们使用异常数来触发熔断
        rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);
        // 设置触发熔断的最小异常数
        rule.setCount(2);
        // 设置熔断持续时间
        rule.setTimeWindow(60);
    
        rules.add(rule);
        DegradeRuleManager.loadRules(rules);
    }
    

    然后在你的服务方法中,你可以通过编程的方式来处理资源,并捕获可能抛出的DegradeException异常:

    @GetMapping("/testA")
    public String testA() {
        initDegradeRules(); // 定义熔断规则
    
        try (Entry entry = SphU.entry("testAbySphU")) {
            // 开始定义资源
            return "服务访问成功------testA";
        } catch (DegradeException e) {
            // DegradeException 为熔断抛出的异常
            return "提醒您,testA 服务被熔断降级";
            // 熔断降级逻辑处理 - 开始
        } catch (BlockException e) {
            // BlockException 为其他类型的流控异常
            return "提醒您,testA 服务被限流";
            // 流控逻辑处理 - 开始
        } catch (Throwable e) {
            // 其他异常处理
            return "服务异常";
        }
    }
    

    在上述代码中,try语句块尝试进入一个Sentinel资源保护的区域,如果该资源被熔断降级,那么将会抛出DegradeException异常。我们通过捕获这个异常来执行降级逻辑。

    需要注意的是,你应该确保调用initDegradeRules()方法来初始化你的熔断规则,这个可以在应用启动的时候执行,而不是每次请求时都执行。

    你的思路是正确的,只是需要注意异常处理部分应该包含DegradeException来捕获熔断降级的情况。同时,需要注意的是,Sentinel的流控规则(FlowRule)和熔断降级规则(DegradeRule)是分开的,它们处理不同的情况,一个是针对流量过大进行限流,另一个是根据失败率或异常数进行熔断。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月29日
  • 已采纳回答 12月21日
  • 创建了问题 12月21日

悬赏问题

  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价