服务限流实现方案
服务限流怎么做
限流算法
- 计数器
每个单位时间能通过的请求数固定,超过阈值直接拒绝。
通过维护一个单位时间内的计数器,每次请求计数器加1,当单位时间内计数器累加到大于设定的阈值,则之后的请求都被绝,直到单位时间已经过去,再将计数器重置为零。但可能会在窗口切换时出现流量突刺。
- 漏桶算法
维持一个队列,所有请求先进队列,然后从队列取出请求的速率是固定。【保护请求】
漏桶算法可以很好地限制容量池的大小,从而防止流量暴增。漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 在网络中,漏桶算法可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。
漏桶算法需要通过两个变量进行控制:一个是桶的大小,支持流量突发增多时可以存多少的水(burst),另一个是水桶漏洞的大小(rate)(从队列取出请求)
- 令牌桶算法
按一定额定的速率产生令牌,存入令牌桶,桶有最大容量(应该为微服务最大承载);服务过来时需要请求到一个令牌才可以进入服务执行;服务里就可以保持基本不会超过承载值。【保护服务】
令牌桶算法是对漏桶算法的一种改进,桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用。在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。放令牌这个动作是持续不断的进行,如果桶中令牌数达到上限,就丢弃令牌,所以就存在这种情况,桶中一直有大量的可用令牌,这时进来的请求就可以直接拿到令牌执行,比如设置qps为100,那么限流器初始化完成一秒后,桶中就已经有100个令牌了,这时服务还没完全启动好,等启动完成对外提供服务时,该限流器可以抵挡瞬时的100个请求。所以,只有桶中没有令牌时,请求才会进行等待,最后相当于以一定的速率执行。
一、基于springcloud-gateway的Filter限流
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代了Zuul网关。Gateway提供了路由、过滤、限流等功能,其中限流功能主要是通过GatewayFilter实现的。
限流过程与实现原理
Spring Cloud Gateway的限流主要是通过RequestRateLimiter GatewayFilter实现的。这个过滤器会在处理请求之前检查请求是否超过了预设的限流规则。如果超过了限流规则,过滤器会返回HTTP 429 Too Many Requests响应。
RequestRateLimiter过滤器的工作原理是使用一个ReactiveRedisRateLimiter或RedisRateLimiter对象来检查请求的速率。这个对象会在Redis中维护一个令牌桶,每次请求都会尝试从令牌桶中获取一个令牌。如果令牌桶中没有令牌,那么请求就会被限流。
示例
以下是一个基于Spring Cloud Gateway的限流示例:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder, RedisRateLimiter redisRateLimiter) {return builder.routes().route("test_route", r -> r.path("/test").filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(redisRateLimiter))).uri("http://localhost:8080")).build();
}
在这个示例中,我们定义了一个路由规则,所有匹配/test路径的请求都会被路由到http://localhost:8080。在路由之前,我们添加了一个RequestRateLimiter过滤器,使用RedisRateLimiter作为限流器。这样,所有匹配/test路径的请求都会被限流。
注意,这个示例需要Redis服务器的支持,因为RedisRateLimiter会在Redis中维护令牌桶。你需要在Spring Cloud Gateway的配置文件中配置Redis服务器的地址和端口。
二、基于Sentinel的限流
Sentinel是阿里巴巴开源的一款轻量级的流量控制、熔断降级Java库,主要用于防止服务雪崩和系统保护。
限流过程与实现原理
Sentinel的限流主要是通过定义资源和规则来实现的。资源是对业务逻辑的抽象,规则定义了资源的访问限制。当一个请求到来时,Sentinel会检查请求的资源是否超过了预设的规则。如果超过了规则,Sentinel会根据策略进行限流,例如直接拒绝、排队等待或慢启动。
Sentinel的限流规则主要有以下几种:
- QPS(每秒请求数):限制资源每秒的访问次数。
- 线程数:限制资源的并发访问线程数。
- 响应时间:当资源的平均响应时间超过阈值时,限制资源的访问。
- 示例
以下是一个基于Sentinel的限流示例:
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.exception.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;import java.util.Collections;public class SentinelDemo {public static void main(String[] args) {// 定义限流规则FlowRule rule = new FlowRule();rule.setResource("HelloWorld");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setCount(10);FlowRuleManager.loadRules(Collections.singletonList(rule));// 模拟请求while (true) {try (Entry entry = SphU.entry("HelloWorld")) {// 被保护的业务逻辑System.out.println("Hello World");} catch (BlockException e) {// 被限流的处理逻辑System.out.println("Blocked");}}}
}
在这个示例中,我们定义了一个名为"HelloWorld"的资源,并为它设置了一个QPS限流规则,限制每秒的访问次数为10。然后我们模拟了一个无限循环的请求,每次请求都会尝试进入"HelloWorld"资源。如果资源没有被限流,那么就执行业务逻辑(打印"Hello World");如果资源被限流,那么就执行被限流的处理逻辑(打印"Blocked")。
相关文章:
服务限流实现方案
服务限流怎么做 限流算法 计数器 每个单位时间能通过的请求数固定,超过阈值直接拒绝。 通过维护一个单位时间内的计数器,每次请求计数器加1,当单位时间内计数器累加到大于设定的阈值,则之后的请求都被绝,直到单位时…...
【RTOS】快速体验FreeRTOS所有常用API(1)工程创建
目录 一、工程创建1.1 新建工程1.2 配置RCC1.3 配置SYS1.4 配置外设1)配置 LED PC132)配置 串口 UART13)配置 OLED I2C1 1.5 配置FreeRTOS1.6 工程设置1.7 生成代码1.8 keil设置下载&复位1.9 添加用户代码 快速体验FreeRTOS所有常用API&a…...
Red Hat Enterprise Linux 8.9 安装图解
风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任,图解仅供参考,请悉知!本次安装图解是在一个全新的演示环境下进行的,演示环境中没有任何有价值的数据,但这并不代表摆在你面前的环境也是如此。生产环境…...
vcruntime140.dll文件修复的几种常见解决办法,vcruntime140.dll丢失的原因
vcruntime140.dll文件是Windows操作系统中的一个重要动态链接库(DLL)文件,它是Microsoft Visual C Redistributable的一部分。当出现vcruntime140.dll文件丢失的情况时,可能会导致一些程序无法正常运行或出现错误提示。为了电脑能…...
SpringCloud Alibaba 深入源码 - Nacos 分级存储模型、支撑百万服务注册压力、解决并发读写问题(CopyOnWrite)
目录 一、SpringCloudAlibaba 源码分析 1.1、SpringCloud & SpringCloudAlibaba 常用组件 1.2、Nacos的服务注册表结构是怎样的? 1.2.1、Nacos的分级存储模型(理论层) 1.2.2、Nacos 源码启动(准备工作) 1.2.…...
算法训练营Day45
#Java #动态规划 Feeling and experiences: 最长公共子序列:力扣题目链接 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新…...
【Redis漏洞利用总结】
前言 redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis默认使用 6379 端口。 一、redis未授权访问漏洞 0x01 漏洞描述 描述: Redis是一套开源的使用ANSI C编写、支持网络、可基于内存…...
SPI 动态服务发现机制
SPI(Service Provier Interface)是一种服务发现机制,通过ClassPath下的META—INF/services文件查找文件,自动加载文件中定义的类,再调用forName加载; spi可以很灵活的让接口和实现分离, 让API提…...
【C++进阶07】哈希表and哈希桶
一、哈希概念 顺序结构以及平衡树中 元素关键码与存储位置没有对应关系 因此查找一个元素 必须经过关键码的多次比较 顺序查找时间复杂度为O(N) 平衡树中为树的高度,即O( l o g 2 N log_2 N log2N) 搜索效率 搜索过程中元素的比较次数 理想的搜索方法:…...
Go 语言实现冒泡排序算法的简单示例
以下是使用 Go 语言实现冒泡排序算法的简单示例: package mainimport "fmt"func bubbleSort(arr []int) {n : len(arr)for i : 0; i < n-1; i {for j : 0; j < n-i-1; j {if arr[j] > arr[j1] {// 交换元素arr[j], arr[j1] arr[j1], arr[j]}}}…...
JAVA 学习 面试(五)IO篇
BIO是阻塞I/O,NIO是非阻塞I/O,AIO是异步I/O。BIO每个连接对应一个线程,NIO多个连接共享少量线程,AIO允许应用程序异步地处理多个操作。NIO,通过Selector,只需要一个线程便可以管理多个客户端连接࿰…...
vue3相比vue2的效率提升
1、静态提升 2、预字符串化 3、缓存事件处理函数 4、Block Tree 5、PatchFlag 一、静态提升 在vue3中的app.vue文件如下: 在服务器中,template中的内容会变异成render渲染函数。 最终编译后的文件: 1.静态节点优化 那么这里为什么是两部分…...
web terminal - 如何在mac os上运行gotty
gotty可以让你使用web terminal的方式与环境进行交互,实现终端效果 假设你已经配置好了go环境,首先使用go get github.com/yudai/gotty命令获取可执行文件,默认会安装在$GOPATH/bin这个目录下,注意如果你的go版本比较高ÿ…...
机械设计-哈工大课程学习-螺纹连接
圆柱螺纹主要几何参数螺纹参数 ①外径(大径),与外螺纹牙顶或内螺纹牙底相重合的假想圆柱体直径。螺纹的公称直径即大径。 ②内径(小径),与外螺纹牙底或内螺纹牙顶相重合的假想圆柱体直径。 ③中径ÿ…...
ai绘画|stable diffusion的发展史!简短易懂!!!
手把手教你入门绘图超强的AI绘画,用户只需要输入一段图片的文字描述,即可生成精美的绘画。给大家带来了全新保姆级教程资料包 (文末可获取) 一、stable diffusion的发展史 本文目标:学习交流 对于熟悉SD的同学&#x…...
水塘抽样算法
水塘抽样算法 1、问题描述 最近经常能看到面经中出现在大数据流中的随机抽样问题 即:当内存无法加载全部数据时,如何从包含未知大小的数据流中随机选取k个数据,并且要保证每个数据被抽取到的概率相等。 假设数据流含有N个数,我…...
easyui渲染隐藏域<input type=“hidden“ />为textbox可作为分割条使用
最近在修改前端代码的时候,偶然发现使用javascript代码渲染的方式将<input type"hidden" />渲染为textbox时,会显示一个神奇的效果,这个textbox输入框并不会隐藏,而是显示未一个细条,博主发现非常适合…...
100天精通Python(实用脚本篇)——第113天:基于Tesseract-OCR实现OCR图片文字识别实战
文章目录 专栏导读1. OCR技术介绍2. 模块介绍3. 模块安装4. 代码实战4.1 英文图片测试4.2 数字图片测试4.3 中文图片识别 书籍分享 专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准…...
Go七天实现RPC
0.前言 本文是学习自7天用Go从零实现RPC框架GeeRPC | 极客兔兔 在此基础上,加入自己的学习过程与理解。 1.RPC 框架 RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,允许调用不同进程空间的程序。RPC 的客户端和服务器可以…...
Elasticsearch:和 LIamaIndex 的集成
LlamaIndex 是一个数据框架,供 LLM 应用程序摄取、构建和访问私有或特定领域的数据。 LlamaIndex 是开源的,可用于构建各种应用程序。 在 GitHub 上查看该项目。 安装 在 Docker 上设置 Elasticsearch 使用以下 docker 命令启动单节点 Elasticsearch 实…...
终极解决方案:NoSleep防休眠工具让你的Windows永不休眠
终极解决方案:NoSleep防休眠工具让你的Windows永不休眠 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 你是否曾经遇到过这样的困扰?深夜下载大型文件到…...
信号处理避坑指南:ESPRIT、Root-Music等DOA估计算法,到底该怎么选?
DOA估计算法选型实战:ESPRIT与MUSIC家族的性能对决 当八通道均匀线阵捕捉到两个间隔仅5的远场信号时,算法A在信噪比15dB时成功分离目标,而算法B直到25dB才能勉强分辨——这种真实场景中的性能差异,正是工程师选择DOA(波…...
JetBrains IDE试用期重置工具:开发者的智能许可证管家
JetBrains IDE试用期重置工具:开发者的智能许可证管家 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 当开发工具的试用期倒计时成为你编码时的心理负担,当每次启动IDE都要面对那个令人焦虑…...
告别‘屎山’代码:手把手教你阅读和复用《饥荒》官方Lua源码来开发Mod
从《饥荒》源码到高效Mod开发:解锁官方Lua代码的实战指南 当你在深夜调试第37个宠物AI的bug时,是否想过游戏开发者早已为你准备好了完美解决方案?《饥荒》的官方Lua源码就像一座未被充分发掘的金矿,里面藏着Klei工程师们精心设计的…...
数字IC设计八股:面试题合集
锁存器的结构-DFF的结构-建立保持时间-亚稳态-STA-CDC。 亚稳态的成因,危害,解决方法。 建立保持时间的计算,违例的Fix,流片前和流片后。还有复位的Recovery Removal time。 CDC的解决方法。 低功耗常见设计方法,动态-静态功耗计算和分析。例如两种情况对比功耗大小。…...
植物树枝叶片果实检测数据集7220张VOC+YOLO格式
植物树枝叶片果实检测数据集7220张VOCYOLO格式数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):7220 标注数量(xml文件个数):7220…...
SaaS ERP和传统ERP,到底差在哪?
这几年,ERP这个词越来越火。但有意思的是,很多企业老板、管理层,甚至已经在用ERP的人,其实都没真正分清:“SaaS ERP”和“传统ERP”,到底差在哪。很多人会觉得:“不都是ERP吗?不就是…...
量子退火优化CPS测试用例生成的技术解析
1. 量子退火在CPS测试用例生成中的应用概述在安全关键系统(如自动驾驶、工业控制系统)的开发过程中,测试用例的质量直接关系到系统的可靠性。传统测试方法面临两大核心挑战:一是如何在庞大的输入空间中找到最具检测效力的测试用例…...
简历投了全石沉大海?实测3个免费AI简历神器,HR秒通过、面试翻3倍!
3个实测免费的AI简历神器,不用花钱、不用登录,直接让简历过ATS、获面试,应届生/职场人闭眼冲!简历优化本身就讲究精准度,尤其是ATS筛选逻辑,很多工具要么收费高,要么改完还是不贴合JD࿰…...
【亲测免费】 探索卷积神经网络之美:一键绘制专业结构图的利器
探索卷积神经网络之美:一键绘制专业结构图的利器 【下载地址】卷积神经网络结构绘制工具 本资源适用于需要展示卷积神经网络具体结构的研究人员。用户下载本项目后,按照README官方教程中的“Getting Started”部分进行操作,简单学习语法后即可…...
