Sentinel 规则详解

Sentinel 规则

  • 流控规则 flow
    • 1、QPS流控
    • 2、并发线程数流控
    • 3、流控模式
    • 4、流控效果
  • 熔断(降级)规则 degrade
    • 1、慢调用比例
    • 2、异常比例
    • 3、异常数
  • 热点规则 param-flow
  • 授权规则 authority
    • 1、应用场景
    • 2、自定义来源
    • 3、授权规则配置
  • 系统规则

前言:
Sentinel 服务容错简介
Doker安装与整合Spring cloud alibaba
作用在资源之上,定义以什么样的方式保护资源,主要包括流量控制规则、熔断降级规则、热点规则以及系统保
护规则。本质就是用来定义如何进行保护资源。

流控规则 flow

  • 流量控制,其原理是监控应用流量的 QPS(每秒查询率) 或 并发线程数 等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。它是针对服务提供方进行设置的。
    在这里插入图片描述

一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:

  • resource :资源名,即限流规则的作用对象
  • limitApp : 流控针对的调用来源,若为 default 则不区分调用来源
  • grade : 限流阈值类型(并发线程数 或 QPS)
  • count : 限流阈值
  • strategy : 调用关系限流策略(直接,关联,链路)
  • controlBehavior : 流量控制效果(快速失败、Warm Up、匀速排队)
    在这里插入图片描述

流量控制主要有两种统计类型,一种是统计并发线程数,另外一种则是统计 QPS(访问数)。类型由 FlowRule 的grade 字段来定义。其中0 代表根据并发数量来限流,1 代表根据 QPS 来进行流量控制。其中线程数、QPS 值,都是由 StatisticSlot 实时统计获取的。
超出流控限制后便会报错(可通过代码更改报错信息)
在这里插入图片描述

1、QPS流控

  • grade 字段为1,根据对资源的访问次数进行流控。

2、并发线程数流控

  • 并发数控制用于保护业务线程池不被慢调用耗尽。
  • 假设线程数设置为1,当一个线程请求时,如果还没有响应的情况下,另一个线程又进来访问,则这些请求都会排除在外,直到响应后再处理下一个线程。
  • 例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下甚至导致线程池耗
    尽。
    • 为应对太多线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢(线程池隔离)。这种隔离方案虽然隔离性比较好,但是代价就是线程数目太多,线程上下文切换的 overhead 比较大,特别是对低延时的调用有比较大的影响。
  • Sentinel 并发控制不负责创建和管理线程池,而是简单统计当前请求上下文的线程数目(正在执行的调用数目),如果超出阈值,新的请求会被立即拒绝,效果类似于信号量隔离。并发数控制通常在调用端进行配置。

3、流控模式

  • 直接:接口达到限流条件时,开启限流。即只对指定的接口进行流控。也是默认的模式。
  • 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流。
    • 当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。
    • 比如对数据库同一个字段的 读操作和写操作 存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢。
    • 为读操作增加关联流控关联写操作,这样写操作的次数也会被统计在读操作流控中,而对于写操作本身没有任何影响。
  • 链路:统计从指定上级接口链路访问到本资源的请求,触发阈值时,对指定链路限流。
    • 例如,OrderController 控制器类中的 message1 和 message2 这两个方法都会调用 Service 中的 message 方法,这时就可以针对这两个链路的 message资源 进行限流了。
    • 注意:
      • Service 中的 message 方法需要用 @SentinelResource 注解指定资源名(或异常处理函数,因为不会走统一异常处理)
      • Sentinel 1.7 版本后,Sentinel默认会将Controller方法做context收敛,导致链路模式的流控失效,
        需要添加配置:
spring.cloud.sentinel.webContextUnify=false # 关闭context收敛

在这里插入图片描述

4、流控效果

所谓流控效果,是指当服务被流控了,以什么样的效果去处理。在 Sentinel 中,内置了以下三种处理方式:

  • 快速失败(默认): 是默认的流量控制方式,当超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException 。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。
  • Warm Up(预热):即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在预热时长内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
    • 冷加载因子:codeFactor 默认是3,即请求 QPS 从 count / 3 开始,经预热时长逐渐升至设定的 count 阈值 。
    • 需要设置 预热时长(秒)
  • 排队等待:会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。
    • 需要设置 超时时长(毫秒)
    • 让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。

