gateway基于redis做限流处理

文章目录

  • 前言
  • 一、如何限流?
  • 二、使用步骤
  • 总结


前言

限流的意义

限流是针对于并发量比较高的时候,如果不针对对应的服务做限流操作,可能造成服务器压力过大,宕机等情况.


一、如何限流?

限流的方式:

  • 计数器算法(Counter)

–设计一个计数器,比如一个全局的变量,每次请求后+1,并且在限定时间内比如一分钟,将计数器重置一次。当每次请求时查看计数器是否已经为临界值了,是就限流。但是这个有个缺点就是比如在55秒前没有请求,在55-70秒时有20000次请求,而计数器的临界值则是10000,此时的在60秒时清空了一次,这20000次的请求也是可以进来的。

  • 漏桶算法(Leaky Bucket)

–就是所有的请求都放到gateway中,然后再去一个一个分发下去到对应的服务,这样做的缺点就是在大量数据的请求下可能gateway根本无法承受,而下游的服务依然在空闲当中或是毫无压力。

  • 令牌桶算法(Token Bucket)

–设计一定数量的令牌,每次请求都会取一个令牌,并且令牌桶会根据规则自动生成令牌。大量请求过来时超过了限定的值,桶里的令牌瞬间被抢空,剩下没有拿到令牌的请求将会失败,并且桶中的令牌一直是有序增加的剩下的请求也能抢到。目前这是一种最优的解决方案。

二、使用步骤

Gateway的令牌桶算法实现:

Gateway中的限流算法就是采用了令牌桶算法,支持三种令牌桶算法:基于URI限流、基于请求参数限流、基于IP限流。

  • 引入依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--redis支持-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
  • 添加配置信息
server:port: 9003
eureka:client:fetch-registry: true # 从 eureka 服务端获取注册信息register-with-eureka: true # 将自身注册到 eureka 服务端service-url:defaultZone: http://localhost:9000/eurekainstance:prefer-ip-address: true # 开启采用 IP 注册形式
spring:application:name: flowershop-gatewaycloud:gateway:routes:- id: gateway-flower #路由id,唯一uri: lb://flowershop-common #路由地址,针对哪个服务的路由predicates: #断言- Path=/** filters:# 指定限流过滤器- name: RequestRateLimiterargs:# 基于令牌桶算法,生成令牌的速率redis-rate-limiter.replenishRate: 1# 令牌桶的最大容量redis-rate-limiter.burstCapacity: 1# 指定生成令牌的算法解析策略,这里是使用了SpEL表达式,获取寻找名字是 keyResolver 的bean对象key-resolver: "#{@keyResolver}"redis:host: 192.168.3.52database: 0port: 6379password:jedis:pool:max-idle: 100max-wait:min-idle: 5timeout: 500
  • 令牌算法

Gateway中有多种限流策略,通过URI进行限流、通过请求参数限流、通过IP地址限流,但是我们只可以去实现其中一种。可以去实现 KeyResolver 接口
可以有多种方式实现:在启动类中实现、使用配置类实现
这里我们使用配置类

