SpringCloud Alibaba Sentinel 限流详解
点赞再看,养成习惯,微信搜索【牧小农】关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友。
项目源码地址:公众号回复 sentinel,即可免费获取源码
熔断规则
在上一篇文章中我们讲解了流控规则的使用和介绍Sentinel流控规则,今天我们给大家讲解sentinel
更多样化的讲解以及流量控制。
官方文档:https://sentinelguard.io/zh-cn/docs/circuit-breaking.html
在面对调用链路中不稳定的资源如何保证高可用?在微服务中一个服务通常会调用其他的模块,可能是服务内的某个应用也有可能是另外的一个远程服务,数据库或者其他API调用。比如我们在支付的时候会调用(某付宝、某信、某联)提供的API,在查询订单我们会调用数据库连接,这些依赖的服务有可能会存在系统不稳定的情况,如果依赖的服务出现了不稳定的情况,请求响应时间过长,线程资源产生堆积,可能最终会耗尽服务的资源,导致服务变的不可用,这个时候 熔断降级 是保证服务高可用的重要措施之一。
如今的微服务都是分布式,有很多服务组成,不同服务之间互相调用,有着比较复杂的调用链路,在上面我们只是模拟绘画了支付操作,在实际的链路调用过程中会有着放大效果,如果某一环不稳定,可能会形成 蝴蝶效应 最终导致整个链路响应时间过长,甚至不可用,所以如果当我们的服务出现 不稳定且没有强依赖服务 调用的时,可以进行熔断降级,暂时限制不稳定的调用,避免影响整体服务。
熔断策略:
sentinel
提供了三种熔断策略
慢调用比例: 选择以慢调用比例作为阈值,需要设置允许的慢调用RT(最大响应时间),如果请求响应时间大于该值则认为慢调用,当统计时长内请求数 大于 最小请求数,且慢调用比例大于阈值,在熔断时长内的请求会被自动熔断,超过熔断时长进入半恢复状态(HALF_OPEN),如果下一个请求响应时间 小于 慢调用比例RT结束熔断,否则再次熔断。
异常比例: 当统计时长内请求数 大于 最小请求数,且异常比例大于设定的阈值,在熔断时间内请求自动熔断,超过熔断时长进入半恢复状态(HALF_OPEN),如果下一个请求成功,结束熔断,否则再次熔断,异常比例阈值范围(0.0-1.0)代表百分比。
异常数: 当统计时长内异常数 大于 阈值,自动进行熔断,超过熔断时长进入半恢复状态(HALF_OPEN),如果下一个请求成功,结束熔断,否则再次熔断。
熔断状态:
熔断状态 | 说明 |
---|---|
OPEN | 熔断开启,拒绝所有请求 |
HALF_OPEN | 熔断半开启(恢复状态),如果接下来请求成功结束熔断,否则继续熔断 |
CLOSE | 熔断关闭,请求通过 |
热点参数规则的核心属性:
属性(Field) | 说明 | 默认值 |
---|---|---|
resource | 资源名(规则的作用对象 ) 必填 | |
grade | 熔断策略(支持慢调用比例/异常比例/异常数策略) 必填 | 慢调用比例 |
count | 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 | |
timeWindow | 熔断时长,单位为 s | |
minRequestAmount | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) | 5 |
statIntervalMs | 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) | 1000 ms |
slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) |
熔断策略 - 慢调用比例
选择以慢调用比例作为阈值,需要设置允许的慢调用RT(最大响应时间),如果请求响应时间大于该值则认为慢调用,当统计时长内请求数 大于 最小请求数,且慢调用比例大于阈值,在熔断时长内的请求会被自动熔断,超过熔断时长进入半恢复状态(HALF_OPEN),如果下一个请求响应时间 小于 慢调用比例RT结束熔断,否则再次熔断。
如果我们一秒钟请求的数量大于5且RT(最大响应时间)大于我们设置的比例阈值的时候,触发熔断策略,比如我们有8个请求在一秒中进来,有5个慢调用,比例阈值设置为 0.1,这个时候我们满足(QPS > 5 且 RT > 比例阈值),进入下一步熔断策略,触发熔断器。
熔断器的内部使用的是断路器,这个好比我们做核酸,本来一栋一栋下去做,如果服务或者检测机器蹦了,通知你暂时不要下来,当机器恢复了,再通知你下来做,这个就类似我们的断路器。
案例演示:
@GetMapping("/fuse")
public String fuse(){
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "hello fuse";
}
设置我们的熔断策略,如果QPS>5请求RT>250且大于比例阈值触发熔断
通过JMeter
测试,1秒钟发起10个线程请求,此时就会触发熔断效果,停止测试以后,10秒钟恢复正常
当我们启动线程之后,再去访问fuse接口,可以看到被熔断了,那么当我们停止线程之后,十秒之后去访问,就可以正常访问
熔断策略 - 异常比例
当统计时长内请求数 大于 最小请求数,且异常比例大于设定的阈值,在熔断时间内请求自动熔断,超过熔断时长进入半恢复状态(HALF_OPEN),如果下一个请求成功,结束熔断,否则再次熔断,异常比例阈值范围(0.0-1.0)代表百分比。异常降级仅仅只针对业务异常,对于sentinel
本身的异常不生效。
测试:
@GetMapping("/exptoin")
public String exptoin(Integer id){
if(id != null && id > 1){
throw new RuntimeException("异常比例测试");
}
return "exptoin test";
}
接下来我们用JMeter进行测试,设置Http请求地址:http://localhost:8006/exptoin?id=5
当启动JMeter的时候,会触发熔断,这个时候我们1秒钟发送10个请求超过了最小请求数,同事超过了阈值,满足两个条件,当熔断时间结束 以后恢复正常
熔断策略 - 异常数
当统计时长内异常数 大于 阈值,自动进行熔断,超过熔断时长进入半恢复状态(HALF_OPEN),如果下一个请求成功,结束熔断,否则再次熔断。
测试代码:
@GetMapping("/exptoin/num")
public String exptoinNum(Integer id){
if(id != null && id > 1){
throw new RuntimeException("异常数测试");
}
return "exptoinNum test";
}
设置异常数策略,当1秒钟内请求超过5并且异常数大约5个的时候触发熔断
热点规则
官网文档:https://sentinelguard.io/zh-cn/docs/parameter-flow-control.html
什么是热点规则?热点我们很好理解,就是很火的东西在程序中可以理解成频繁访问的数据,那么有时候我们系统通缉你某个热点数据中访问频次最高的 前几个数据对其进行限制访问。
例如在秒杀系统中,某一款商品或者某几款商品,要定点秒杀,我们可以以商品ID为参数,在一定时间内对其进行限流
又或者如果某一个用户频繁的去访问我们系统,我们也可以针对于用户ID或者IP进行限制。
热点规则会统计入参参数中的热点数据,根据配置的限流阈值和模式,对启动的热点数据进行限流也就是流量控制。
在上图中我们携带了 是三个参数(axb\abc\xs)等,我们在sentinel
中设置热点限流,我们设置的QPS为5,注意:该模式只支持QPS限制,如果我们的axb参数,命中了我们的规则,那么该请求携带的参数就会被限流。
在使用热点规则的时候,我们需要配合对应的@SentinelResource
注解进行使用,才能够达到更加细粒度的流控规则。
@SentinelResource
- value:代表资源名称,必填,通过name找到对应的规则
- blockHandler: blockHandler 对应处理 BlockException 的方法名称,可选项,访问范围为public,返回类型需要和原方法匹配,并且在最后一需要添加
BlockException
类型的参数
测试代码:
@GetMapping("/hotTest")
@SentinelResource(value = "hotTest")
public String testHotKey(@RequestParam(value = "v1",required = false) String v1,
@RequestParam(value = "v2",required = false)String v2){
return "热点规则 - 热点:";
}
在这里我们要注意,我们需要配置的是不带斜杠的资源名称,这个才是我们需要配置的项目
这个时候我们传入参数 http://localhost:8006/hotTest?v1
,不停的刷新浏览器,这个时候会超过阈值,那么下面就会出现限流
但是,这个报错信息不是很友好,一般人根本不知道啥意思,我们可以使用@SentinelResource
注解提供的另外一个参数blockHandler
,这个参数是可以指定当出现异常时的处理方法,操作如下:
@GetMapping("/hotTest")
@SentinelResource(value = "hotTest",blockHandler = "handler_hot")
public String testHotKey(@RequestParam(value = "v1",required = false) String v1,
@RequestParam(value = "v2",required = false)String v2){
if("5".equals(v1)){
throw new RuntimeException("报告有bug!!!");
}
return "热点规则 - 热点:";
}
//处理异常方法,方法签名要和对应的接口方法保持一致
public String handler_hot(String v1, String v2, BlockException exception){
return "请求过于频繁,请稍后再试.....";
}
重新添加热点规则后,再去频繁的去访问,效果如下:
例外项数目
热点规则除了上述的基础使用外,还有例外项的操作,例外项参数可以达到更加细粒度的控制,比如我们在当前的案例中,目前v1参数在访问时超过阈值则会被限流,当时如果我们想通过参数v1等于具体的值的时候,来出发不同的流控效果时,改怎么操作呢?
比如我想要让v1等于2的时候,阈值达到50,其他的规则走上面的规则。
如果当前v1的值为2的时候,会走例外项里面的设置,也就是50的阈值,如果不是2会走普通的阈值规则,通过下图我们可以看到如果为2的值,无论我们点击多少次,都不会提示我们请求过于频繁。
系统规则
sentinel
系统自适应限流是从整体维度对应用入口流量进行控制,结合应用的 load、CPU使用率、总体平均RT、入口QPS和并发线程数等几个维度的监控指标,通过自适应的流控策略,来让系统入口流量和系统的负载达到一个平衡,让系统尽可能的在面对高并发访问的同时保证系统整体的稳定。
系统保护是应用整体,所以不具备更细粒度的操作,只针对于入口流量有效。
系统规则支持的模式:
- LOAD自适应: 针对于linxu/unix 机器有效,系统load(一分钟平均负载)作为启发指标,进行自适应系统保护。
- RT:单台机器上所有的入口流量平均RT达到阈值时,触发系统保护,单位为毫秒
- 线程数: 单台机器上所有入口流量的并发线程数达到阈值触发系统保护
- 入口QPS: 单台机器上所有入口流量的QPS达到阈值触发系统保护
- CPU 使用率: 当系统CPU使用率超过阈值时触发系统保护(取值范围:0.0 - 1.0)
演示:
通过入口QPS来进行测试,直接设置规则
最后测试效果不管现在我们访问那个接口只要超过阈值就会被限流
总结
到这里我们限流策略就讲完了,其实并不复杂,我们需要了解其中每个规则如何使用,效果是怎样的,最好是自己动手试一试,会更有成就感。
我是牧小农,怕什么真理无穷,进一步有进一步的欢喜,大家加油
SpringCloud Alibaba Sentinel 限流详解的更多相关文章
- alibaba sentinel限流组件 源码分析
如何使用? maven引入: <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>s ...
- Spring Cloud Zuul 限流详解(附源码)(转)
在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...
- Spring Cloud限流详解
转自:https://blog.csdn.net/tracy38/article/details/78685707 在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud ...
- Spring Cloud(十二):Spring Cloud Zuul 限流详解(附源码)(转)
前面已经介绍了很多zuul的功能,本篇继续介绍它的另一大功能.在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选 ...
- 0.9.0.RELEASE版本的spring cloud alibaba sentinel限流、降级处理实例
先看服务提供方的,我们在原来的sentinel实例(参见0.9.0.RELEASE版本的spring cloud alibaba sentinel实例)上加上限流.降级处理,三板斧只需在最后那一斧co ...
- Alibaba Sentinel 限流与熔断初探(技巧篇)
目录 1.Sentinel 是什么 ?主要能解决什么问题? 2.限流与熔断的使用场景 3.Sentinel 源码结构 4.在 IntelliJ IDEA 中运行 Sentine Demo 温馨提示:源 ...
- Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例
这一节我们通过一个简单的实例,学习Sentinel的基本应用. 一.Sentinel 限流核心概念 在学习Sentinel的具体应用之前,我们先来了解一下Sentinel中两个核心的概念,资源和规则. ...
- 5-4 Sentinel 限流_流控与降级
Sentinel 介绍 什么是Sentinel Sentinel也是Spring Cloud Alibaba的组件 Sentinel英文翻译"哨兵\门卫" 随着微服务的流行,服务和 ...
- 基于JavaSE阶段的IO流详解
1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...
随机推荐
- SpringCloud微服务治理技术入门(SCN)
1.集群.分布式.微服务 首先先理解三个感念 什么是集群?: 同一个业务,部署在多个服务器上,目的是实现高可用,保证节点可用! 什么是分布式?: 一个业务分拆成多个子业务,部署在不同的服务器上,每个子 ...
- Spark入门之idea编写Scala脚本
一.安装Scala插件 1.File->Settings 2.Plugins->Msrketplace->搜索Scala并安装 (或者自己下载合适的scala版本,教程:自己给ide ...
- css3 calc浏览器中显示Invalid propety value
在写前端页面样式中使用calc 显示Invalid property value 后来查了文档之后才发现是自己的格式不对 我的写法: .clac { width:calc(100%-112px); } ...
- 在Wireshark中使用过滤器——显示过滤器
在Wireshark运行过程中选择搜索(Ctrl-F),第一个默认的搜索选项就是显示过滤器. 显示过滤器用于捕获文件,用来告诉Wireshark只显示那些符合过滤条件的数据包. 显示过滤器比捕获过滤器 ...
- matplotlib---Annotation标注
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-3, 3, 50) y = 2 * x + 1 plt.figu ...
- HTTP请求头格式和响应格式
HTTP请求头格式 提示: 回车符 \r 换行符 \n 请求首行分析: 请求方式: GET 和 POST 方式: GET请求:地址栏访问.超链接访问都是get请求方式,get请求方式不安全,地址栏大小 ...
- 5.Java程序运行机制
一.编译型和解释型语言区别 计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以任何的高级语言编写的程序都必须转换成计算机语言,也就是机器码.而这种转换的方式有两种: 编译 ...
- VS Code失焦时自动保存编辑器内容
vs code有一个非常好用的功能:就是自动保存. 而且不需要安装什么插件,只需要在编辑器设置就可以了.接下来我们一起来设置吧: 1.打开我们的vs code编辑器.在左下角有个 齿轮图标(管理), ...
- 洛谷 P1162 填涂颜色 DFS
P1162 填涂颜色 https://www.luogu.com.cn/problem/P1162 qaq搜索好抽象啊,蒟蒻表示难以理解,搞半天才做出来一道题,很挫败www 思路 染色法.找墙壁外的连 ...
- 合并csv文件保存到一个csv文件中-保留表头
主要实现功能: 在同一文件夹下的所有csv文件全部合并到同一个csv文件中,并将csv文件的表头保留 1 import os 2 import pandas as pd 3 path = os.get ...