sentinel的四种流控规则介绍

今天的内容我们主要围绕四个点进行展开介绍。

  • 流控模式 :关联、链路
  • 流控效果 :Warm Up、排队等待

这四点具体是什么意思呢?

首先启动项目:cloud-alibaba-sentinel-8006

一:关联

在官方的介绍中是这样说的:关联的资源达到阈值时,就限流自己。

这句话是什么意思呢?用比较直白一点的话来讲,假设我们有A和B两个接口,当A关联B接口,同时B接口的资源达到设定的阈值时,限流A。我们也可以理解成,当我们下游的服务出现访问压力过大时,对上游的服务进行拦截和限流操作,例如:电商系统,当我们订单系统超出承受阈值时,对我们支付模块进行限流。

例如:当我们关联order接口达到我们设定的阈值时,限流pay的接口访问。

@Slf4j
@RestController
public class TestController { @GetMapping("/pay")
public String pay() {
return "hello my name is pay ,wo shi boy";
} @GetMapping("/order")
public String order(){
return "hi my name is order, me is girl";
} }

给pay接口添加流控规则

在这里我们需要使用到postMan工具,来模拟并发访问,用它来测试我们的order接口的并发访问。

在这里的意思是25个线程0.25秒跑一次,当我们跑起来之后,再去访问pay接口就可以看到以下信息

当我们对order接口进行并发访问的时候,这个时候我们去访问pay接口,就可以看到pay接口返回限流信息

二:链路

链路的意思是值当某个接口过来的资源达到阈值时,开启限流,主要是针对于请求来源的微服务,具有更细颗粒度。

比如在一个服务应用中,多个(pay和order)接口都调用了同一个服务中的方法(该方法必须使用注解 SentinelResource进行修饰),如果频繁的去请求pay接口,并且达到设定的阈值,这么时候我们再去请求order接口,那么调用了同一服务的order接口就会被限流

test类

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

controller类

@Slf4j
@RestController
public class TestController { @Autowired
private TestService testService; @GetMapping("/pay")
public String pay() {
return testService.end();
} @GetMapping("/order")
public String order(){
return testService.end();
} }

配置项web-context-unify,这个配置的意思是说根据不同的URL进行链路限流,否则没有效果

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

我们访问pay接口和order接口后,需要对end进行流控规则的配置,也就是使用了SentinelResource注解标注的方法进行流控设置。

那么这个时候如果我们频繁的去访问order接口的时候,就会出现异常的情况,直接抛出错误提示,这个也是因为快速失败在链路上的直接体现

三:Warm Up

参考文档:https://sentinelguard.io/zh-cn/docs/flow-control.html

Warm Up 流量控制,也叫预热或者冷启动方式,会根据我们设定的规则,进行缓慢的流量放开,逐渐增加阈值上限,给系统一个反应时间,避免流量的突然增加,将系统压垮的情况发生,主要用于预防我们系统长期处于稳定的流量访问下,突然流量的增加,将系统资源直接拉满的情况.

在这里我们主要弄明白两个参数

单机阈值:12,这个表示我们访问最大阈值为12,但是第一次最大访问量为4,为什么是4呢,看下面公式

预热公式:阈值/coldFactor(默认值为3),经过预热时间后才会达到阈值。

预热时长:5 ,也就是说我们的请求会在五秒内单机阈值达到12的访问,比如第一次为4,后续在五秒内依次5/6/8/10,最后达到12的阈值

一般这种在秒杀或者电商节中会设置这样的流控规则,就是为了防止突然流量的增加导致系统的奔溃。

当我们设置完流控规则以后,我们就来看一下效果,我们刚才设置的order的接口,如果当我们在频繁的去访问order接口的时候,如果超过当前时间设定的阈值时,直接返回限流信息。

在这里我们直接用浏览器疯狂的去刷新,是时候体验单身二十几年的手速了,当然也可以使用postman接口去试,我们这边手速比较快,直接用浏览器刷新,我们可以看到下面的曲线图:

蓝色表示你拒绝的QPS,绿色表示通过的QPS,我们可以看到蓝色成明显的下降趋势,而绿色成上升趋势,也可以通过右边的表格中看到,刚开始通过的只有四个,具体的有三个,后面通过慢慢增加,拒绝慢慢变少,这个就是我们Warm Up(预热)的作用了

四:排队等待

我们现在来介绍最后一个流控规则的使用,排队等待会严格控制请求通过的间隔时间,让请求稳定且匀速的通过,可以用来处理间隔性突发的高流量,例如抢票软件,在某一秒或者一分钟内有大量的请求到来,而接下来的一段时间里处于空闲状态,我们希望系统能够在接下来的空余时间里也能出去这些请求,而不是直接拒绝。

以固定的间隔时间让请求通过,当请求过来的时候,如果当前请求距离上一个请求通过的时间大于 规则预设值 ,则请求通过,如果当前请求预期通过时间小于 规则预设值 ,则进行排队等待,如果预期通过时间超过最大排队时间,直接拒绝请求。

Sentinel排队等待是 漏铜算法+虚拟队列机制实现的,目前排队等待中不支持QPS>1000的场景

我们对pay接口进行设置,一秒钟只处理一个QPS请求,其他的排队,如果超过15秒则直接拒绝

pay接口调整,这里我们给pay接口加上打印日志,方便我们看到具体效果

    @GetMapping("/pay")
public String pay() {
// return "hello my name is pay ,wo shi boy";
log.info("pay接口,请求线程为:"+Thread.currentThread().getName());
return testService.end();
}

我们借助postman来进行调用,说明手速始终更不上工具,还是工具香,这里我们设置10个请求,没有间隔时间