熔断(降级)规则 degrade

熔断规则就是设置当满足什么条件的时候,对服务进行降级
它通常是在服务消费端来进行配置。
熔断降级规则(DegradeRule)包含下面几个重要的属性:

Field说明默认值
resource资源名,即规则的作用对象
grade熔断策略,支持慢调用比例/异常比例/异常数策略慢调用比例
count慢调用比例模式下为 慢调用临界 RT(超出该值计为慢调用)异常比例/异常数模式下为 对应的阈值
timeWindow熔断时长,单位为 sminRequestAmount
熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)5
statIntervalMs统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0引入)1000m
sslowRatioThreshold慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

1、慢调用比例

  • 选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(最大响应时间 毫秒),请求的响应时间大于该值则统计为慢调用。
  • 当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。
  • 经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若下一个请求响应时间小于设置的慢调用 RT 则结束熔断,否则会再次被熔断。
    在这里插入图片描述

2、异常比例

  • 当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。
  • 经过熔断时长后熔断器会进入探测恢复状态(HALFOPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0] ,代表0% - 100%。
    在这里插入图片描述

3、异常数

  • 当单位统计时长内的异常数目超过阈值之后会自动进行熔断。
  • 经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
  • 注意:异常降级 仅针对业务异常 ,对 Sentinel 限流降级本身的异常( BlockException )不生效。

在这里插入图片描述

热点规则 param-flow

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

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制

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

  • Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。

  • 热点参数规则(ParamFlowRule )类似于流量控制规则(FlowRule ):

属性说明默认值
resource资源名,必填
count限流阈值,必填
grade限流模式QPS 模式
durationInSec统计窗口时间长度(单位为秒),1.6.0 版本开始支持1s
controlBehavior流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持快速失败maxQueueingTimeMs
sparamIdx热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置paramFlowItemList参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。 仅支持基本类型和字符串类型
clusterMode是否是集群参数流控规则false
clusterConfig集群流控相关配置
  • 注意:要实现热点参数规则,必须使用 @SentinelResouce 注解来指定资源,否则热点规则将不会生
    效。
@GetMapping("/message1")
@SentinelResource(value = "messages1", blockHandler = "hotBlock")
public String message1(Integer id) throws Exception {return "message1" + id;
}
public String hotBlock(Integer id, BlockException e) {return "热点规则限流....";
}
  • 先添加热点规则
    在这里插入图片描述

  • 可以在热点规则里添加 参数例外项(对指定参数进行额外处理)
    在这里插入图片描述

授权规则 authority

  • 很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。
  • 来源访问控制根据资源的请求来源(origin)限制资源是否通过
    • 若配置白名单则只有请求来源位于白名单内时才可通过;
    • 若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
  • 来源访问控制规则( AuthorityRule )非常简单,主要有以下配置项:
    • resource :资源名,即限流规则的作用对象。
    • limitApp :对应的 黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB 。
    • strategy :限制模式, AUTHORITY_WHITE 为白名单模式, AUTHORITY_BLACK 为黑名单模式,默认为白名单模式。

1、应用场景

  • 假设有三个微服,分别为 A、B 和 C。而 A 和 B 都会访问 C。如果希望 A 可以访问 C,而 B 不能访问
    C,则可以进行授权规则配置来实现。
    在这里插入图片描述

  • 流控应用:是来源标识,Sentinel 提供了 RequestOriginParser 接口来处理来源。只
    要 Sentinel 保护的接口资源被访问,Sentinel 就会调用 RequestOriginParser 的实现类去解析访问来源。

2、自定义来源

  • 区分来源,本质是从 request 作用域中获取参数,交给流控应用处使用。
  • 在 微服中创建一个 config 包,并在这个包下新建一个
    类(例如 RequestOriginParserDefinition),并让这个类实现 Sentinel 提供的
    RequestOriginParser 接口,并添加注解注入Spring,然后重写 parseOrigin 方法即可。
@Configuration
public class RequestOriginParserDefinition implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest request) {return request.getParameter("serverName");}
}

