• sentinel简单限流和降级demo问题记录


    问题记录

    1. 下载sentinel-dashboard,使用命令行启动之后,控制台页面可以正常访问,但是我在项目配置文件加上配置:
    spring.cloud.sentinel.transport.port=8719
    spring.cloud.sentinel.transport.dashboard=localhost:9090
    
    • 1
    • 2

    然后一直刷新控制台页面,也没有出现我注册的服务。

    解决方法:sentinel-dashboard默认的是懒加载模式,需要在项目中加上sentinel-dashboard配置后,访问下注册的服务,再刷新控制台页面就可以了。

    1. 在测试sentinel并发线程数控制的时候,规则中我设置的是4个:
     List<FlowRule> rules = new ArrayList<>();
            FlowRule rule = new FlowRule();
            rule.setResource(RESOURCE_KEY);
            rule.setCount(4);
            rule.setGrade(RuleConstant.FLOW_GRADE_THREAD);
            rule.setLimitApp("default");
            rules.add(rule);
            FlowRuleManager.loadRules(rules);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    原本我以为是一秒钟之内只能让4个线程通过,但是打印结果却不是这样,而是有时候:

    在这里插入图片描述

    解决方法:sentinel是对当时访问资源的线程数做限制,也就是当访问资源的运行时线程数超过设定的阈值后,就会采取设定的策略,直接拒绝或者是其他的,默认是直接拒绝;但是当有访问资源的线程生命周期结束了,就可以放行新的请求,因为我的资源方法没有耗时操作也没有加睡眠等待操作所以很快就结束了,所以就可以有新的线程访问资源。

    在这里插入图片描述

    在写并发线程控制数的案例的时候,刚开始我是上图那么写的,但是打印结果很出乎意料,因为我设置的阈值是4,但是thread变量和set的长度都是明显大于4的。

    解决方式:把下面红色框,也就是testSleep下面那三行,给放到 entry != null 的if判断里面之后,打印结果就对了。因为正常一个访问资源的线程通过后,走完finally块,再去走testSleep下面那三行,因为这个时候这个线程已经访问完资源,所以下一个线程可以继续访问,但是因为这个线程在sleep中的500毫秒中,其他9个线程是可以访问的,并且很快,所以set就进行了很多次add操作,500毫秒之后才会进行remove操作,所以set.size()的值会在500毫秒内趋近于10,然后再减一个。thread也是同理。

    1. 在写冷启动测试案例的时候,规则设置如下:
            List<FlowRule> rules = new ArrayList<>();
            FlowRule warmUpRule = new FlowRule();
            warmUpRule.setResource(RESOURCE_KEY);
            warmUpRule.setCount(3);
            warmUpRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
            warmUpRule.setLimitApp("default");
            warmUpRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP);
            warmUpRule.setWarmUpPeriodSec(10);
            rules.add(warmUpRule);
            FlowRuleManager.loadRules(rules);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    并且我访问资源的线程只创建了3个,原本我预想,应该是没有限流的,但是打印结果却不是这样:

    在这里插入图片描述

    block总是有值的,有时候是1有时候是2,我就一直不能理解,我设置的阈值上线是3,应该都可以访问的。

    解决方法:后来我想到我设置的warmUpRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)这个代码,应该是设置为冷启动,而冷启动在官方文档的解释是:

    该方式主要用于系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮的情况。

    所以我想是不是:虽然只有3个访问资源的线程,但是冷启动每次增加的流量是1,所以每次都会有限流的。

    之后改了下代码之后,发现打印结果就想得通了:

    在这里插入图片描述

    每秒通过的流量大体上是增加的(不知道为啥会出来个4),一直增加到我设置的阈值(10),就稳定了。

    怎么增加的不重要,重要的是确实流量是缓慢增加趋近于阈值

    1. 好像setStrategy和setControlBehavior不能一起用,我一起配置了之后就出现了问题:

    在这里插入图片描述

    我设置的阈值是10,但是pass的值每次都是大于10的。

    解决方法: 不一起配置。

    1. 在写异常比例降级demo的时候,刚开始我的代码是这样的:

    在这里插入图片描述

    解决方法: 我是没有捕获BlockException之外的异常的,就发现控制台打印的结果表明发生异常之后,就处于降级的状态,但是我设置了熔断时长是10s,应该10s之后放行一个的,但是一直到结束,total,pass,block都是0;
    后来我试了下捕获异常,发现结果就可以了。

  • 相关阅读:
    SwiftUI SQLite数据库存储使用教程大合集(2022年版)
    掌握雅思写作:任务 2(在 7 小时内达到 7+ 级)
    亚马逊云科技Glue
    NB的Github项目,看到最后一个我惊呆了!
    数据治理-数据治理相关范围
    SAP UI5 Form 表单的 Responsive Grid Layout 布局中的 breakpoint
    【docker】Dockerfile
    【Kotlin】OkHttp框架实现网络下载
    阿里云双11优惠:云服务器1年99元,新老同享,续费同价!
    latex cite命令、款式
  • 原文地址:https://blog.csdn.net/ZRL1996/article/details/125455045