SpringCloudGateway--基于redis实现令牌桶算法

news2024/11/15 15:39:52

目录

一、限流算法

        1、计数器算法

        2、漏桶算法

        3、令牌桶算法

二、Gateway中的限流


一、限流算法

        1、计数器算法

                计数器算法是指从第一个请求开始,每多一个请求就加1,假设设置每秒限流100,当在一秒钟前500ms已经达到100,后面的500ms中的所有请求都会被拒绝。后面500ms的请求被拒绝掉这种现象称为“突刺现象”

        2、漏桶算法

                漏桶算法可以解决“突刺现象”。就是跟生活中漏桶一样,一个水桶,下面有个洞往外漏水,会控制水流速度,不论水桶中有多少睡,漏水的速率保持一致。但是当水到达水桶上限,这时候就不行了。主要是当某时间段有大量请求,但是已经达到漏桶上限的情况。

        3、令牌桶算法

                令牌桶算法是对漏桶算法的一种改进。就是在桶中放入令牌,请求获取到令牌后才能继续执行,如果桶中没有令牌,请求要么继续等待,要么直接拒绝。

                因为令牌是按照一定的速率放置到桶中,所以可以一定程度上解决突发访问。

二、Gateway中的限流

        SpringCloudGateWay项目参考:SpringCloudGateway--自动路由映射与手动路由映射_雨欲语的博客-CSDN博客

       注意需要添加redis依赖包:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

       算法工厂由代码提供,令牌桶由redis提供,底层逻辑是lua脚本提供,已经封装好的。

       限流实现方式主要是实现KeyResolver类,重写里面的resolve方法:

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;


@Component
public class MyKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        String hostAddress = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
        return Mono.just(hostAddress);
    }
}

        其中just方法参数表示根据什么限流,这里我使用的是根据ip地址进行限流。

        配置文件:

server:
  port: 9999
