Sentinel降级和热点Key限流

news2024/11/26 0:28:48

目录

一、降级规则

(一)官网

(二)基本介绍

(三)降级策略实战

二、热点key限流

(一)基本介绍

(二)官网

(三)测试

(四)参数例外项

三、系统规则(了解即可)

四、@SentinelResource

(一)按资源名称限流+后续处理

(二)按照Url地址限流+后续处理

(三)更多注解属性说明


一、降级规则

(一)官网

熔断降级 · alibaba/Sentinel Wiki · GitHub

(二)基本介绍

RT(平均响应时间,秒级)
      平均响应时间   超出阈值  且   在时间窗口内通过的请求>=5,两个条件同时满足后触发降级
      窗口期过后关闭断路器
      RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)
 
异常比例(秒级)
    QPS >= 5 且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级
 
异常数(分钟级)
     异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级


 进一步说明

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,
让请求快速失败,避免影响到其它的资源而导致级联错误。
 
当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

Sentinel的断路器是没有半开状态的。半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用,具体可以参考Hystrix

(三)降级策略实战

1、RT

代码

@GetMapping("/testD")
public String testD()
{
    //暂停几秒钟线程
    try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
    log.info("testD 测试RT");
    return "------testD";
}

配置

 

jmeter压测

 

结论

按照上述配置,
 
  永远一秒钟打进来10个线程(大于5个了)调用testD,我们希望200毫秒处理完本次任务,
如果超过200毫秒还没处理完,在未来1秒钟的时间窗口内,断路器打开(保险丝跳闸)微服务不可用,保险丝跳闸断电了
 
后续我停止jmeter,没有这么大的访问量了,断路器关闭(保险丝恢复),微服务恢复OK
 
 

2、异常比例

 

代码

@GetMapping("/testD")
public String testD()
{
    log.info("testD 测试RT");
    int age = 10/0;
    return "------testD";
}

配置

 指的是一秒内打进来的请求中异常比例不超过0.2就不开启断路器

jmeter压测

 

结论 

按照上述配置,
单独访问一次,必然来一次报错一次(int age  = 10/0),调一次错一次;
开启jmeter后,直接高并发发送请求,多次调用达到我们的配置条件了。
断路器开启(保险丝跳闸),微服务不可用了,不再报错error而是服务降级了。

3、异常数

意思是我们设置的时间窗口最好大于60s 

 

代码

@GetMapping("/testE")
public String testE()
{
    log.info("testE 测试异常比例");
    int age = 10/0;
    return "------testE 测试异常比例";
}

配置

http://localhost:8401/testE,第一次访问绝对报错,因为除数不能为零,
我们看到error窗口,但是达到5次报错后,进入熔断后降级。 

jmeter压测

 测试

 

二、热点key限流

(一)基本介绍

何为热点
热点即经常访问的数据,很多时候我们希望统计或者限制某个热点数据中访问频次最高的TopN数据,并对其访问进行限流或者其它操作

(二)官网

https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

(三)测试

 代码

blockHandler 即为兜底方法,如果没设置blockHandler出现的将是空白错误页white Error Page

注意:兜底的方法要写上原来方法带的所有参数+blockexception

@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "dealHandler_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1, 
                         @RequestParam(value = "p2",required = false) String p2){
    return "------testHotKey";
}
public String dealHandler_testHotKey(String p1,String p2,BlockException exception)
{
    return "-----dealHandler_testHotKey";
}
 

 配置

限流模式只支持QPS模式,固定写死了。(这才叫热点)
@SentinelResource注解的方法参数索引,0代表第一个参数,1代表第二个参数,以此类推
单机阀值以及统计窗口时长表示在此窗口时间超过阀值就限流。

上面的抓图就是第一个参数有值的话,1秒的QPS为1,超过就限流,限流后调用dealHandler_testHotKey支持方法。

有p1参数的一秒钟内访问两次就会调用blockhandle方法(因为我们设置了一秒内次数1,超过就不行)

 

 (四)参数例外项

如果我们期望p1参数当它是某个特殊值时,它的限流值和平时不一样,那就可以通过高级设置中的参数例外项来实现

这里我们设置当参数索引为0即p1的值为5时,他的限流阈值变成200,当p1不等于5的时候,阈值就是平常的1

前提条件:热点参数的注意点,参数必须是基本类型或者String

此时如果我们在业务代码中报出异常错误,会不会走blockhandler的兜底方法呢,我们发现并不会,而是报了空白页错误

总结:

@SentinelResource
处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理;
 
 
RuntimeException
int age = 10/0,这个是java运行时报出的运行时异常RunTimeException,@SentinelResource不管
 

 @SentinelResource主管配置出错,运行出错该走异常走异常

同时我们可以看到@sentinelResource 有一个fallback属性,这也许就是业务代码出现异常走的方法了,我们后面再讲。

@SentinelResource(value = "testhotkey", blockHandler = "deal_hotkey",fallback = )

三、系统规则(了解即可)

 官网:系统自适应限流 · alibaba/Sentinel Wiki · GitHub

