spring-cloud-alibaba-3.2-Sentinel-控制规则

概览

在这里插入图片描述

流控规则

sentinel流控规则
在这里插入图片描述
资源名-resource

资源名,即限流规则的作用对象。

默认为RESTful请求的url地址, 也可以通过@SentinelResource指定

针对来源-limitApp

  • default:表示不区分调用者,来自任何调用者的请求都将进行限流统计。

  • {some_origin_name}:表示针对特定的调用者,只有来自这个调用者的请求才会进行流量控制。

  • other:表示针对除 {some_origin_name} 以外的其余调用方的流量进行流量控制。

    例如

    资源NodeA配置了一条针对调用者 caller1 的限流规则,

    同时又配置了一条调用者为 other的规则,

    那么任意来自 caller1NodeA 的调用,都不能超过 other 这条规则定义的阈值。

同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default

阈值类型

  • 并发线程数流量控制(RuleConstant.FLOW_GRADE_THREAD = 0):线程数限流用于保护业务线程数不被耗尽。

    例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下甚至导致线程池耗尽。为应对高线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢(线程池隔离),或者使用信号量来控制同时请求的个数(信号量隔离)。这种隔离方案虽然能够控制线程数量,但无法控制请求排队时间。当请求过多时排队也是无益的,直接拒绝能够迅速降低系统压力。

    Sentinel线程数限流不负责创建和管理线程池,而是简单统计当前请求上下文的线程个数,如果超出阈值,新的请求会被立即拒绝。

  • QPS流量控制(RuleConstant.FLOW_GRADE_QPS = 1): 当 QPS 超过某个阈值的时候,则采取措施进行流量控制。

  • 单机阈值count

流控模式-strategy

  • 直接(RuleConstant.STRATEGY_DIRECT = 0): 默认,根据调用方限流。

  • 关联(RuleConstant.STRATEGY_RELATE = 1): 当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。

    比如订单/order接口处理会依赖 支付/pay,当支付接口卡单时,需要限制订单接口的流量。

    在这里插入图片描述

  • 链路(RuleConstant.STRATEGY_CHAIN = 2): 只统计某些入口的流量。

    NodeSelectorSlot 中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。

    				   machine-root
                        /       \
                       /         \
                 Entrance1     Entrance2
                    /             \
                   /               \
          DefaultNode(nodeA)   DefaultNode(nodeA)
    

    通过如下配置,只统计Entrance1流入到nodeA的流量。
    在这里插入图片描述

流控效果-controlBehavior

流控效果,必须在阈值类型设置为QPS时有效,否则无效。

  • 直接拒绝(RuleConstant.CONTROL_BEHAVIOR_DEFAULT = 0

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

    公式: 冷加载因子(codeFactor 默认值为3),请求阈值从count/3开始,经过预热时长主键升到设定的QPS阈值

    如,秒杀系统,刚开始时大批量的请求过来,会将系统挤垮,通过预热时长后,才慢慢提升到设定的QPS.

  • 匀速器(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER =2): 严格控制请求通过的间隔时间漏斗算法,

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

熔断降级

熔断降级
在这里插入图片描述

降级策略

  • 平均响应时间 (DEGRADE_GRADE_RT):当资源的平均响应时间超过阈值之后,资源进入准降级状态。接下来如果持续进入5个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(之内,对这个方法的调用都会自动地返回(抛出 DegradeException),即熔断。

    • 超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx来配置。

    • sentinel断路器没有半开状态`,只有在时间窗口期结束后,关闭降级。

  • 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态。

    • 异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
  • 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。

热点规则

热点key

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制.

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
在这里插入图片描述

测试代码

@RequestMapping("/testHotKey")
@SentinelResource(value = "testHotKey" ,blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(required = false) String p1,@RequestParam(required = false)  String p2) {
    return "---- testHotKey";
}

public String deal_testHotKey(String p1, String p2, BlockException blockException) {
    return "deal_testHotKey";
}

配置
在这里插入图片描述

系统规则

系统自适应保护

在这里插入图片描述

系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口 QPS 和线程数四个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。

  • Load(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量由系统的 maxQps * minRt 计算得出。设定参考值一般是 CPU cores * 2.5
  • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0)。
  • RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

授权规则

来源访问控制(黑白名单)

很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的黑白名单控制的功能。黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
在这里插入图片描述

集群流量控制

为什么要使用集群流控呢?假设我们希望给某个用户限制调用某个 API 的总 QPS 为 50,但机器数可能很多(比如有 100 台)。这时候我们很自然地就想到,找一个 server 来专门来统计总的调用量,其它的实例都与这台 server 通信来判断是否可以调用。这就是最基础的集群流控的方式。

集群流量控制

Sentinel-控制台(集群流控管理)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值