spring:
  application:
    name: service-gateway
  cloud: # 配置Spring Cloud相关属性
    gateway:
      discovery: # 配置网关发现机制
        locator: # 配置处理机制
          enabled: false # 开启网关自动映射处理逻辑
          lower-case-service-id: true # 开启小写转换
      filter:
        secure-headers:
          disable:
            - strict-transport-security
            - x-download-options
      routes: # 配置网关中的一个完整路由,包括命名,地址,谓词集合(规则),过滤器集合
        - id: service-one # 路由定义的命名,唯一即可。命名规则符合Java中的变量符命名规则
          uri: lb://service-one # 当前路由定义对应的微服务转发地址,lb - 代表loadbalance
          predicates: # 配置谓词集合
            - Path=/service/**  
          filters:
            - name: RequestRateLimiter
              args:
                keyResolver: '#{@myKeyResolver}' #使用springEL表达式,从spring容器中找对象,并赋值。'#{@beanName}'
                redis-rate-limiter.replenishRate: 1 #生产令牌速度,每秒多少个令牌
                redis-rate-limiter.burstCapacity: 5 # 令牌桶容量

          metadata:
            connect-timeout: 15000 #ms
            response-timeout: 15000 #ms
    nacos:
      username: nacos
      password: nacos
      discovery:
        server-addr: 127.0.0.1
        group: dev
        namespace: dev
        metadata:
          version: v1.0.0
    redis:
      database: 0
      host: ${127.0.0.1}
      port: ${6379}
      password:
      lettuce:
        pool:
          max-active: 80
          max-idle: 80
          min-idle: 1
          max-wait: 5000
          time-between-eviction-runs: 1m
        shutdown-timeout: 10000ms
      timeout: 15000ms


        启动前我们查看redis,keys *:

        可以发现里面此时没有令牌。

        启动项目,然后使用jmeter发送请求测试,这里我配置的每秒生产5个令牌,在jmeter中每秒发送10个请求:

        其中失败的请求会返回Too Many Requests,redis查看令牌,可以看到其中本地的ip地址127.0.0.1:

 

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

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

相关文章

华为云计算HCIA学习笔记-第1章 云计算基础概念

1.1 云计算课程安排说明 &#xff08;IA-虚拟化-FC / IP-Linux OpenStack 桌面云/IE-备份容灾迁移&#xff09; 1.2 为什么云计算IA讲虚拟化&#xff1f; 提前告知学员&#xff0c;为什么IA课程要重点讲解虚拟化&#xff1f;云计算基于OpenStack&#xff0c;其底层虚拟化技术…

赞!中原银行|古风金融产品体验运营数字驾驶舱大屏!

本期「V友故事」&#xff1a;中原银行设计师作品——古风金融产品体验运营大屏 金融行业数字化转型是近年来提出的一个关键词&#xff0c;它不仅在改变金融服务的结构、形式和方式&#xff0c;而且也在影响中国金融行业的扩张规模&#xff0c;基于此行业趋势&#xff0c;金融从…

加密图像的脆弱水印及应用

原文题目&#xff1a;《A self-embedding secure fragile watermarking scheme with high quality recovery》 学习笔记&#xff1a; 应用场景 为了确保图像在传输过程中不被损坏&#xff0c;在将原始图像发送到云端之前&#xff0c;将用于篡改检测和恢复的水印嵌入到原始图像…

docker逃逸复现--pid=host模式下的逃逸

漏洞原理当docker以--pidhost模式启动时&#xff0c;你可以通过在容器进程中注入一些shellcode进行逃逸。相当于给了docker Linux中的CAP_SYS_PTRACE权限--pidhost&#xff1a;意味着宿主机与容器公享一套pid&#xff0c;如此做容器就可以访问并跟踪宿主机的进程Linux中的CAP_S…

【微信小程序】-- 页面导航 -- 导航传参(二十四)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

MyBatis框架快速入门 - 基本使用

文章目录MyBatisMyBatis基本介绍MyBaits快速入门Mapper代理开发MyBatis配置文件MyBatis MyBatis基本介绍 什么是MyBatis? MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software found…

FPGA实现模拟视频BT656解码 TW2867四路PAL采集拼接显示 提供工程源码和技术支持

目录1、前言2、模拟视频概述3、模拟视频颜色空间4、逐行与隔行5、BT656数据与解码BT656数据格式BT656数据解码6、TW2867芯片解读与配置TW2867芯片解读TW2867芯片配置TW2867时序分析7、设计思路与框架8、vivado工程详解9、上板调试验证10、福利&#xff1a;工程代码的获取1、前言…

【Spring6】| GoF之工厂模式

目录 一&#xff1a;GoF之工厂模式 1. 工厂模式的三种形态 2. 简单工厂模式 3. 工厂方法模式 4. 抽象工厂模式&#xff08;了解&#xff09; 一&#xff1a;GoF之工厂模式 &#xff08;1&#xff09;GoF&#xff08;Gang of Four&#xff09;&#xff0c;中文名——四人组…

前端开发总结的一些技巧和实用方法(2)

本文主要介绍一些JS中用到的小技巧和实用方法&#xff0c;可以在日常Coding中提升幸福度&#xff0c;也可以通过一些小细节来增加代码可读性&#xff0c;让代码看起来更加优雅&#xff0c;后续将不断更新1.数组 map 的方法 (不使用Array.Map) Array.from 还可以接受第二个参数…

一文讲解JDK自带监控工具查看 JVM 情况

在一文带你了解阿里的开源Java诊断工具 &#xff1a;Arthas_出世&入世的博客-CSDN博客这篇文章中介绍了Arthas的强大功能&#xff0c;但是有些生成环境没有安装&#xff0c;所以还是需要会使用JDK 自带监控JVM的工具。 常用的JDK 自带监控工具如下&#xff1a; jps&#x…

CDH大数据平台入门篇之搭建与部署

一、CDH介绍 1.CDH 是一个强大的商业版数据中心管理工具 提供了各种能够快速稳定运行的数据计算框架&#xff0c;如Spark&#xff1b; 使用Apache Impala做为对HDFS、HBase的高性能SQL查询引擎&#xff1b; 使用Hive数据仓库工具帮助用户分析数据&#xff1b; 提供CM安装HBas…

真正的IT技术男是什么样的?

我们经常会听到很多对IT男士的调侃称呼&#xff0c;“屌丝”、“宅男”&#xff0c;会逗的大家捧腹大笑。但是&#xff0c;大家要不要以为称呼IT男是“屌丝”、“宅男”&#xff0c;就当真以为他们是这样了。今天&#xff0c;青鸟学姐就带大家一起来了解一下&#xff0c;真正的…

代码还原小试牛刀(一):魔改的MD5

一、目标 2023年了&#xff0c;MD5已经是最基础的签名算法了&#xff0c;但如果你还只是对输入做了简单的MD5&#xff0c;肯定会被同行们嘲笑。加点盐&#xff08;salt&#xff09;是一种基本的提升&#xff0c;但在这个就业形势严峻的时代&#xff0c;仅仅加盐肯定不够了。 …

原腾讯QQ空间负责人,T13专家,黄希彤被爆近期被裁员,裁员原因令人唏嘘。。...

点击上方“码农突围”&#xff0c;马上关注这里是码农充电第一站&#xff0c;回复“666”&#xff0c;获取一份专属大礼包真爱&#xff0c;请设置“星标”或点个“在看这是【码农突围】的第 431 篇原创分享作者 l 突围的鱼来源 l 码农突围&#xff08;ID&#xff1a;smartyuge&…

【论文速递】WACV 2023 - 一种全卷积Transformer的医学影响分割模型

【论文速递】WACV 2023 - 一种全卷积Transformer的医学影响分割模型 【论文原文】&#xff1a;The Fully Convolutional Transformer for Medical Image Segmentation 【作者信息】&#xff1a;Athanasios Tragakis, Chaitanya Kaul,Roderick Murray-Smith,Dirk Husmeier 论…

app上架专用软著认证电子版权在主流应用商店的使用说明2023年最新版

软著认证电子版权在主流应用商店的使用说明 目录 一、 华为应用商店 二、 腾讯应用宝 三、 小米开放平台 小米应用提交&#xff1a; 小米游戏提交&#xff1a; 四、 OPPO开放平台 OPPO应用提交: OPPO游戏&#xff08;App&#xff09;提交: OPPO小游戏&#xff08;快应…

Python爬虫之用Selenium做爬虫

我们在用python做爬虫的时候&#xff0c;除了直接用requests的架构&#xff0c;还有Scrapy、Selenium等方式可以使用&#xff0c;那么今天我们就来聊一聊使用Selenium如何实现爬虫。 Selenium是什么&#xff1f; Selenium是一个浏览器自动化测试框架&#xff0c;是一款用于We…

2022年数维杯国际大学生数学建模挑战赛B题红VS蓝求解论文及程序

2022年数维杯国际大学生数学建模挑战赛 B题 红VS蓝 原题再现&#xff1a; 在现代战争中&#xff0c;攻守双方都需要引入有效的战争策略&#xff0c;以增加战争威胁并减少损失。只有形成相对稳定、平衡的战争态势&#xff0c;才能尽快实现达成共识的最终目标。 鉴于上述战争问…

代码随想录算法训练营第十七天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

打卡第17天&#xff0c;补卡中&#xff0c;懒狗又歇了几天。 今日任务 110.平衡二叉树257.二叉树的所有路径404.左叶子之和 110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个…

(全网最详细)Mysql下载安装和配置方法(看了必成功)

Mysql下载 MySQL官网下载地址&#xff1a;MySQL 点击进行下载 解压到你想要安装的目录 新建my.ini文件复制以下内容粘贴进去修改basedir安装的目录&#xff0c;datadir安装的目录\data [mysqld] #设置3306端口 port3306 #设置mysql的安装目录 basedir #设置mysql数据库的数据…