【微服务】Sentinel(熔断降级,热点限流)

文章目录

    • 1.熔断降级
        • 1.基本介绍
          • 1.线程堆积引出熔断降级
          • 2.示意图
          • 3.熔断,降级,限流三者之间的关系
        • 2.熔断降级策略(以分钟为基本单位)
          • 1.慢调用比例
          • 2.异常比例
          • 3.异常数
        • 3.熔断降级实例—慢调用比例
          • 1.需求分析
          • 2.com/sun/springcloud/controller/MemberController.java 新增接口t3并休眠300ms
          • 3.具体配置
            • 1.重启10004微服务
            • 2.查看注册情况
            • 3.浏览器输入http://localhost:10004/t3发送请求
            • 4.Sentinel点击降级
            • 5.降级规则配置
          • 4.测试
            • 1.一秒超过五次请求http://localhost:10004/t3会发生熔断降级
            • 2.等待10s,再次请求,虽然还是慢调用,但是小于最小请求数,所以不会发生熔断
        • 5.熔断降级实例—异常比例
          • 1.需求分析
          • 2.com/sun/springcloud/controller/MemberController.java 新增接口t4并出现异常返回error
          • 3.具体配置
            • 1.重启10004微服务
            • 2.查看注册情况
            • 3.浏览器输入http://localhost:10004/t4
            • 4.Sentinel点击降级
            • 5.具体配置
          • 4.测试
            • 1.一秒超过五次请求 http://localhost:10004/t4,发生熔断降级
            • 2.五秒之后再次发送请求,降级解除
        • 6.熔断降级实例—异常数
          • 1.需求分析
          • 2.还是使用掐面的t4接口即可
          • 3.具体配置
          • 4.测试
            • 1.一秒超过五次请求 http://localhost:10004/t4,由于每发生熔断降级
            • 2.五秒之后再次发送请求,降级解除
    • 2.热点限流
        • 1.基本介绍
          • 1.引出热点限流
          • 2.示意图
          • 3.上图解读
        • 2.需求分析
        • 3.具体配置
          • 1.10004微服务的controller增加两个接口
            • 被热点限流的接口
            • 处理热点限流的接口
          • 2.重启10004微服务,并启动Nacos和Sentinel
          • 3.浏览器输入 http://localhost:10004/news?id=1&type=%E5%8A%A8%E7%89%A9
          • 4.Sentinel查看热点接口
          • 5.点击热点,进行基本配置
          • 6.保存后点击热点规则,编辑刚才的规则
          • 7.点击高级选项,对参数的具体值进行额外配置
        • 4.测试
          • 1.浏览器快速访问 http://localhost:10004/news?id=1&type=%E5%8A%A8%E7%89%A9 会出现热点限流
          • 2.快速访问 http://localhost:10004/news?id=2&type=%E5%8A%A8%E7%89%A9 不会出现热点限流
        • 5.注意事项
          • 1.热点参数可以设置多个值进行限流
          • 2.处理热点限流的方法的返回值需要与被处理的方法相同
    • 3.系统规则
        • 1.基本介绍
          • 1.引出系统规则
          • 2.介绍
        • 2.系统规则实例
          • 1.需求分析
          • 2.新增系统规则
          • 3.进行配置
          • 4.测试
            • 浏览器快速访问 http://localhost:10004/t2(或者其他任意的资源) 都会进行热点限流
    • 4.全局限流处理类
        • 1.需求分析
        • 2.具体实现
          • 1.编写全局限流处理类
          • 2.编写一个接口进行测试
          • 3.测试
            • 1.重启10004模块
            • 2.配置system接口的限流,这里就配置一个热点限流
            • 3.浏览器快速访问 http://localhost:10004/system?id=test
    • 5.fallback(统一处理java异常)
        • 1.需求分析
        • 2.具体实现
          • 1.修改system接口,每五次抛出异常
          • 2.编写全局异常处理类
          • 3.system接口使用全局异常处理类处理异常
          • 4.测试
            • 1.打开nacos和sentinel
            • 2.重启10004微服务
            • 3.浏览器访问一下http://localhost:10004/system?id=test
            • 4.Sentinel配置限流,这里就配置一个QPS流量控制
            • 5.目前情况分析
            • 6.访问五次 http://localhost:10004/system?id=test 成功交给全局异常处理类来处理

