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.mzph.cn/news/712.shtml

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

相关文章

JMeter进行WebSocket压力测试

背景 之前两篇内容介绍了一下 WebSocket 和 SocketIO 的基础内容。之后用 Netty-SocketIO 开发了一个简单的服务端,支持服务端主动向客户端发送消息,同时也支持客户端请求,服务端响应方式。本文主要想了解一下服务端的性能怎么样,…

4.6.tensorRT基础(1)-实际模型上onnx文件的各种操作

目录 前言1. onnx1.1 读取节点1.2 修改节点1.3 替换节点1.4 删除节点1.5 修改input和output1.6 预处理的接入 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍&#…

【深度学习】神经网络初学者指南

一、说明 这是一篇对神经网络的泛泛而谈的文章,我的意见是,先知道框架,而后知道每一个细节,这是学习人工智能的基本路线。本文就神经网络而言,谈到一些基础概念,适应于初学者建立概念。 二、神经网络定义 神…

计算机网络————网络层

文章目录 网络层设计思路IP地址IP地址分类IP地址与硬件地址 协议ARP和RARPIP划分子网和构造超网划分子网构造超网(无分类编址CIDR) ICMP 虚拟专用网VPN和网络地址转换NATVPNNAT 网络层设计思路 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数…

【MQTT】Esp32数据上传采集:最新mqtt插件(支持掉线、真机调试错误等问题)

前言 这是我在Dcloud发布的插件-最完整Mqtt示例代码(解决掉线、真机调试错误等问题),经过整改优化和替换Mqtt的js文件使一些市场上出现的问题得以解决,至于跨端出问题,可能原因有很多,例如,合法…

<数据结构>并查集

目录 并查集概念 合并 查找集合的数量 并查集类代码实现 并查集概念 并查集和堆一样,都是通过数组来实现树的节点映射,不过并查集作用是,把一堆数据分为不同的几个小集合 不过并查集是森林的概念,并查集的学习可以帮助我们去更…

IDEA中侧边栏没有git commit模块,如何恢复?

一、修改之前 侧边栏没有git commit模块 二、修改之后 侧边栏恢复了git commit模块 三、下面是恢复教程 1.中文版 打开 文件 -> 设置 -> 版本控制 -> 提交 -> 勾选 【使用非模式提交界面】 -> 点击【确定】 2.英文版 打开 file -> Settings -> Version Co…

同步和异步的区别

同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是处于阻塞的,只有接收到返回的值或消息后才往下执行其他的命令; 异步,执行完函数或方法后,不必阻塞性地等待返回…

Linux与Windows:操作系统的比较与技巧分享

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

【数学建模】国赛真题分析 2012 A题 葡萄酒的评价

2012 A题 葡萄酒的评价 优秀论文地址: 链接:https://pan.baidu.com/s/19WGpybgM6RncxTYhx61JRA?pwdvl22 提取码:vl22 –来自百度网盘超级会员V6的分享 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品评。每个评酒员在对葡萄酒进…

计讯物联网关型水利遥测终端机TY910确保闸站自动化监测长效运行

闸站是我国水利建设工程的重要组成部分,具备调度水源、防洪排涝、灌溉等能力,在农业、水路运输、养殖业等行业领域起着关键作用,进而解决区域水资源不均衡的问题,促进水资源多方面的利用。当前,我国闸站存在数量多、分…

线性代数 4 every one(线性代数学习资源分享)

Linear Algebra 4 Every One 版权说明,以下我分享的都是一个名叫Kenji Hiranabe的日本学者,在github上分享的,关于Gilbert Strang教授所撰写的《Linear Algebra for Everyone》一书的总结,更像是一个非常精美的线性代数手册&#…

.net core 2.1 简单部署IIS运行

netcore的项目不像netFramework那么方便部署到iis还是要费点功夫的 比如我想把这个netcore2.1的项目部署到iis并运行: 按照步骤走: 一、确认自己的netcore环境 1、需要安装下面3个环境包(如果电脑已安装请忽略) 检查是否安装cmd命令:cmd&…

go mod vendor简明介绍

Go 语言在 go 1.6 版本以后编译 go 代码会优先从 vendor 目录先寻找依赖包,它具有以下优点: 复制依赖:go mod vendor 会把程序所依赖的所有包复制到项目目录下的vendor 文件夹中,所以即使这些依赖包在外部源(如 GitHu…

OpenCV中掩膜(Mask)、setTo()、copyTo()、clone()、inRange()的定义与使用

文章目录 1、掩膜(Mask)是什么(1)从物理的角度来看:(2)图像处理中的掩膜Mask(3)掩膜的用法:(4)掩膜Mask 的运算: 2、setTo()函数:将图…

flutter开发实战-dio文件下载实现

flutter开发实战-dio文件下载实现 在开发中,需要下载文件,这里使用的是dio dio 是一个强大的 Dart HTTP 请求库,支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时以及自定义适配器等。 一、引入d…

JS脚本 - 批量给所有指定标签追加Class属性

JS脚本 - 批量给所有指定标签追加Class属性 前言一. 脚本二. 测试运行 前言 公司里我们有个应用引入了UBT埋点,记录了页面上所有的点击操作以及对应的点击按钮。但是我们看下来发现,我们需要给每个按钮加一个唯一标识做区分,并且这个ID是给U…

Flask 使用Flask的session来保存用户登录状态例子

使用Python的Flask库实现的登录接口、查询金额接口和注销接口的示例。 当用户发送POST请求到/login接口时,代码会获取请求中的用户名和密码。如果用户名和密码匹配(在示例中是admin和admin123),则会将用户名保存在session中&…

吴恩达机器学习2022-Jupyter特征缩放

1可选实验室: 特征缩放和学习率(多变量) 1.1 目标 在这个实验室里: 利用前一实验室开发的多变量线性回归模型程序在具有多种功能的数据集上运行梯度下降法探讨学习速度 alpha 对梯度下降法的影响通过使用 z 分数标准化的特征缩放来提高梯度下降法的性能 1.2 工具 您将使用…

Python爬虫学习笔记(三)————urllib

目录 1.使用urllib来获取百度首页的源码 2.下载网页图片视频 3.总结-1 4.请求对象的定制(解决第一种反爬) 5.编解码 (1)get请求方式:urllib.parse.quote() (2)get请求…