从下图中我们可以看到,对于我们的请求,是一个QPS请求。

小结:流控规则就是针对不同的规则进行不同的设定,来满足我们不用业务场景。

sentinel的四种流控规则介绍的更多相关文章

  1. 线上应用接入sentinel的第一个流控规则

    sentinel接入第1个应用A以及控制台,已经上线一段时间了,本周接入了第2个应用B: 因为测试同学只有几个,没有压测团队.测试平台.. 各接口能承载的最大qps不确定 ,接入的应用暂时都没有配置规 ...

  2. Sentinel源码解析四(流控策略和流控效果)

    引言 在分析Sentinel的上一篇文章中,我们知道了它是基于滑动窗口做的流量统计,那么在当我们能够根据流量统计算法拿到流量的实时数据后,下一步要做的事情自然就是基于这些数据做流控.在介绍Sentin ...

  3. Sentinel Dashboard(基于1.8.1)流控规则持久化到Nacos——涉及部分Sentinel Dashboard源码改造

    前言 之前虽然也一直在使用sentinel实现限流熔断功能,但却没有好好整理之前看的源码与资料,今天有时间将之前自己整理过的资料写成一篇博文,或者是是一篇关于Sentinel(基于目前最近版本1.8, ...

  4. sentinel流控规则校验之源码分析

    前言: 上节给大家把sentinel流控整个执行大致过了,但涉及到最核心的流控算法还没有讲,先提前说明一下 sentinel用的流控算法是令牌桶算法,参考了Guava的RateLimiter,有读过R ...

  5. Sentinel之流控规则

    在上文Sentinel流量防卫兵中讲到了Sentinel入门以及流控规则一小部分,而Sentinel还有以下规则: 熔断降级规则 热点参数规则 系统规则 黑白名单规则 本文要讲的是流控规则 流量控制规 ...

  6. 什么!Sentinel流控规则可以这样玩?

    项目源码地址:公众号回复 sentinel,即可免费获取源码 前言 上一篇文章中,我们讲解了关于sentinel基本介绍以及流控规则中直接和快速失败的效果,有兴趣的可以去看上一篇文章,今天,我们给大家 ...

  7. SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储

    前言 Sentinel 原生版本的规则管理通过API 将规则推送至客户端并直接更新到内存中,并不能直接用于生产环境.不过官方也提供了一种 Push模式,扩展读数据源ReadableDataSource ...

  8. Sentinel流控规则

    流控规则 注:Sentinel的监控页面一开始是没有东西,需要对监控的服务发起请求后才会出现 资源名:唯一名称,默认请求路径 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,指定对哪个 ...

  9. Spring Cloud alibaba网关 sentinel zuul 四 限流熔断

    spring cloud alibaba 集成了 他内部开源的 Sentinel 熔断限流框架 Sentinel 介绍 官方网址 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentine ...

随机推荐

  1. Python基础之字符串和编码

    字符串和编码 字符串也是一种数据类型,但是字符串比较特殊的是还有个编码问题. 因为计算机自能处理数字,如果徐娅处理文本,就必须先把文本转换为数字才能处理,最早的计算机子设计时候采用8个比特(bit)作 ...

  2. 面试突击73:IoC 和 DI 有什么区别?

    IoC 和 DI 都是 Spring 框架中的重要概念,就像玫瑰花与爱情一样,IoC 和 DI 通常情况下也是成对出现的.那 IoC 和 DI 什么关系和区别呢?接下来,我们一起来看. 1.IoC 介 ...

  3. 倒计时0日!Apache DolphineScheduler4月 Meetup 大佬手把手教你大数据开发,离线调度

    随着互联网技术和信息技术的发展,信息的数据化产生了许多无法用常规工具量化.处理和捕捉的数字信息.面对多元的数据类型,海量的信息价值,如何有效地对大数据进行挖掘分析,对大数据工作流进行调度,是保障企业大 ...

  4. flutter系列之:flutter架构什么的,看完这篇文章就全懂了

    目录 简介 Flutter的架构图 embedder engine Flutter framework Widgets Widgets的可扩展性 Widgets的状态管理 渲染和布局 总结 简介 Fl ...

  5. C++中的cout.setf(ios::fixed)是什么意思?

    问题描述:在阅读一段代码时,发现代码的最后一部分出现 ... cout.setf(ios::fixed); cout.setf(ios::showpoint); ... 解决: cout.setf() ...

  6. 事物的隔离性和MVCC

    事物的隔离性 mysql的服务端是支持多个客户端同时与之连接的,每个客户端可能还并发了好几个连接,所以mysql是需要同时处理很多事情的,每一件独立的事情就叫做事务.我们知道事务有一个叫隔离性的特性, ...

  7. 【java】学习路径28-Java集合类知识点总结+练习题(去重)

    Java集合 1.集合和数组的区别 (1)  集合可以改变长度 (2)  数组长度不可变 2.ArrayList (1)  add addAll (2)  remove removeAll (3)   ...

  8. Python 第五次实验

    [1] (程序设计)编写程序,将二维列表数据写入 CSV文件(命名为"out.csv"),用逗号隔开.二维列表如下:[['Name','Age','Gender'], ['Bob' ...

  9. tar、gzip、zip、jar是什么,怎么查看?

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 如果你是后端程序员,我想你一定见过*.tar.gz.*.zip.*.jar后缀的文件吧,这些都是压缩文件,那这些文 ...

  10. Java中的Optional

    在我们日常的开发中,我们经常会遇到 NullPointerException.如何才能优雅的处理NPE?这里告诉大家一个较为流行的方法 java.util.Optional 使用Optional来修饰 ...