四、Sentinel控制台(二)流控规则介绍


流控规则

名词解释

  • 资源名:唯一名称,默认请求路径

  • 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)

  • 阈值类型/单机阈值:

    • QPS(每秒钟的请求数量):当调用该API的QPS达到阈值的时候,进行限流
    • 线程数:当调用该API的线程数量达到阈值的时候,进行限流
  • 是否集群:当前不需要集群

  • 流控模式:

    • 直接:API达到限流条件时,直接限流
    • 关联:当关联的资源达到阈值时,就限流自己
    • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)(API级别的针对来源)
  • 流控效果:

    • 快速失败:直接失败,抛异常

    • Wam Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFacotor,经过预热时长,才达到设置的QPS阈值

    • 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

规则

(1)直接-QPS直接失败案例

这里的意思就是我们现在单机阈值设定为1,代表的是当前这个接口只能被1秒访问一次,超过这个阈值,就会被Sentinel阻塞,现在默认为直接失败。

在这里插入图片描述

流控效果:

在这里插入图片描述

(2)直接-线程数直接失败案例

在这里插入图片描述

此时修改代码:

@GetMapping("/testA")
public String testA(){
    //暂停0.8秒
    try {
        TimeUnit.MILLISECONDS.sleep(800);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "-----testA";
}
测试方法:
方法一:双浏览器测试(F5刷新)

先快速刷新第一个浏览器

在这里插入图片描述

再快速刷新第二个浏览器,此时可以看到流控效果

在这里插入图片描述

方法二:postman测试

在这里插入图片描述

在这里插入图片描述

把数值修改为:

  • Iterations:为50
  • Delay:300

意思就是50个线程每间隔0.3秒访问一次

点击Run Sentinel, 此时我们来看网页中testA接口的流控效果

在这里插入图片描述

方法三:jemter测试

在这里插入图片描述

在这里插入图片描述

流控效果:

在这里插入图片描述

QPS和并发线程数规则详解:

在这里插入图片描述

(3)关联

​ 官方解释:当关联的资源达到阈值时,就限流自己。

​ 通俗解释来说,比如那我们的程序,现在有testA接口和testB接口,当A关联的资源B达到阈值后,限流A本身。换到程序里面来说比如一个电商系统中,支付系统达到阈值,就限流下订单系统。

在这里插入图片描述

在这里插入图片描述

流控效果:

在这里插入图片描述

(4)链路

链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流,它的功能有点类似于针对来源配置项,区别在于:针对来源是针对上级微服务,而链路流控是针对上级接口,也就是说它的粒度更细。

​ 比如在一个微服务中,两个接口都调用了同一个Service中的方法,并且该方法用SentinelResource(用于定义资源)注解标注了,然后对该注解标注的资源(方法)进行配置,则可以选择链路模式。

在这里插入图片描述

具体演示

首先我们编写一个Service

//service.TestService
@Service
public class TestService {
    // 定义限流资源
    @SentinelResource("common")
    public String common(){
        return "common";
    }
}

然后更改接口调用这个Service方法

@RestController
public class FlowLimitController {
    @Autowired
    TestService testService;
    
    @GetMapping("/testA")
    public String testA(){
        log.info(Thread.currentThread().getName()+": testA");
        return testService.common();
    }

    @GetMapping("/testB")
    public String testB(){
        return testService.common();
    }
}

让Sentinel 源码中 CommonFilter 中的 WEB_CONTEXT_UNIFY 参数为 false,将其配置为 false 即可根据不同的URL 进行链路限流,如果不配置将不会生效

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        # 配置Sentinel dashboard地址
        dashboard: localhost:8080
        # 默认8719端口,键入被占用会自动从8719+1,直到找到未被占用的端口
        port: 8719
      # 配置为false
      web-context-unify: false

这是因为从1.6.3 版本开始, Sentinel Web filter默认收敛所有URL的入口context

1.7.0 版本开始(对应Spring Cloud Alibaba的2.1.1.RELEASE),官方在引入了spring.cloud.sentinel.web-context-unify 参数,用于控制是否收敛context;将其配置为 false 即可根据不同的URL 进行链路限流。

在这里插入图片描述

web-context-unify 为true的时候,取到的是收敛的context名称sentinel_spring_web_context;为false的时候,就可以正确地取到/testA 资源名。

在这里插入图片描述

接下来配置流控规则:

这里要注意不要对/testA或者/testB进行限流规则的配置,要给用SentinelResource注解标注的资源进行配置限流规则,这里的意思为当我们用入口资源访问被SentinelResource注解标注的资源方法时,当超过阈值就会被限流。

最后这个时候我们再来频繁的访问testA接口,就会出现异常的情况,这也是流量效果快速失败在链路上的体现,是直接抛出异常。

在这里插入图片描述

然后访问testB接口,不受影响

在这里插入图片描述

(5)预热

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

使用场景:一般秒杀系统中会有这样的流控设置,为了防止秒杀瞬间造成系统崩溃。

在这里插入图片描述
在这里插入图片描述

默认coldFactor为3,当发起请求即请求QPS从(阈值/3)开始,经过多长预热时长才逐步升至设定的QPS阈值,当前阈值设置为10,预热时长设置为5秒。

​ 最终的效果,系统初始化时阈值/3约等于3,即阈值在此时为3,经过5秒后阈值才慢慢升高到10

流控效果(postman测试更直观):

在这里插入图片描述

(6)排队等待

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。

该方式的作用如下图所示:

在这里插入图片描述

这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

注意:匀速排队模式暂时不支持 QPS > 1000 的场景。

匀速器

​ 它的中心思想是,以固定的间隔时间让请求通过。当请求到来的时候,如果当前请求距离上个通过的请求通过的时间间隔不小于预设值,则让当前请求通过。否则,计算当前请求的预期通过时间,如果该请求的预期通过时间小于规则预设的 timeout 时间,则该请求会等待直到预设时间到来通过(排队等待处理);若预期的通过时间超出最大排队时长,则直接拒接这个请求。

在这里插入图片描述
在这里插入图片描述

流控效果(postman测试更直观):

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个基于YAML文件的Sentinel流控规则持久化配置示例: 1. 首先,在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>x.y.z</version> </dependency> ``` 其中,`x.y.z`为Sentinel版本号。 2. 在应用程序的`application.yml`文件中,添加以下配置项: ``` spring: cloud: sentinel: transport: dashboard: localhost:8080 # Sentinel控制台地址 datasource: ds1: nacos: server-addr: localhost:8848 # Nacos服务器地址 namespace: sentinel dataId: ${spring.application.name}-flow-rules # 规则文件ID groupId: DEFAULT_GROUP data-type: json ``` 其中,`ds1`为据源名称,`nacos`表示使用Nacos作为规则的持久化方式。`server-addr`表示Nacos服务器的地址,`namespace`表示Nacos的命名空间,`dataId`表示规则文件的ID,这里使用了`${spring.application.name}-flow-rules`作为规则文件ID,`${spring.application.name}`表示应用程序的名称。`groupId`表示规则文件所属的分组,默认为`DEFAULT_GROUP`。`data-type`表示持久化文件的格式,这里使用了JSON格式。 3. 在规则文件中添加流控规则规则文件的默认位置为Nacos服务器上的`dataId`所指定的规则文件路径。 ``` [ { "resource": "com.example.demo.DemoController:helloSentinel", // 资源名 "limitApp": "default", // 流控针对的调用来源,若为default则不区分调用来源 "grade": 1, // 限流阈值类型,0表示线程,1表示QPS "count": 10, // 限流阈值 "strategy": 0, // 限流控制行为,0表示直接拒绝,1表示Warm Up,2表示排队等待 "controlBehavior": 0, // 流控效果,0表示快速失败,1表示Warm Up,2表示排队等待 "clusterMode": false // 是否集群限流 } ] ``` 以上就是一个基于YAML文件的Sentinel流控规则持久化的配置示例。需要注意的是,在实际应用中,可以根据实际需求选择不同的持久化方式。同时,还需要根据实际业务场景设置合理的流控规则,以保证系统的稳定性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹峰的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值