1.熔断降级

1.基本介绍
1.线程堆积引出熔断降级

image-20240329104355325

2.示意图

image-20240329105626479

3.熔断,降级,限流三者之间的关系

image-20240329105426279

2.熔断降级策略(以分钟为基本单位)
1.慢调用比例
  • 进行熔断的条件是:慢调用的比例达到阈值,QPS大于最小请求数
  • 待超过熔断时长后,如果还是满足熔断条件(慢调用的比例达到阈值,QPS大于最小请求数),则会继续进行熔断

image-20240329110452910

2.异常比例
  • 进行熔断的条件是:异常比例达到阈值,QPS大于最小请求数
  • 待超过熔断时长后,如果还是满足熔断条件(异常比例达到阈值,QPS大于最小请求数),则会继续进行熔断

image-20240329112148590

3.异常数
  • 进行熔断的条件是:异常数达到阈值,QPS大于最小请求数
  • 待超过熔断时长后,如果还是满足熔断条件(异常数达到阈值,QPS大于最小请求数),则会继续进行熔断

image-20240329112510279

3.熔断降级实例—慢调用比例
1.需求分析

image-20240329112705700

2.com/sun/springcloud/controller/MemberController.java 新增接口t3并休眠300ms

image-20240329113359178

3.具体配置
1.重启10004微服务

image-20240329113533774

2.查看注册情况

image-20240329113611668

3.浏览器输入http://localhost:10004/t3发送请求

image-20240329113644817

4.Sentinel点击降级

image-20240329113718423

5.降级规则配置
  • 这样当每秒钟的请求数大于5,并且每分钟只要有一个是慢调用就进行熔断降级

image-20240329114118368

4.测试
1.一秒超过五次请求http://localhost:10004/t3会发生熔断降级

image-20240329114323785

2.等待10s,再次请求,虽然还是慢调用,但是小于最小请求数,所以不会发生熔断

image-20240329115141664

5.熔断降级实例—异常比例
1.需求分析

image-20240329131043620

2.com/sun/springcloud/controller/MemberController.java 新增接口t4并出现异常返回error

image-20240329131230071

3.具体配置
1.重启10004微服务

image-20240329131456261

2.查看注册情况

image-20240329131528454

3.浏览器输入http://localhost:10004/t4

image-20240329131620416

4.Sentinel点击降级

image-20240329131647299

5.具体配置
  • 这样配置表示当每秒钟的请求数达到5,并且**每分钟异常的比例大于20%**则会出现熔断降级

image-20240329131736371

4.测试
1.一秒超过五次请求 http://localhost:10004/t4,发生熔断降级

image-20240329131849384

2.五秒之后再次发送请求,降级解除

image-20240329131959017

6.熔断降级实例—异常数
1.需求分析

image-20240329132810897

2.还是使用掐面的t4接口即可
3.具体配置
  • 这样,当吗,每秒钟的请求数到达5,并且每分钟异常数量大于5,则会进行熔断降级

image-20240329132944371

4.测试
1.一秒超过五次请求 http://localhost:10004/t4,由于每发生熔断降级

image-20240329131849384

2.五秒之后再次发送请求,降级解除

image-20240329131959017

2.热点限流

1.基本介绍
1.引出热点限流

image-20240329134028382

2.示意图

image-20240329134542514

3.上图解读

image-20240329134610173

2.需求分析

image-20240329134928822

3.具体配置
1.10004微服务的controller增加两个接口
被热点限流的接口
  • 使用@SentinelResource注解来制定被热点限流的接口以及处理热点限流的接口
    /*** 测试热点限流* @param id* @param type* @return*/@GetMapping("/news")@SentinelResource(value = "news", blockHandler = "hot") // value为资源名可以任意指定,blockHandler为限流处理public String news(@RequestParam("id") String id, @RequestParam("type") String type) {return "id=" + id + " type=" + type;}
