深入理解Sentinel系列-1.初识Sentinel
- 👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家
- 📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理
- 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
- 🍂博主正在努力完成2023计划中:源码溯源,一探究竟
- 📝联系方式:nhs19990716,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬👀
文章目录
- 限流的作用
- 限流的算法
- 计数器
- 滑动窗口
- 漏桶
- 令牌桶
- 限流的实现
- Sentinel
- 服务熔断
- demo
- Sentinel中的流量控制
对于后端来说,我们需要提供一些接口去进行交互,比如登陆注册,支付下单等这样的一些功能,所以我们需要搭建一个整体的架构,早期的话可能没那么复杂,就是通过ssm框架组成的架构,然后通过部署tomcat来提供一个端口,随着整个并发量上去之后,我们需要去提供高性能的服务。
当我们的客户端,用户量的访问大了之后,对于后端系统的并发量会更高,并发量越高对于后端整个处理的能力就是一个挑战,因为我们需要保证,用户从10个到10000个的时候,我们需要提供给用户的是 它的响应时间不能超过多少。因为用户的操作是存在一个心理预期的,这就是所谓的用户体验。其次就是系统是否能够支撑这么大的量,是否会挂掉,挂掉之后网站无法提供对外服务的情况下,你无法产生商业价值。
比如说双十一零点的时候,那一瞬间瞬时的流量一定会大于正常时间的吞吐量,所以需要采用一定的机制来限流
限流的作用
- 保护系统避免被瞬时流量冲垮
- 预防恶意请求(如果自己公司不提供安全的话,可以去买高防的服务器)
- 针对请求进行限制
服务器能支撑的连接数是多少
接口的处理能力(QPS/TPS),可以使用Jmeter来测试平均响应时间
资源限制(cpu(线程池)、内存、网络资源)
- 如何控制流量
限流的指标(可以容纳的流量、已经容纳的流量、可以接受的流量) 阈值(基于这个指标)
限流的过程(通过算法来实现)
限流的结果(处理策略)
限流的算法
计数器
(Zookeeper:RequestThrottle 限流阀)、线程池大小、连接数大小
滑动窗口
实际上发送方和接收方都维护了一个滑动窗口

当发送端发送了一个数据包,等到接收端接收到后,接收端窗口开始滑动,发送端需要等待返回后才能滑动

其限流的核心就是流量只能在这个窗口里面,但是在tcp里面,其窗口是可以灵活的扩大的,其会根据当前网络拥挤的程度来决定窗口大小。
最大只能发送五个(阈值),超过了就不能发送了

所以说io通信是一个阻塞通信其实就是这样,基于数据包处理的结果,等到这个数据返回,如果数据一直不返回,那么这个时候请求是阻塞的。
漏桶
(用来控制传输速率的)本质上控制的是发送者的速度

流入水滴的速率代表的是请求,而滴出水滴的速度代表是处理的请求,不管来的请求有多少,但是能够处理的请求就这么多。
漏桶算法的特点:
- 水的流出速度是固定的
- 桶的大小也是固定的
令牌桶

其恒定的生成速率决定了并发数,假如说我每秒生成10个令牌,那么我的qps 就是 10
令牌桶对比漏桶的区别是,其能够处理瞬时突发流量,而不像漏桶一样,流出的速度是固定的。
令牌桶的设计:
-
桶的大小
-
令牌标记
-
定时任务生成令牌
-
提供令牌获取的接口
限流的实现
Semphore 信号量
分布式限流
其大小怎么计算呢?通过压测来进行计算
//单机实现
//令牌桶算法RateLimiter rateLimiter=RateLimiter.create(10); //TPS=10public void doRequest(){if(rateLimiter.tryAcquire()){ //获取令牌System.out.println("success");}else{System.out.println("failed");}}
// 令牌桶不需要释放,处理完后自动丢弃
Sentinel
Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。

其中对于Sentinel最重要的两个东西:
- 资源(需要被保护的东西)
- 规则(限流的规则/熔断规则)

所有的流量经过这个组件后,会根据这个规则去控制这个流量来进行处理。
而熔断是一个这样的概念:

