流控规则

  

  注:Sentinel的监控页面一开始是没有东西,需要对监控的服务发起请求后才会出现

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

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

  • 阈值类型/单机阈值:

    • QPS(每秒钟的请求数量):当调用该接口的QPS达到了阈值的时候,进行限流;

    • 线程数:当调用该接口的线程数达到阈值时,进行限流

  • 是否集群:不需要集群

  • 流控模式:

    • 直接:接口达到限流条件时,直接限流

    • 关联:当关联的资源达到阈值时,就限流自己

    • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就可以限流)[api级别的针对来源]

  • 流控效果

https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6#%E5%9F%BA%E4%BA%8Eqps%E5%B9%B6%E5%8F%91%E6%95%B0%E7%9A%84%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6

  • 直接快速失败

  QPS(每秒钟请求的数量):当调用该接口的QPS达到阈值的时候,进行限流

  

  直接快速失败的效果:

  

  • 线程数

  

  当请求A过来访问该接口,该请求处理的很慢,还没有返回数据;此时请求B也过来访问该接口,这个时候处理请求B需要额外开启一个线程,请求B则会报错;

  效果如下:

  

流控模式

  • 直接模式

  Sentinel的流控模式代表的流控的方式,默认【直接】;
  上面的/testA接口的流控,QPS单机阀值为1,代表每秒请求不能超出1,要不然就做流控处理,处理方式直接调用失败;
  调用/testA,慢一点请求,正常返回;快速请求几次,超过阀值;接口返回了Blocked by Sentinel (flow limiting),代表被限流了

  • 关联模式

  

  设置效果:当关联资源/testB的QPS阈值超过1时,就限流/testA的Rest的访问地址,当关联资源到资源阈值后限制配置好的资源名

  关联通俗点说就是,当关联的资源达到阀值,就限流自己;

  应用场景: 比如支付接口达到阈值,就要限流下订单的接口,防止一直有订单

  • 链路模式

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

  如下:

  1.编写一个service

@Service
public class OrderServiceImpl implements OrderService { @Override
@SentinelResource(value = "getOrder", blockHandler = "handleException")
public CommonResult getOrder() {
return new CommonResult(0, String.valueOf(new Random().nextInt()));
} public CommonResult handleException(BlockException ex) {
return new CommonResult(-1,
ex.getClass().getCanonicalName() + "\t服务不可用");
}
}

  

  2.在Controller声明两个方法