处理热点限流的接口
  • 接受的参数需要与被热点限流的接口的参数一致,并且有一个处理异常的参数
    /*** 热点限流处理* @param id 与news方法的参数一致* @param type 与news方法的参数一致* @param blockException 限流处理的异常* @return 注意:这里的返回值类型要与news方法的返回值类型一致*/public String hot(String id, String type, BlockException blockException) {return "id" + id + "type" + type + "热点限流处理";}
2.重启10004微服务,并启动Nacos和Sentinel
3.浏览器输入 http://localhost:10004/news?id=1&type=%E5%8A%A8%E7%89%A9

image-20240329144442569

4.Sentinel查看热点接口

image-20240329144621993

5.点击热点,进行基本配置
  • 这个配置表示对参数id进行热点限流,只要每秒请求次数超过2就触发限流

image-20240329144934949

6.保存后点击热点规则,编辑刚才的规则

image-20240329145007319

7.点击高级选项,对参数的具体值进行额外配置

image-20240329151348982

4.测试
1.浏览器快速访问 http://localhost:10004/news?id=1&type=%E5%8A%A8%E7%89%A9 会出现热点限流
  • 原因是对参数id设置了热点限流的触发条件为每秒请求数为2

image-20240329151437389

2.快速访问 http://localhost:10004/news?id=2&type=%E5%8A%A8%E7%89%A9 不会出现热点限流
  • 原因是对参数id=2设置了热点限流的触发条件为每秒请求数为100

5.注意事项
1.热点参数可以设置多个值进行限流

image-20240329151708068

2.处理热点限流的方法的返回值需要与被处理的方法相同

3.系统规则

1.基本介绍
1.引出系统规则

image-20240329152555753

2.介绍
  • 简单来说这个系统规则就是对整个系统的所有资源进行统一管理,共享一套限流规则

image-20240329153222053

2.系统规则实例
1.需求分析

image-20240329153902556

2.新增系统规则

image-20240329154220628

3.进行配置
  • 这样配置就表示,整个系统的每秒请求数超过2就会进行限流

image-20240329154301245

4.测试
浏览器快速访问 http://localhost:10004/t2(或者其他任意的资源) 都会进行热点限流

image-20240329154704800

4.全局限流处理类

1.需求分析

image-20240329154954350

2.具体实现
1.编写全局限流处理类
  • 需要注意:方法必须是static,并且参数类型和返回的类型必须与被处理的方法一致
package com.sun.springcloud.handler;import com.alibaba.csp.sentinel.slots.block.BlockException;/*** Description: 全局限流处理器,方法必须是static** @Author sun* @Create 2024/3/29 16:04* @Version 1.0*/
public class GlobalBlockHandler {/*** 全局限流处理器** @param id 传入的参数* @param e  异常* @return 返回的结果,必须与被处理的方法返回值一致*/public static String blockHandler(String id, BlockException e) {return "GlobalBlockHandler " + id + " 服务不可用";}
}
2.编写一个接口进行测试
    /*** 全局限流测试* @return*/@GetMapping("/system")//  @SentinelResource 注解中的value值为资源名 名字任意,blockHandlerClass为全局限流处理类,blockHandler为处理方法@SentinelResource(value = "system", blockHandlerClass = GlobalBlockHandler.class, blockHandler = "blockHandler")public String system(@RequestParam(value = "id", required = false) String id) {return "id" + id + "全局限流未激活";}
3.测试
1.重启10004模块

image-20240329161430407

2.配置system接口的限流,这里就配置一个热点限流

image-20240329161744272

3.浏览器快速访问 http://localhost:10004/system?id=test

image-20240329161901203

5.fallback(统一处理java异常)

1.需求分析

image-20240329162600010

2.具体实现
1.修改system接口,每五次抛出异常
    private int count = 0;/*** 全局限流测试* @return*/@GetMapping("/system")//  @SentinelResource 注解中的value值为资源名 名字任意,blockHandlerClass为全局限流处理类,blockHandler为处理方法@SentinelResource(value = "system", blockHandlerClass = GlobalBlockHandler.class, blockHandler = "blockHandler",fallbackClass = GlobalFallbackHandler.class, fallback = "fallbackHandlerMethod1")public String system(@RequestParam(value = "id", required = false) String id) {// 每调用5次就抛出异常if (++ count % 5 == 0) {throw new RuntimeException("出现异常!!!");}return "id" + id + "全局限流未激活";}