3、授权规则配置

  • 启动微服务,浏览器正常访问接口,在url地址后添加?serverName=来源,例如:
    http://localhost:8072/order/message1?serverName=pc
  • 然后再 Sentinel 客户端中添加授权即可。

系统规则

  • 系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和 并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
  • 系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量 (进入应用的流量) 生效。
  • Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统
    保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores *2.5 。
  • CPU 使用率(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到 阈值 即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到 阈值 即触发系统保护。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28145.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitLab 私有 Go Modules 的搭建配置

配置步骤 配置 GitLab Access Token 将 GitLab Access Token 写入到 ~/.netrc 文件里(也就是根目录下的 .netrc 文件),没有则新建,并写入内容:machine git.tenorshare.cn login ${USER_NAME} password ${GITLAB_ACCESS_TOKEN},其中 ${USER_NAME} 是GitLab 用户名,${GIT…

【Java基础教程】(十八)包及访问权限篇 · 下:Java编程中的权限控制修饰符、单例设计模式 (Singleton)和多例设计模式的综合探析~

Java基础教程之包及访问权限 下 本节学习目标1️⃣ 访问控制权限2️⃣ 命名规范3️⃣ 单例设计模式 (Singleton)4️⃣ 多例设计模式 本节学习目标 掌握Java 中的4种访问权限;掌握Java 语言的命名规范;掌握单例设计模式与多例设计模式的定义结构&#x…

Java处理doc类型的Word文档转换成html(按顺序保留格式+图片)

最新有个新需求,就是doc文档转换html内容倒不是很难,给大家分享一下,总体思路就是按doc转html的思路来走,唯一缺点是不会自动转换图片,图片是要手动转成base64,默认是有html、body、head、meta等等标签&…

2023四大进销存软件推荐,第一款适合中小商户使用!

在当今竞争激烈的商业环境中,企业或商户迫切需要使用进销存管理软件,来优化库存控制、提高运营效率、降低成本,并加强与供应链合作伙伴之间的协作和沟通。 为了帮助企业选择适合自己需求的进销存软件,我们特别整理了2023年市面上比…

【Java虚拟机学习1】JVM运行时数据区

JVM运行时数据区 一、前言 我们知道Java程序是运行在JVM(Java虚拟机)上的,Java程序运行时会占用一定的内存,在虚拟机自动管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现…

第一次用用Opencv进行图像处理

2023.7.06更新 codeblocks安装opencv 直接放参考链接,完成安装该步骤来,简单高效! 安装教程链接 有一个问题就是第一次安装完成后运行时会报确实某些ddl的错误,关机重启就好啦! 尝试运行 ddl的错误解决后可以用以…

行业追踪,2023-07-18,减速器,汽车零部件是重点关注板块,随时开启

自动复盘 2023-07-18 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

异步复位同步释放

1、概念 异步复位同步释放就是在复位信号到来的时候不受时钟信号的同步,在复位信号释放的时候受到时钟信号的同步; 优点是可以避免电路出现瞬态错误或者亚稳态。 2、原理图 3、代码实现 /***********************************************/ /**…

【unity之IMGUI实践】单例模式管理面板对象【一】

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

你知道Apache 软件基金会如何选择开源项目吗

Apache软件基金会(Apache Software Foundation,简称ASF)是一个致力于开源软件发展的慈善组织,因其广泛的项目和开放的治理模式而备受社区赞誉。作为全球最大的开源基金会之一,ASF如何选择开源项目成为人们关注的焦点。…

哇~真的是你呀!今天是LIUNX中的SAMBA。

目录 前言 一、概述 二、安装 三、在SAMBA服务器中设置共享目录 四、客户端查看共享目录及登录 五、本地映射 六、客户端自动挂载 七、用户别名 八、访问控制 总结 前言 SAMBA是一个开源的软件套件,用于在Linux和UNIX系统上实现SMB/CIFS网络协议。SMB(S…

大语言模型(LLM)评估综述

论文地址:https://arxiv.org/abs/2307.03109 Github地址:https://github.com/MLGroupJLU/LLM-eval-survey 一 、背景 随着ChatGPT和GPT-4的推出,大型语言模型(LLM)在学术界和工业界的热度日益升高,这主要…