各项参数说明

 

配置全局QPS,指的是当系统中单台机器上的所有入口流量达到100后触发系统保护

 

 四、@SentinelResource

(一)按资源名称限流+后续处理

即表示1秒钟内查询次数大于1,就跑到我们自定义的处流,限流 。

(二)按照Url地址限流+后续处理

通过访问的URL来限流,我们发现配置了handler方法也没有效果

    @GetMapping("/rateLimit/byUrl")
    @SentinelResource(value = "byUrl", blockHandler = "handleException2")
    public CommonResult byUrl()
    {
        return new CommonResult(200,"按url限流测试OK",new Payment(2020L,"serial002"));
    }
    public CommonResult handleException2(BlockException exception)
    {
        return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");
    }

 

 即会返回Sentinel自带默认的限流处理信息,

 那么应该如何设置blockhandler呢?

①创建CustomerBlockHandler类用于自定义限流处理逻辑

public class CustomerBlockHandler
{
    public static CommonResult handleException(BlockException exception){
        return new CommonResult(2020,"自定义的限流处理信息......CustomerBlockHandler");
    }
}
    /**
     * 自定义通用的限流处理逻辑,
     blockHandlerClass = CustomerBlockHandler.class
     blockHandler = handleException2
     上述配置:找CustomerBlockHandler类里的handleException2方法进行兜底处理
     */
    /**
     * 自定义通用的限流处理逻辑
     */
    @GetMapping("/rateLimit/customerBlockHandler")
    @SentinelResource(value = "customerBlockHandler",
            blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handleException")
    public CommonResult customerBlockHandler()
    {
        return new CommonResult(200,"按客户自定义限流处理逻辑");
    }

 即Sentinel会去找blockhandlerClass中的类寻找blockhander方法作为兜底方法

总结:

sentinel是根据@SentinelResource中的value值默认作为规则匹配的,所以以路径做流控规则,兜底方法不会生效

(三)更多注解属性说明

1、SphU定义资源

2、Tracer定义统计

3、ContextUtil定义了上下文

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

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

相关文章

谷粒学苑第二章前端框架-2.2前端框架开发过程

一、前端框架开发过程 第一步:添加路由 src/router模块用来管理路由。 第二步:点击某个路由,显示路由对应页面内容 component: () > import(/views/table/index), 表示路由对应的页面,是views/table/index.vue页面 第三步&a…

vue的生命周期函数不能使用箭头函数

如果使用过react和vue,应该发现过一个问题:vue告诉我们不应该把方法、生命周期用箭头函数去定义;而在react的类组件中,把方法写成箭头函数的形式却更方便。 要问其原因,大部分人都只把他当一个理所当然的规定。但把这…

Myba tis基础2

接口代理方式代理开发方式介绍编写StudentMapper接口测试代理方式小结动态sql语句动态 SQL 之<**if>**动态 SQL 之<**foreach>**SQL片段抽取分页插件介绍分页插件的使用分页插件的参数获取小结MyBatis的多表操作多表模型介绍多表模型一对一操作多表模型一对多操作多…

Python创意作品说明怎么写,python创意编程作品集

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;Python创意作品说明怎么写&#xff0c;python创意编程作品集&#xff0c;现在让我们一起来看看吧&#xff01; 1、有哪些 Python 经典书籍 书名&#xff1a;深度学习入门 作者&#xff1a;[ 日&#xff3d; 斋藤康毅 …

《Linux运维实战:Centos7.6部署rabbitmq3.9.16镜像模式集群》

一、RabbitMQ集群的三种模式 RabbitMQ有三种模式&#xff1a;单一模式&#xff0c;普通集群模式&#xff0c;镜像集群模式。 单一模式&#xff1a;即单机情况不做集群&#xff0c;就单独运行一个rabbitmq而已。 普通集群模式&#xff1a;普通集群模式下&#xff0c;不同的节点…

TryHackMe-Carnage

Carnage 花了两天学了下wireshark 顺便看一下现在我的红队进程 由于ad在进攻性渗透测试当中已经早早收入囊中&#xff0c;这让我在红队进度中变快 现在&#xff0c;红队路径剩下的room应该都算是在整个path当中比较有难度的了&#xff0c;我不经意的查看了剩下的部分room&…

基于昇腾计算语言AscendCL开发AI推理应用

01 初始AscendCL AscendCL&#xff08;Ascend Computing Language&#xff0c;昇腾计算语言&#xff09;是昇腾计算开放编程框架&#xff0c;是对底层昇腾计算服务接口的封装&#xff0c;它提供运行时资源&#xff08;例如设备、内存等&#xff09;管理、模型加载与执行、算子…

c函数篇 入门 阶乘 ,素数(2019年)数列求和(2021年),完数,完全平方数,因子求和,x的y次方。

目录 1: 计算s1!2!3!......n! 2:素数问题2019 3:编写程序判断一个数是不是完数 4:编写函数 求x的y次方 完成pow(x,y)的功能 5:输出1到1000内所有完全平方数 6:求因子之和 数列求和 1: 计算s1!2!3!......n! #include<stdio.h> long fac(int n) {int i;long s1;for…

龙智宣布与Incredibuild建立战略合作伙伴关系

近日&#xff0c;龙智宣布与领先的加速编译软件提供商Incredibuild建立战略合作伙伴关系。 Incredibuild是一款加速编译工具。凭借其独特的进程虚拟化技术&#xff08;Vritualized Distributed Processing™&#xff09;&#xff0c;使用户能够轻松地加速代码构建、测试和许多…

Windows10下安装git

文章目录安装环境&#xff1a;Windows10 64bit官网下载&#xff1a;https://git-scm.com/download/win国内下载源&#xff1a;https://npm.taobao.org/mirrors/git-for-windows/ 从官网下载Git安装包&#xff0c;双击下载后的安装包Git-2.32.0-64-bit.exe,开始安装 选择HTTPS…

java面试题(十八)spring MVC

3.1 什么是MVC&#xff1f; 参考答案 MVC是一种设计模式&#xff0c;在这种模式下软件被分为三层&#xff0c;即Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;。Model代表的是数据&#xff0c;View代表的…

【解决方案】老旧小区升级改造,视频智能化能力如何提升居民安全感?

一、需求背景 随着我国社会经济的快速发展与进步&#xff0c;城市宜居程度成为城市发展的重要指标&#xff0c;城市的发展面临着更新、改造和宜居建设等。一方面&#xff0c;社区居民对生活的环境提出了更高的要求&#xff1b;另一方面&#xff0c;将“智慧城市”的概念引入社…

[MySQL教程①] - MySQL的安装

目录 ❤ Windows下安装MySQL ❤ 下载mysql installer安装 ❤ 下载zip安装包安装 现在作为服务器操作系统的一般有三种&#xff0c;Windows Server&#xff0c;Linux&#xff0c;Unix&#xff0c;在这里我们只介绍在windows下和linux下安装mysql&#xff0c;Unix下安装应该…

03 AC-AC变换器(ACAC Converter)简介

文章目录0、 杂记1、AC-AC变换器概述2、交流调压电路A 相控交流调压3、交流调压电路B 三相相控交流电压4、交流调压电路C 斩控交流电压5、交流调功电路6、交-交变频电路A 周波变换器7、交-交变频电路B 矩阵变换器8、AC-AC变换器总结0、 杂记 在复杂的周期性振荡中&#xff0c;…

百度贴吧发帖软件如何发布?

百度贴吧发帖软件如何发布&#xff1f;贴吧软件发帖顶帖视频教学&#xff0c;防删图技术视频教学#贴吧发帖#贴吧顶帖 大家好&#xff0c;今天给大家讲一下一个贴软件发电机顶帖的视频教学。先给大家讲一下软件一个发帖。今天我们用的一个软件叫做神机。神机我们现在看到的软件…

RESTful API 为何成为顶流 API 架构风格?

作者孙毅&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX Committer 万物互联的世界充满着各式各样的 API &#xff0c;如何统筹规范 API 至关重要。RESTful API 是目前世界上最流行的 API 架构风格之一&#xff0c;它可以帮助你实现客户端与服务端关注点分离&#x…

Vue3 企业级优雅实战 - 组件库框架 - 12 发布开源组件库

前面使用了 11 篇文章分享基于 vue3 、Monorepo 的组件库工程完整四件套&#xff08;组件库、文档、example、cli&#xff09;的开发、构建及组件库的发布。本文属于这 11 篇文章的扩展 —— 如何发布到 GitHub 上以及如何快速利用 GitHub 发布组件库文档。这样优雅哥的《组件库…

Springboot862大学生社团管理系统

后台两大功能模块&#xff0c; (1)管理员&#xff1a;个人中心、学校管理、学院管理、年级管理、班级管理、社长管理、学生管理、社团类型管理、社团信息管理、社团成员管理、退团记录管理、社团活动管理、活动报名管理、退出活动管理、社团事务管理、系统管理。 (2)社长&#…

PyTorch学习笔记:nn.SmoothL1Loss——平滑L1损失

PyTorch学习笔记&#xff1a;nn.SmoothL1Loss——平滑L1损失 torch.nn.SmoothL1Loss(size_averageNone, reduceNone, reductionmean, beta1.0)功能&#xff1a;创建一个平滑后的L1L_1L1​损失函数&#xff0c;即Smooth L1&#xff1a; l(x,y)L{l1,…,lN}Tl(x,y)L\{l_1,\dots,l…

【Python爬虫实战案例】采集城市桌游商家数据信息,做可视化演示

前言 这里容我罗嗦几句 &#x1f617; 这个时间&#xff0c;我想大学生应该都回学校了吧&#xff0c;嘿嘿 现在应该蛮忙的&#xff0c;有些的还要准备开学考&#xff0c;临近毕业的朋友&#xff0c;也快要因为工作而烦恼了&#xff0c;但是&#xff01;&#xff01; 咱也是…