/*** 令牌桶算法中,令牌的生成算法*/
@Configuration
public class KeyResolverConfiguration{@Beanpublic KeyResolver keyResolver() {return new KeyResolver() {@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {// 这里根据请求【URI】进行限流return Mono.just(exchange.getRequest().getPath().toString());}};}//    @Bean
//    public KeyResolver keyResolver() {
//        return new KeyResolver() {
//            @Override
//            public Mono<String> resolve(ServerWebExchange exchange) {
//                // 这里根据请求【请求参数username】进行限流
//                return Mono.just(exchange.getRequest().getQueryParams().getFirst("username"));
//            }
//        };
//    }
//
//    @Bean
//    public KeyResolver keyResolver() {
//        return new KeyResolver() {
//            @Override
//            public Mono<String> resolve(ServerWebExchange exchange) {
//                // 这里根据请求【IP地址】进行限流
//                return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
//            }
//        };
}

总结

一般情况下,项目中都会用到redis作为缓存,既然这样,我们完全可以用redis做gateway限流处理,可以减少sential插件的引入以及学习成本,何不美哉~

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

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

相关文章

Kafka消费者在Java中的应用

加油&#xff0c;新时代打工人&#xff01; Kafka生产者在Java中的应用 创建Kafka消费者配置 Properties props new Properties(); props.setProperty("bootstrap.servers", "node1.itcast.cn:9092"); props.setProperty("group.id", "t…

Redis 和 Mysql 数据库数据如何保持一致性

Redis 和 Mysql 数据库数据如何保持一致性 保持Redis和MySQL数据库数据一致性是一个常见且重要的问题&#xff0c;特别是在使用Redis作为MySQL数据库的缓存层时。以下是几种常用的保证二者数据一致性的策略和方法&#xff1a; 双写一致性&#xff08;同步更新&#xff09;&…

KIOXIA铠侠CD8P-R NVMe 2.0 PCIe 5.0 KCD81PUG3T84大容量SSD

今天给大家介绍一下KIOXIA铠侠CD8P-R系列3T84容量固态硬盘SSD,这是一款面向数据中心的NVMe™ SSD&#xff0c;专为支持各种规模的分布式和云应用而优化&#xff0c;包括大数据/IoT、在线交易处理和虚拟化。 接口&#xff1a; PCIe 5.0 (32 GT/s x4) 接口 随机读取速度&#x…

Windows完全卸载MySQL后再下载安装(附安装包)

目录 友情提醒第一章&#xff1a;如何完全卸载干净mysql教程&#xff08;三个步骤完全卸载&#xff09;1&#xff09;步骤一&#xff1a;卸载程序2&#xff09;步骤二&#xff1a;删除文件3&#xff09;步骤三&#xff1a;删除注册表信息 第二章&#xff1a;下载软件两种方式1&…

网桥设置介绍

网桥(Networking Bridge),在计算机网络中,是一种将两个或多个网络段(物理或逻辑分段)连接在一起的设备。它工作在 OSI 模型的数据链路层(第二层),可以转发、过滤或阻止网络流量。网桥主要用于将不同的网络分段连接起来,以便它们表现为一个统一的网络。 以下是一些关…

RuleEngine规则引擎底层改造AviatorScript 之公式规则

前情提要&#xff0c;看上一个文章&#xff0c;具体要实现的效果就是 当然上来的问题就是前端的问题&#xff0c;这个框首先他们用的是富文本&#xff0c;富文本传到后台的结果是前端脚本&#xff0c;带着h5的标签&#xff0c;后面改成了这个&#xff0c;当时这个东西其实和后…

【力扣】238. 除自身以外数组的乘积

238. 除自身以外数组的乘积 题目描述 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使…

Java中常见的设计模式(持续更新中)

文章目录 介绍模板设计模式介绍优势代码 装饰者设计模式介绍套路代码 单例设计模式介绍步骤分类代码 多例设计模式介绍步骤代码 工厂设计模式介绍步骤代码 介绍 是一套被反复使用&#xff0c;多数人知晓&#xff0c;经过分类编目的&#xff0c;代码设计经验的总结使用设计模式…

express操作mysql数据库的方法总结

作为前端&#xff0c;我们无需去考虑数据库的问题&#xff0c;业务场景需要的话&#xff0c;我们可以mock数据&#xff0c;满足暂时的联调场景。但是对于数据库&#xff0c;我们前端可以不用&#xff0c;却不能不了解不懂。所以这篇文章整理下&#xff0c;nodejs框架express中怎…

007 spring aop(通知)(xml)

文章目录 pom.xmlLogAspect.javaStudentServiceImpl.javaStudentService.javaapplicationContext.xmlStudentServiceImplTest.java pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

IDEA+Docker远程一键部署SpringBoot项目

一.引语 本文将学习使用IDEADocker远程一键部署SpringBoot项目&#xff0c;对比上传jar包到服务器&#xff0c;再通过java指令运行项目&#xff0c;极大程度的提高了项目部署效率。可谓不用不知道&#xff0c;一用再也停不下来~ 为了后续学习方便&#xff0c;需要提前进行如下…

Firebase集成

目标&#xff1a; 1&#xff09;集成Firebase; 2) 集成Firebase Crashlytics&#xff0c;监控APP崩溃 海外APP开发需要科学上网。 一、Firebase是什么&#xff1f; Firebase 是一个应用开发平台&#xff0c;可帮助您构建和拓展用户喜爱的应用和游戏。提供了应用的构建、发布…

Nuxt3 实战 (三):使用 release-it 自动管理版本号和生成 CHANGELOG

release-it 能做什么&#xff1f; 增加版本号并提交 Git生成变更日志&#xff08;Changelog&#xff09;并提交到 Git创建 Git 标签并推送到远程仓库发布到 npm 等软件仓库在 GitHub、GitLab 等平台创建发行版 前置知识 在看这篇文章之前&#xff0c;我们有必要了解一下 Sem…

css不知道宽度,如何绘制一个正方形

我们可以给当前盒子加一个伪元素&#xff0c;设置padding-bottom: 100%&#xff0c;就可以绘制一个正方形 <div class"parent"><div></div><div></div><div></div> </div> .parent{width:100%;padding:20px;displ…

Few-Shot目标检测数据集 | Few-Shot目标检测数据集_已经整理成MS-COCO数据格式_含60000+张图_可直接用于目标检测算法训练

项目应用场景 面向 Few-Shot 目标检测场景&#xff0c;项目提供 6000 张图&#xff0c;已经整理成 MS-COCO 数据格式&#xff0c;可用于 Few-Shot 目标检测的训练数据集&#xff0c;或作为 Few-Shot 目标检测数据集的补充。 数据集展示 数据集下载 > 具体参见项目 README.m…

人工智能_大模型023_AssistantsAPI_01_OpenAI助手的创建_API的调用_生命周期管理_对话服务创建---人工智能工作笔记0159

先来说一下一些问题: 尽量不要微调,很麻烦,而且效果需要自己不断的去测试. 如果文档中有图表,大量的图片去分析就不合适了. 是否用RAG搜索,这个可以这样来弄,首先去es库去搜能直接找到答案可以就不用去RAG检索了,也可以设置一个分,如果低于60分,那么就可以去进行RAG检索 微…

Teachable Machine模型之TensorFlow使用篇

前言: 使用在teachable machine训练的h5格式模型 tensorflow使用篇 1. 使用teachable machine训练模型 地址: 传送门, 需要梯子翻一下 训练后, 导出的时候可以选择三种类型 导出模型文件 converted_keras.zip (py版) 解压后得到 2. py项目中使用模型 根据你当时使用tea…

7.网络编程-安全

目录 引言 Session Cookie JWT (JSON Web Token) 网络攻击 CSRF DDoS 其他常见网络攻击类型及应对措施 引言 Session、Cookie 和 JWT 都是Web开发中用于实现用户状态管理和身份验证的技术。它们各自有不同的特点和应用场景&#xff1a; Session Session 是一种服务器…

基于erp业务的责任链模式实战

Handler接口是用来规范所有的责任链节点都要实现 处理数据的方法 AbstractSchHandlerContains 是责任链节点保存的抽象类 ScheduleHandlerContains 子类可以覆盖责任链节点保存容器实现自定义遍历责任链节点容器方法设置自定义容器 一. 创建责任链节点接口 用于规范责任链的处理…

volta(轻松切换管理Node.js版本)

Node.js版本管理 Volta提供了一个简单直观的命令行界面&#xff0c;可以轻松地安装、卸载、更新和切换Node.js版本。 Volta 既可以全局使用&#xff0c;也可以在项目级别使用&#xff0c;可以为每个项目单独设置node版本&#xff0c;nvm不行。 下载安装Volta 参考&#xff1a; …