上图存在很多相互调用的情况,里面存在很多服务调用的链路,当Service D出现故障,会导致G F阻塞,间接的又会导致A B阻塞,如果特别多的请求阻塞在这里之后,会占用特别多的资源,内存、服务器、cpu的资源,这时候会导致服务器因为大量的资源被占用而导致其他问题。
当出现这种情况的时候,会触发一种熔断的方式,熔断以后会触发降级。
服务熔断
Sentinel的服务熔断有两种方式:基于响应时间的熔断和基于异常比率的熔断。基于响应时间的熔断是根据服务的响应时间来判断是否需要熔断,当服务的响应时间超过设定的阈值时,触发熔断。基于异常比率的熔断是根据服务的异常比率来判断是否需要熔断,当服务的异常比率超过设定的阈值时,触发熔断。这两种方式可以根据具体的业务场景和需求来选择使用。
demo
public static void main(String[] arg) {initFlowRule(); //初始化限流规则while(true){//ResourceName表示资源,控制访问流量的点/*try(Entry entry=SphU.entry("helloWorld")){System.out.println("hello world");}catch (BlockException e){System.out.println("被拒绝");}*/if (SphO.entry("helloWorld")) {System.out.println("Hello World");SphO.exit();// 释放}}}private static void initFlowRule(){List<FlowRule> rules=new ArrayList<>();FlowRule flowRule=new FlowRule();flowRule.setResource("helloWorld"); //针对那个资源设置规则flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//QPS或者并发数flowRule.setCount(5); //QPS=5rules.add(flowRule);FlowRuleManager.loadRules(rules);}
Demo 运行之后,我们可以在日志 ~/logs/csp/${appName}-metrics.log.xxx 里看到下面的输出:`
-timestamp- -date time - -resource- 5表示, 通过的请求, block: 被拒绝的请
求 ,
1600608724000|2023-09-20 21:32:04|helloWorld|5|6078|5|0|5|0|0|0
1600608725000|2023-09-20 21:32:05|helloWorld|5|32105|5|0|0|0|0|0
1600608726000|2023-09-20 21:32:06|helloWorld|5|41084|5|0|0|0|0|0
1600608727000|2023-09-20 21:32:07|helloWorld|5|72211|5|0|0|0|0|0
1600608728000|2023-09-20 21:32:08|helloWorld|5|60828|5|0|0|0|0|0
1600608729000|2023-09-20 21:32:09|helloWorld|5|41696|5|0|0|0|0|0
@RestController
public class SentinelController {@AutowiredTestService testService;@GetMapping("/hello/{name}")public String sayHello(@PathVariable("name") String name){return testService.doTest(name);}
}@Service
public class TestService {@SentinelResource(value = "doTest",blockHandler ="blockHandler",fallback = "fallback") //声明限流的资源public String doTest(String name){return "hello , "+name;}public String blockHandler(String name, BlockException e){ //降级,限流触发的return "被限流了";}// 降级和限流是不一样的,限流可以触发降级,降级是因为已经被触发了// 降级是第三方业务调用的时候,针对下游的一个返回// 限流是针对当前服务访问的限制// 这两个配置只会调用一个public String fallback(String name){ //降级,熔断触发的return "被降级了";}}@SpringBootApplication
public class SpringbootSentinelApplication {public static void main(String[] args) {initFlowRule();SpringApplication.run(SpringbootSentinelApplication.class, args);}private static void initFlowRule(){List<FlowRule> rules=new ArrayList<>();FlowRule flowRule=new FlowRule();flowRule.setResource("doTest"); //针对那个资源设置规则flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//QPS或者并发数flowRule.setCount(5); //QPS=5rules.add(flowRule);FlowRuleManager.loadRules(rules);}}
Sentinel中的流量控制
维度 + 规则 + 资源
不管是通过什么样的方式,其核心原理就是,监控应用流量的qps或者并发线程数的指标,然后去判断这些指标的阈值去对流量进行控制,防止瞬时流量高峰导致系统被压垮。
SphU.entry(resourceName) ->
正常,则通过
被限制,抛出 FlowException( FlowException extends BlockException)
同一个资源也可以创建不同的规则,这个主要是通过List rules=new ArrayList<>();实现的,如果有多个规则,会去遍历,如果发现那个规则被触发则就执行,否则就顺利通过。
一个规则由什么组成?
- resource 资源
- count 阈值
- grade 类型(基于QPS 还是 并发线程数)
- limitApp,针对的调用来源.
- strategy , 调用关系限流
- controlBehavior . (直接拒绝, 冷启动,匀速排队)
相关文章:
深入理解Sentinel系列-1.初识Sentinel
👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理🔥如果感觉博主的文章还不错的话ÿ…...
vue中字典的使用
1.引入字典 dicts: [order_status,product_type],2.表单中使用 select下拉 <el-form-item label"订单状态" prop"orderStatus"><el-select v-model"form.orderStatus" clearable placeholder"请输入订单状态" :disabled"…...
AWS基于x86 vs Graviton(ARM)的RDS MySQL性能对比
概述 这是一个系列。在前面,我们测试了阿里云经济版(“ARM”)与标准版的性能/价格对比;华为云x86规格与ARM(鲲鹏增强)版的性能/价格对比。现在,再来看看AWS的ARM版本的RDS情况 在2018年&#…...
ESP32 蓝牙音箱无法链接上电脑的解决:此项不起作用,请确保你的蓝牙设备仍可检测到
ESP32 被我加了放大器后通过A2DP链接手机播放一直正常,但是怎么都链接不到电脑,蓝牙设备可以被发现和配对,但是始终无法连接,显示: 此项不起作用,请确保你的蓝牙设备仍可检测到,然后再试一次 …...
会声会影2024软件还包含了视频教学以及模板素材
会声会影2024中文版是一款加拿大公司Corel发布的视频编软件。会声会影2024官方版支持视频合并、剪辑、屏幕录制、光盘制作、添加特效、字幕和配音等功能,用户可以快速上手。会声会影2024软件还包含了视频教学以及模板素材,让用户剪辑视频更加的轻松。 会…...
[Swift]RxSwift常见用法详解
RxSwift 是 ReactiveX API 的 Swift 版。它是一个基于 Swift 事件驱动的库,用于处理异步和基于事件的代码。 GitHub:https://github.com/ReactiveX/RxSwift 一、安装 首先,你需要安装 RxSwift。你可以使用 CocoaPods,Carthage 或者 Swift …...
探索鸿蒙_ArkTs开发语言
ArkTs 在正常的网页开发中,实现一个效果,需要htmlcssjs三种语言实现。 但是使用ArkTs语言,就能全部实现了。 ArkTs是基于TypeScript的,但是呢,TypeScript是基于javascript的,所以ArkTs不但能完成js的工作&a…...
案例049:基于微信小程序的校园外卖平台设计与实现
文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…...
通过提示工程释放人工智能
在快速发展的技术领域,人工智能 (AI) 处于前沿,不断重塑我们与数字系统的交互。这一演变的一个关键方面是大型语言模型 (LLM) 的开发和完善,它在从客户服务机器人到高级数据分析的各种应用中已变得不可或缺。利用这些法学硕士的潜力的核心是提…...
亚马逊云科技Serverless视频内容摘要提取方案
概述 随着GenAI的普及,视频内容摘要生成成为一个备受关注的领域。通过将视频内容转化为文本,可以探索到更广泛的应用场景,其中包括: 视频搜索与索引:将视频内容转化为文本形式,可以方便地进行搜索和索引操作…...
c语言:整数与浮点数在内存中的存储方式
整数在内存中的存储: 在计算机内存中,整数通常以二进制形式存储。计算机使用一定数量的比特(bit)来表示整数,比如32位或64位。在存储整数时,计算机使用补码形式来表示负数,而使用原码形式来表示…...
dockerdesktop 导出镜像,导入镜像
总体思路 备份时 容器 > 镜像 > 本地文件 恢复时 本地文件 > 镜像 > 容器 备份步骤 首先,把容器生成为镜像 docker commit [容器名称] [镜像名称] 示例 docker commit nginx mynginx然后,把镜像备份为本地文件,如果使用的是Docker Desktop,打包备份的文件会自动存…...
2-Django、Flask和Tornado三大主流框架对比
在Python的web开发框架中,目前使用量最高的几个是Django、Flask和Tornado, 经常会有人拿这几个对比,相信大家的初步印象应该是 Django大而全、Flask小而精、Tornado性能高。 了解常用框架 Django 主要特点是大而全,集成了很多组件,例如: Mo…...
【openssl】Window系统如何编译openssl
本文主要记录如何编译出windows版本的openss的lib库 如果需要获取RSA公钥私钥,推荐【openssl】 生成公钥私钥 |通过私钥获取公钥-CSDN博客 目录 1.下载openssl,获得openssl-master.zip。 2.下载Perl 3.下载NASM 4.配置perl和NASM的环境变量 5.进入…...
[leetcode 双指针]
1. 三数之和 M :::details 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a b c 0 ?请你找出所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例…...
Notepad++批量添加引号
工作中经常会遇到这样情景:业务给到一批订单号,需要查询这批订单的某些字段信息。在where条件中需要传入这些订单号的数组,并且订单号用引号引起,用引号隔开。 字符串之间长度相同 可以按住CtrlAlt和鼠标左键选中区域࿰…...
HarmonyOS4.0从零开始的开发教程04 初识ArkTS开发语言(下)
HarmonyOS(二) 初识ArkTS开发语言(下)之TypeScript入门 声明式UI基本概念 应用界面是由一个个页面组成,ArkTS是由ArkUI框架提供,用于以声明式开发范式开发界面的语言。 声明式UI构建页面的过程ÿ…...
Failed to connect to github.com port 443 after 21055 ms: Timed out
目前自己使用了梯*子还是会报这样的错误,连接不到的github。 查了一下原因: 是因为这个请求没有走代理。 解决方案: 设置 -> 网络和Internet -> 代理 -> 编辑 记住这个IP和端口 使用以下命令: git config --global h…...
Python小技巧:冻结参数,让你的代码变简洁
Python 有一些非常使用的模块, functools 就是其中之一。今天我们来说说其中的 partial 函数, partial 函数看起来平平无奇,如果你经常翻看高手们写的库,会发现很多地方都在使用这函数。 入门 我们从一个小场景开始。 现在我们需…...
如何判断电脑电源质量的好坏?
电脑电源作为电脑的关键部件直接影响到电脑的性能和寿命,因此选择一个好的电源至关重要。那么要如何判断电脑电源的好坏呢?判断的指标都有哪些呢? 1.外观检测 观察电源外观可以初步判断电脑电源的工艺质量和材料质量。外观检测需要检查电源外壳是否坚固࿰…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