2.编写全局异常处理类
  • 方法需要是static
  • 参数类型和返回类型与被处理的方法类型一致
package com.sun.springcloud.handler;/*** Description: 全局异常处理类,所有的方法都要是静态方法,参数类型和返回值类型也要与被处理的方法返回值相同** @Author sun* @Create 2024/3/29 16:33* @Version 1.0*/
public class GlobalFallbackHandler {public static String fallbackHandlerMethod1(String id, Throwable throwable) {return "fallback处理异常!" + "id:" + id;}
}
3.system接口使用全局异常处理类处理异常
  • 新增两个属性,一个是全局异常处理类的Class对象,一个是处理异常的方法

image-20240329163824828

4.测试
1.打开nacos和sentinel
2.重启10004微服务
3.浏览器访问一下http://localhost:10004/system?id=test
4.Sentinel配置限流,这里就配置一个QPS流量控制

image-20240329164403683

5.目前情况分析
  • 正常情况:每秒请求数不超过2
  • 限流情况:每秒请求数超过2,被全局限流处理类中的方法处理
  • 异常情况:每5次抛出一次异常,交给全局异常处理器处理
6.访问五次 http://localhost:10004/system?id=test 成功交给全局异常处理类来处理

image-20240329170349994

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

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

相关文章

个人简历主页搭建系列-05:部署至 Github

前面只是本地成功部署网站,网站运行的时候我们可以通过 localhost: port 进行访问。不过其他人是无法访问我们本机部署的网站的。 接下来通过 Github Pages 服务把网站部署上去,这样大家都可以通过特定域名访问我的网站了! 创建要部署的仓库…

CAS、AQS、ReentrantLock机制以原理

1、CAS 1.1 基本概念 CAS 是 compare and swap 的简写,即比较并交换。它是指一种操作机制,而不是某个具体的类或方法。在 Java 平台上对这种操作进行了包装。在 Unsafe 类中,调用代码如下 这里无法用Unsafe类看,我使用的是Atomi…

绿联 部署vocechat,搭建私人聊天服务器,用于小型团队和家庭环境

1、镜像 privoce/vocechat-server:latest 2、安装 2.1、基础设置 重启策略:容器退出时总是重启容器。 2.2、网络 桥接即可。 2.3、存储空间 装载路径:/home/vocechat-server/data不可变更,权限读写。 2.4、端口设置 容器端口3000不可变…

鸿蒙OS开发教学:【编程之重器-装饰器】

HarmonyOS 有19种装饰器 必须【2】 绘制一个页面,这两个肯定会用到 EntryComponent 可选【17】 StatePropLinkObjectLinkWatchStylesStoragePropStorageLinkProvideConsumeObservedBuilderBuilderParamLocalStoragePropLocalStorageLinkExtendConcurrent 如果…

python3将exe 转支持库错误 AssertionError: None does not smell like code

exe -> pyc包(*.exe_extracted) 安装反编译工具 exe反编译工具:pyinstxtractor.py下载:https://sourceforge.net/projects/pyinstallerextractor/ python pyinstxtractor.py hello.exe包反编译 懒的写!!! 这有详…

如何使用Zabbix监控MySQL的MGR群集状态

MySQL的MGR(MySQL Group Replication)是MySQL官方提供的一种高可用性和高可靠性的集群解决方案。MGR通过使用基于组复制的方式,实现了多个MySQL实例之间的数据同步和故障转移,从而提供了自动故障恢复和负载均衡的功能。本文将介绍…

安装uim-ui插件不成功,成功解决

安装:这种安装,umi4 不支持,只有umi3才支持。而我发现官网现在默认使用的umi4。 yarn add umijs/preset-ui -D 解决:更改umi版本重新安装umi3 npm i ant-design/pro-cli3.1.0 -g #使用umi3 (指定umi3版本) pro create user-ce…

【YOLOv8 代码解读】数据增强代码梳理

