Sentinel熔断限流组件,另附自己实现个类似功能小demo

首先基础操作,看完直接就能用,然后希望阿里改进的地方,并提issue,自己实现思路:

只简单介绍限流和异常降级,其他大同小异:

 

1.限流:

(1)非注解方式:

规则:

    @PostConstruct
    public void rule() {
        FlowRule rule1 = new FlowRule();
        rule1.setResource("call");
        rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //每秒只允许5个请求
        rule1.setCount(5);
        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule1);
        FlowRuleManager.loadRules(rules);
    }

业务代码:

     @GetMapping("test")
     public Object test() {
        Entry entry = null;
        try {
            //这里定义资源名,对应规则
            entry = SphU.entry("call");
            return "ok";
        } catch (BlockException e) {
            //触发限流进入这里
            return "限流了";
        } finally {
            //这里一定要释放
            if (entry != null) {
                entry.exit();
            }
        }
    }

(2)注解模式

定义熔断业务:

  //写在当前类中,或者其他类中,注解里要设置类
 public Object call(BlockException ex) {
        return "限流";
    }

业务:

    @SentinelResource(value = "call", blockHandler = "call")
    @GetMapping("test")
    public Object test() {
        return "ok";
    }

2.根据异常数量进行降级:

  @GetMapping("except")
    public Object t(Integer id) {
        Entry except = null;
        try {
            except = SphU.entry("except");
            if (id != null) {
                throw new RuntimeException();
            }
        } catch (DegradeException e) {
            return e;
        } catch (Exception e) {
            Tracer.trace(e);
        } finally {
            if (except != null) {
                except.exit();
            }
        }
        return "ok";
    }

    @PostConstruct
    public void rule() {
        DegradeRule rule = new DegradeRule();
        rule.setResource("except");
        rule.setCount(2);
        rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);
        rule.setTimeWindow(61);
        List<DegradeRule> rules = new ArrayList<>();
        rules.add(rule);
        DegradeRuleManager.loadRules(rules);
    }

 

 

     设想,如果使用到注解,那么在注解value是必须写的,这样资源名就写死了.如果有个公用方法,能不能想办法根据参数去更加细粒度的限流等其他操作呢;

    其实只要在SentinelResourceAspect入手,这是个aop操作类,然后增加@SentinelResource注解参数,支持通过参数动态埋点,做到细粒度;

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sentinel熔断降级限流是一种用于保护应用程序的机制,它可以防止应用程序不断执行可能失败的操作,并快速拒绝可能导致错误的调用。熔断降级规则是熔断降级机制的核心属性之一。\[1\] 熔断降级规则的配置可以通过在应用程序中设置相关属性来实现。例如,在Spring Cloud中,可以通过配置`spring.cloud.sentinel.transport.dashboard`属性来指定Sentinel控制台的地址,以及通过`management.endpoints.web.exposure.include`属性来开放管理端点。\[2\] 熔断降级机制的作用是在感知到下游服务的资源出现不稳定状态时,暂时切断对下游服务的调用,而不是一直阻塞等待服务响应。这样可以防止级联失败导致的雪崩效应,并保证系统的可用性。在微服务架构下,熔断降级机制尤为重要,可以保护后端不会过载。\[3\] 熔断降级规则包含一些核心属性,可以根据具体需求进行配置。这些属性包括但不限于超时时间、异常比例、最小请求数等。当资源被熔断降级后,在降级时间窗口内,对该资源的调用会自动返回降级数据。当检测到该节点的服务调用响应正常后,熔断机制会恢复调用链路。\[3\] 总结来说,Sentinel熔断降级限流是一种保护应用程序的机制,通过设置熔断降级规则来防止应用程序执行可能失败的操作,并在下游服务资源不稳定时暂时切断对下游服务的调用。这样可以防止级联失败导致的雪崩效应,并保证系统的可用性。熔断降级规则包含一些核心属性,可以根据具体需求进行配置。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [sentinel 限流熔断神器详细介绍](https://blog.csdn.net/a745233700/article/details/122733366)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Sentinel服务流控、熔断和降级](https://blog.csdn.net/m0_49183244/article/details/124273538)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值