一、需求:

每个ip地址1秒内只能发送1次请求,多出来的请求返回429错误。

二、引入依赖

spring cloud gateway 默认使用redis的RateLimter限流算法来实现。所以我们要使用首先需要引入redis的依赖

<!--redis-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId><version>2.1.3.RELEASE</version>
</dependency>

三、定义KeyResolver

 //定义一个KeyResolver@Beanpublic KeyResolver ipKeyResolver(){return new KeyResolver() {@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {//获取访问者的ip地址, 通过访问者ip地址进行限流, 限流使用的是Redis中的令牌桶算法String hostString = exchange.getRequest().getRemoteAddress().getHostString();return Mono.just(hostString);}};}

四、application.yml

spring:application:name: sysgatewaycloud:gateway:globalcors:cors-configurations:'[/**]': # 匹配所有请求allowedOrigins: "*" #跨域处理 允许所有的域allowedMethods: # 支持的方法- GET- POST- PUT- DELETEroutes:#是指的两个服务- id: goodsuri: lb://goodspredicates:- Path=/goods/**filters:- StripPrefix= 1- name: RequestRateLimiter #请求数限流 名字不能随便写args:key-resolver: "#{@ipKeyResolver}"redis-rate-limiter.replenishRate: 1  #令牌桶每秒填充平均速率redis-rate-limiter.burstCapacity: 1  #令牌桶总容量- id: systemuri: lb://systempredicates:- Path=/system/**filters:- StripPrefix= 1# 配置Redis 127.0.0.1可以省略配置redis:host: 192.168.200.128port: 6379
server:port: 9101
eureka:client:service-url:defaultZone: http://127.0.0.1:6868/eurekainstance:prefer-ip-address: true
- burstCapacity:令牌桶总容量。
- replenishRate:令牌桶每秒填充平均速率。
- key-resolver:用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象。通过在replenishRate和中设置相同的值来实现稳定的速率burstCapacity。设置burstCapacity高于时,可以允许临时突发replenishRate。在这种情况下,需要在突发之间允许速率限制器一段时间(根据replenishRate),因为2次连续突发将导致请求被丢弃(HTTP 429 - Too Many Requests)key-resolver: "#{@userKeyResolver}" 用于通过SPEL表达式来指定使用哪一个KeyResolver.如上配置:表示 一秒内,允许 一个请求通过,令牌桶的填充速率也是一秒钟添加一个令牌。最大突发状况 也只允许 一秒内有一次请求,可以根据业务来调整 。

五、测试结果

网关限流(令牌桶算法)相关推荐

  1. 限流——漏桶算法和令牌桶算法的区别

    文章目录 限流 漏桶算法 令牌桶算法 漏桶算法和令牌桶算法的区别 时间窗口 时间窗口和令牌桶优缺点 限流 在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流 缓存:缓存的目的是提升系统访问速度 ...

  2. java网关限流_基于网关GateWay实现限流-令牌桶 及原理解析

    一.使用流程 1) 引入坐标 org.springframework.boot spring-boot-starter-data-redis-reactive 2.1.3.RELEASE 2) 创建b ...

  3. 限流-漏桶算法、令牌桶算法

    1.问题 系统的某个接口访问量突然激增,没多久接口崩溃,形成连锁反应,导致整个系统崩溃. 如何应对这种情况呢? 为我们的接口加上"保险丝",预防这种突发情况,接口压力过大,造成整个 ...

  4. 高并发系统限流-漏桶算法和令牌桶算法

    参考: https://www.cnblogs.com/xuwc/p/9123078.html http://www.cnblogs.com/LBSer/p/4083131.html https:// ...

  5. 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:雄 ...

  6. 带你快速了解:限流中的漏桶和令牌桶算法

    在前文 <限流熔断是什么,怎么做,不做行不行?>中针对 "限流" 动作,有提到流量控制其内部对应着两种常用的限流算法. 其分别对应漏桶算法和令牌桶算法.因此会有的读者会 ...

  7. 用令牌桶算法完成API接口限流

    这是张富涛的第15篇原创 用令牌桶算法完成API接口限流 本文介绍了"令牌桶算法",和使用lua+redis实现基于令牌桶算法的限流. 1. 限流需求的产生背景 软件开发时偶尔会面 ...

  8. 接口限流算法:漏桶算法令牌桶算法

    工作中对外提供的API 接口设计都要考虑限流,如果不考虑限流,会成系统的连锁反应,轻者响应缓慢,重者系统宕机,整个业务线崩溃,如何应对这种情况呢,我们可以对请求进行引流或者直接拒绝等操作,保持系统的可 ...

  9. 简单介绍4种限流算法!(固定窗口计数器算法、滑动窗口计数器算法、漏桶算法、令牌桶算法)...

    作者:架构小菜 链接:https://www.jianshu.com/p/7987bf427b5b 简单介绍 4 种非常好理解并且容易实现的限流算法! 一.固定窗口计数器算法 规定我们单位时间处理的请 ...

最新文章

  1. 下拉菜单被挡住了,DIV置于最底层的方法
  2. python 调用函数 开销_减少python中的函数调用开销
  3. 支付宝发布黑科技“如影计划”,这真的不是愚人节的玩笑
  4. 面试题: mysql数据库 已看1 简单的sql练习
  5. 《大数据算法》一1.2 大数据算法
  6. php中的empty和isset
  7. c语言程序设计实践教程张卫国,C语言程序设计实践教程
  8. php 遮罩层,Jquery实现遮罩层的方法
  9. [UE4]导入 PSD 文件失败的解决办法:输出为 PNG,将 PNG 再保存为 PSD 导入
  10. DiskGenius的 “终止位置参数溢出”错误解决方法。
  11. 智能照明c语言程序,基于单片机的智能照明控制系统设计方案(含AD+源代码)...
  12. mysql sysbench 1.0.X
  13. docker rabbitmq_RabbitMQ消息中间件快速入门
  14. JS设计模式书籍、原则
  15. python win32com 批量加密excel 新增sheet 调整sheet顺序
  16. 2022年第十三届蓝桥杯大赛软件省赛Java学B组试题
  17. 面试题汇总二 Java 多线程篇
  18. IT职场求生法则(3)- 部门经理及副总适用法则
  19. 埃森哲五年java待遇_【埃森哲工资】java开发工程师待遇-看准网
  20. Windows10系统错误码0xc0000142怎么修复?

热门文章

  1. java 开发 jvm_Java开发人员应了解的JVM流行语
  2. servlet异步_关于Servlet和异步Servlet
  3. java ee jsp_EE JSP:使用自定义标签库生成动态内容
  4. java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高
  5. Nutshell中的Java 8语言功能-第2部分
  6. JSON的JUnit Hamcrest Matcher
  7. Java命令行界面(第6部分):JOpt简单
  8. OpenMap教程5 – 3层GIS应用程序
  9. Java EE 8 MVC:全局异常处理
  10. javafx2_JavaFX 2 GameTutorial第4部分