@Autowired
private OrderService orderService; @GetMapping("/test1")
public CommonResult test1() {
return orderService.getOrder();
} @GetMapping("/test2")
public CommonResult test2() {
return orderService.getOrder();
}

  

  当流控规则配置了流控模式为链路时,发现当访问/test1/test2接口都不能进行限流;

  

  

  注意:

  从1.6.3 版本开始, Sentinel Web filter默认收敛所有URL的入口context,因此链路限流不生效; ​

  1.7.0 版本开始(对应Spring Cloud Alibaba的2.1.1.RELEASE),官方在CommonFilter 引入了WEB_CONTEXT_UNIFY 参数,用于控制是否收敛context;将其配置为 false 即可根据不同的URL 进行链路限流; [https://github.com/alibaba/Sentinel/issues/1213]

  

@Configuration
public class FilterContextConfig {
@Bean
public FilterRegistrationBean sentinelFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new CommonFilter());
registration.addUrlPatterns("/*");
// 入口资源关闭聚合
registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false");
registration.setName("sentinelFilter");
registration.setOrder(1);
return registration;
}
}

  

  

  关于新版本web-context-unify不起作用,参考[https://github.com/alibaba/Sentinel/issues/1313]

流量效果

  • 预热 Warm Up

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

  [https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6#warm-up]

  根据codeFactor(冷加载因子,默认为3)的值,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值 ;

   

  

  系统初始化的默认阈值为10 / 3,即为3,也就是刚开始的时候阈值只有3,当经过5s后,阈值才慢慢提高到10;

  源码:com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController

  应用场景:秒杀系统的开启瞬间,会有很多流量上来,很可能会把系统打挂,预热方式就是为了保护系统,可以慢慢的把流量放进来,慢慢的把阈值增长到设定值;

  • 排队等待

  匀速排队,让请求以均匀的速度通过,阈值类型必须设置成QPS,否则无效;

  

  

  设置的含义:/testA每秒1次请求,QPS大于1后,再有请求就排队,等待超时时间为20000毫秒;

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

  源码:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

  [https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6#%E5%8C%80%E9%80%9F%E6%8E%92%E9%98%9F]

Sentinel流控规则的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. Sentinel之流控规则

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

  7. sentinel的四种流控规则介绍

    sentinel的四种流控规则介绍 今天的内容我们主要围绕四个点进行展开介绍. 流控模式 :关联.链路 流控效果 :Warm Up.排队等待 这四点具体是什么意思呢? 首先启动项目:cloud-ali ...

  8. Sentinel流控与熔断

    参考: https://thinkwon.blog.csdn.net/article/details/103770879 项目结构 com.guo     ├── guo-sentinel       ...

  9. 微服务架构 | 5.4 Sentinel 流控、统计和熔断的源码分析

    目录 前言 1. Sentinel 的自动装配 1.2 依赖引入 1.3 SentinelWebAutoConfiguration 配置类 1.4 CommonFilter 过滤器 1.5 小结 2. ...

随机推荐

  1. 分布式系统监视zabbix讲解六之自定义监控项

    概述 Zabbix支持许多在多种情况下使用宏.宏是一个变量,由如下特殊语法标识: {MACRO} 根据在上下文中, 宏解析为一个特殊的值. 有效地使用宏可以节省时间,并使Zabbix变地更加高效. 在 ...

  2. 虚拟机系列 | JVM特点,基础结构与执行周期

    本文源码:GitHub·点这里 || GitEE·点这里 一.虚拟机简介 1.虚拟机概念 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整 ...

  3. Mybatis接口Mapper内的方法为啥不能重载吗?

    动态代理的功能:通过拦截器方法回调,对目标target方法进行增强. 言外之意就是为了增强目标target方法.上面这句话没错,但也不要认为它就是真理,殊不知,动态代理还有投鞭断流的霸权,连目标tar ...

  4. python自动保存百度网盘资源,一定要看

    觉得有帮助的别忘了关注一下知识图谱与大数据公众号 开始 在上一文中,我们保存了百度云盘的地址和提取码,但是这种分享链接很容易被屏蔽,最好的做法就是保存资源到自己的网盘,不过采集的链接有上万个,人肉保存 ...

  5. JAVA并发编程--Condition

    Condition主要是为了在J.U.C框架中提供和Java传统的监视器风格的wait,notify和notifyAll方法类似的功能. AQS等待队列与Condition队列是两个相互独立的队列 a ...

  6. Java基础——缓存

    1.缓存 将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度 以目前的系统架构来说,用户的请求一般会先经 ...

  7. CS:APP配套实验 Data Lab

    刚刚完成注册博客,想写一篇随笔,方便以后自己回顾.如果恰好也能帮助到你,是我的荣幸. 这次随笔是记载我的计算机系统(CS:APP,Computer Systems:A Programer's Pers ...

  8. Python self用法详解

    在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数.例如,定义一个 Person 类: class Person: def __init ...

  9. c++ 中预编译头文件名 pch.h

    转载:https://www.it-swarm.asia/zh/c++/%e6%88%91%e5%8f%af%e4%bb%a5%e4%bd%bf%e7%94%a8includepchh%e2%80%9 ...

  10. Unicode和多字节字符集

    今天自己写的发现一个输出路径程序使用unicode字符集只能输出单个的首字符,问了一下同事,改为使用多字节字符集,问题解决了 于是上网看了他们的区别:  很多没看完,但起码了解到字符集的演变过程, 转 ...