1. LetterBox增强 当输入图片的尺寸和模型实际接收的尺寸可能不一致时,通常需要使用LetterBox增强技术。具体步骤是先将图片按比例缩放,将较长的边缩放到设定的尺寸以后,再将较短的边进行填充,最终短边的长度为stride的倍数即可。…

爬虫(Web Crawler)逆向技术探索

实战案例分析 为了更好地理解爬虫逆向的实际应用,我们以一个具体的案例进行分析。 案例背景 假设我们需要从某电商网站上获取商品价格信息,但该网站采取了反爬虫措施,包括动态Token和用户行为分析等。 分析与挑战 动态Token:…

海豚【货运系统源码】货运小程序【用户端+司机端app】源码物流系统搬家系统源码师傅接单

技术栈:前端uniapp后端vuethinkphp 主要功能: 不通车型配置不通价格参数 多城市定位服务 支持发货地 途径地 目的地智能费用计算 支持日期时间 预约下单 支持添加跟单人数选择 支持下单优惠券抵扣 支持司机收藏订单评价 支持订单状态消息通知 支…

Photoshoot 2(Java)

Photoshoot 2 题目描述 在一个似曾相识的场景中,Farmer John 正在将他的 N 头奶牛(1≤N≤10^5)排成一排(为了方便将它们按 1⋯1⋯N 编号),以便拍照。 最初,奶牛从左到右按照 a1,a2,⋯,aN 的顺…

【C/C++】从零开始认识C++历程-启航篇

文章目录 📝前言🌠 什么是C?🌉C的发展史 🌠C的重要性🌉语言的使用广泛度 🌠在工作领域🌉 岗位需求 🌠相关笔试题🌉 公司怎样面试C 🚩总结 &#x…

用grafana+prometheus+cadvisor监控容器指标数据,并查询当前容器的网速网络用量

前言 整理技术,在这篇文章中,将会搭建grafanaprometheuscadvisor监控容器,并使用一个热门数据看板,再监控容器的性能指标 dashboard效果 这个是node-exporter采集到的数据,我没装node-exporter,而且这也…

Vitis AI——FPGA学习笔记<?>

参考资料: Xilinx/Vitis-AI-Tutorials (github.com) Xilinx/Vitis-AI: Vitis AI is Xilinx’s development stack for AI inference on Xilinx hardware platforms 【03】ALINX Zynq UltraScale MPSoC XILINX FPGA视频教程Vitis AI开发 一. 简介 1.简介 边缘计…

【物联网】Qinghub opc-ua 连接协议

基础信息 组件名称 : opcua-connector 组件版本: 1.0.0 组件类型: 系统默认 状 态: 正式发布 组件描述:通过OPCUA连接网关,通过定时任务获取OPCUA相关的数据或通过执行指令控制设备相关参数。 配置文件&a…

卸载原有的cuda,更新cuda

概述:看了一下自己的gpu,发现驱动可能装低了,随即尝试更新驱动,写下此篇 注:我原先是10.2的版本,改了之后是11.2,下面的图都用11.2的,不过不碍事 目录 第一步:查看现在…

位运算算法(2)

目录 面试题 01.01. 判断字符是否唯一 一、题目描述 二、思路解析 三、代码 268.丢失的数字 一、题目描述 二、思路解析 三、代码 371.两整数之和 一、题目描述 二、思路解析 三、代码 137.只出现一次的数字 II 一、题目描述 二、思路解析 三、代码 面试题 01.0…

Web漏洞-深入WAF注入绕过

目录 简要其他测试绕过 方式一:白名单(实战中意义不大) 方式二:静态资源 方式三: url白名单 方式四:爬虫白名单 #阿里云盾防SQL注入简要分析 #安全狗云盾SQL注入插件脚本编写 在攻防实战中,往往需要掌握一些特性,比如服务…

下拉选中搜索angularjs-dropdown-multiselect.js

需要引入angularjs-dropdown-multiselect.js 页面 <div ng-dropdown-multiselect"" options"supplierList_data" selected-model"supplierList_select" events"changSelValue_supplierList" extra-settings"mucommonsetti…