服务限流实现方案

服务限流怎么做
限流算法

  • 计数器

每个单位时间能通过的请求数固定,超过阈值直接拒绝。

通过维护一个单位时间内的计数器,每次请求计数器加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")。

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

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

相关文章

cool 中的node.js 实现一个处理第三方Api 数据的处理

1.需求 你现在是一个后端 前端跟你要一个接口 ,但是你发现 你这个接口 除了调用第三方Api的接口 有的数据还是没有 你直接返回 前端使用不了 因为都没有关于那样的数据 但是三方Api 中有其他的接口和现在的接口 经过处理 是可以实现这个前端需要的数据。遇到这样的情…

Quarkus 2.8.0引入了细粒度的Transaction API

升级概览 Quarkus 2.8.0.Final发布,特性包括:将RESTEasy Reactive作为默认 REST 层;将 GraalVM 22.0 作为默认版本;新的QuarkusTransaction API;以及 Elasticsearch Dev Services(可以自动启动dev和test模…

Python输入输出流学习笔记

Python的输入与输出 一、输入 (一)输入函数input() 函数用途: 函数input()主要用于接收单个输入 函数参数: 函数括号中可以填写输入的提示语(非必要),提示语与输入内容位于同一行 a input(…

03 OSPF 学习大纲

参考文章 1 初步认识OSPF的大致内容(第三课)-CSDN博客 2

【管理篇 / 登录】❀ 07. FortiOS 7.4 初始登录提示 ❀ FortiGate 防火墙

【简介】FortiOS 7.4在初始登录时显示的内容和以前的版本有很大的相同,很多人不熟悉英文和功能,不清楚应该怎么操作,这里就详细的介绍一下。 恢复出厂设置 为了完整的查看到启动配置内容,这里我们先将防火墙恢复出厂。 ① FortiGa…

Chat2DB:AI赋能的多数据库客户端工具,开源领航未来数据库管理

Chat2DB:开源多数据库客户端的AI革新 Chat2DB使用教程:Chat2DB使用教程_哔哩哔哩_bilibili 引言: 随着企业数据的快速膨胀,数据库管理的复杂性也在增加。此时,一个能够跨越数据库边界、并且集成先进的AI功能的工具,不…

从 `go build` 到 `go test`:Go 语言命令行工具全解析

从 go build 到 go test:Go 语言命令行工具全解析 引言go build 命令详解go test 的运用其他重要的 Go 命令结论 引言 在当今的软件开发领域,Go 语言以其简洁、高效和强大的并发处理能力受到广泛的欢迎。作为一门现代编程语言,Go 不仅拥有丰…

多标签节点分类

Multi-Label Node Classification on Graph-Structured Data,TMLR’23 Code 学习笔记 图结构数据的多标签分类 节点表示或嵌入方法 通常会生成查找表,以便将相似的节点嵌入的更近。学习到的表示用作各种下游预测模块的输入特征。 表现突出的方法是基于随机游走(ran…

书籍 - 华杉讲透孙子兵法 - 5

第四章 军形第四 赢了再打 原文 形篇 孙子曰:昔之善战者,先为不可胜,以待敌之可胜。不可胜在己,可胜在敌。故善战者,能为不可胜,不能使敌之可胜。故曰:胜可知,而不可为。 华杉详解 …

moon‘s 博客网站部署维护项目说明

项目概述 背景 博客系统致力为广大用户提供优质的互动交流平台,实现对博客发表文章、评论、图片、好友等数据的管理,同时实现了博客内容及时、快速更新的功能,系统不仅保留了传统博客系统的功能,还加上了一些人性化的界面设计,使…

分享flask_socketio配置时遇到的一些问题

flask_socketio 1.前言 flask_socketio应用启动后,在控制台中,存在着flask_socketio这些烦人的log 一堆的get和post几秒一个让我什么都看不清,因此想要关掉log 结果没想到,找了很多办法半天去不掉flask_socketio的log 试过了…

k8s之包管理器Helm

helm的作用就是通过打包的方式,把deployment service ingress这些打包在一块,一键式的部署服务。类似yum官方提供的一个类似与安装仓库的功能,可以实现一键化部署应用。 Helm的三个重要概念 ●Chart:Helm 的软件包,采…

数学建模竞赛实战-Latex公式、表格、图文排版

公式排版 Latex公式排版 行内公式:使用$$包围: 整行公式:使用$$$$包围: 公式编号: 使用$$不能自动编号: 公式编号使用equation: <

中仕教育:省考联考可以报多个省份吗?

省考联考就是多个省份在同一时间进行的公务员招聘考试&#xff0c;极大地增加了考生的选择空间。虽然是联考&#xff0c;但是招录工作都是各省份单独组织的&#xff0c;对于考生来说&#xff0c;省考联考可以报多个省份吗? 首先&#xff0c;每个省份的公务员招聘条件、考试内…

GPIO简单介绍

General Purpose Input Output 通用输入输出口(俗称IO口) 1.可配置为8种输入输出模式 模式名称性质特征浮空输入 数字输入 可读取引脚电平&#xff0c;若引脚悬空&#xff0c;则电平不确定上拉输入数字输入可读取引脚电平&#xff0c;内部连接上拉电阻&#xff0c;悬空时默认…

USB 2.0接口标准

一、USB2.0系统构成 USB&#xff08;UniversalSerialBus&#xff09;体系包括“主机&#xff08;Host&#xff09;”、“设备&#xff08;Device&#xff09;”以及“物理连接&#xff08;Connector&#xff09;”三个部分。其中主机是一个提供USB接口及接口管理能力的…

LeetCode.670. 最大交换

题目 题目链接 分析 这道题的意思是我们只能交换一次&#xff0c;需要得到最大的数字。 我们的第一个想法就是要这个数字先变成一个数组&#xff0c;便于我们操作。 然后把数组最大的数放到第一个位置&#xff0c;如果最大的数字已经在第一个位置&#xff0c;那么就把次大的…

【C++】C++中规范[ 类型转换标准 ] 的四种形式

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.回顾C语言中的类型转换1&#xff09…

RPC框架简介

RPC定义 远程过程调用&#xff08;Remote Procedure Call&#xff09;。RPC的目的就是让构建分布式计算&#xff08;应用&#xff09;更加简单&#xff0c;在提供强大的调用远程调用的同时不失去简单的本地调用的语义简洁性 RPC整体架构 服务端启动时首先将自己的服务节点信息…

一个golang小白使用vscode搭建Ununtu20.04下的go开发环境

文章目录 前言搭建go环境下载go安装包解压go压缩包完成安装配置环境变量编写一个helloword程序 安装VSCode插件安装智能提示插件安装go依赖包修改代理并重新安装依赖包 go.mod 和 go.workgo.modgo.work小试一下go.work 总结 前言 先交代一下背景&#xff0c;距离正式接触golan…