点赞再看,养成习惯,微信搜索【牧小农】关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友。

项目源码地址:公众号回复 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 限流详解的更多相关文章

  1. alibaba sentinel限流组件 源码分析

    如何使用? maven引入: <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>s ...

  2. Spring Cloud Zuul 限流详解(附源码)(转)

    在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...

  3. Spring Cloud限流详解

    转自:https://blog.csdn.net/tracy38/article/details/78685707 在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud ...

  4. Spring Cloud(十二):Spring Cloud Zuul 限流详解(附源码)(转)

    前面已经介绍了很多zuul的功能,本篇继续介绍它的另一大功能.在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选 ...

  5. 0.9.0.RELEASE版本的spring cloud alibaba sentinel限流、降级处理实例

    先看服务提供方的,我们在原来的sentinel实例(参见0.9.0.RELEASE版本的spring cloud alibaba sentinel实例)上加上限流.降级处理,三板斧只需在最后那一斧co ...

  6. Alibaba Sentinel 限流与熔断初探(技巧篇)

    目录 1.Sentinel 是什么 ?主要能解决什么问题? 2.限流与熔断的使用场景 3.Sentinel 源码结构 4.在 IntelliJ IDEA 中运行 Sentine Demo 温馨提示:源 ...

  7. Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例

    这一节我们通过一个简单的实例,学习Sentinel的基本应用. 一.Sentinel 限流核心概念 在学习Sentinel的具体应用之前,我们先来了解一下Sentinel中两个核心的概念,资源和规则. ...

  8. 5-4 Sentinel 限流_流控与降级

    Sentinel 介绍 什么是Sentinel Sentinel也是Spring Cloud Alibaba的组件 Sentinel英文翻译"哨兵\门卫" 随着微服务的流行,服务和 ...

  9. 基于JavaSE阶段的IO流详解

    1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...

随机推荐

  1. SpringCloud微服务治理技术入门(SCN)

    1.集群.分布式.微服务 首先先理解三个感念 什么是集群?: 同一个业务,部署在多个服务器上,目的是实现高可用,保证节点可用! 什么是分布式?: 一个业务分拆成多个子业务,部署在不同的服务器上,每个子 ...

  2. Spark入门之idea编写Scala脚本

    一.安装Scala插件 1.File->Settings 2.Plugins->Msrketplace->搜索Scala并安装 (或者自己下载合适的scala版本,教程:自己给ide ...

  3. css3 calc浏览器中显示Invalid propety value

    在写前端页面样式中使用calc 显示Invalid property value 后来查了文档之后才发现是自己的格式不对 我的写法: .clac { width:calc(100%-112px); } ...

  4. 在Wireshark中使用过滤器——显示过滤器

    在Wireshark运行过程中选择搜索(Ctrl-F),第一个默认的搜索选项就是显示过滤器. 显示过滤器用于捕获文件,用来告诉Wireshark只显示那些符合过滤条件的数据包. 显示过滤器比捕获过滤器 ...

  5. matplotlib---Annotation标注

    import numpy as np import matplotlib.pyplot as plt x = np.linspace(-3, 3, 50) y = 2 * x + 1 plt.figu ...

  6. HTTP请求头格式和响应格式

    HTTP请求头格式 提示: 回车符 \r 换行符 \n 请求首行分析: 请求方式: GET 和 POST 方式: GET请求:地址栏访问.超链接访问都是get请求方式,get请求方式不安全,地址栏大小 ...

  7. 5.Java程序运行机制

    一.编译型和解释型语言区别 计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以任何的高级语言编写的程序都必须转换成计算机语言,也就是机器码.而这种转换的方式有两种: 编译 ...

  8. VS Code失焦时自动保存编辑器内容

    vs code有一个非常好用的功能:就是自动保存. 而且不需要安装什么插件,只需要在编辑器设置就可以了.接下来我们一起来设置吧: 1.打开我们的vs code编辑器.在左下角有个  齿轮图标(管理), ...

  9. 洛谷 P1162 填涂颜色 DFS

    P1162 填涂颜色 https://www.luogu.com.cn/problem/P1162 qaq搜索好抽象啊,蒟蒻表示难以理解,搞半天才做出来一道题,很挫败www 思路 染色法.找墙壁外的连 ...

  10. 合并csv文件保存到一个csv文件中-保留表头

    主要实现功能: 在同一文件夹下的所有csv文件全部合并到同一个csv文件中,并将csv文件的表头保留 1 import os 2 import pandas as pd 3 path = os.get ...