一、使用流程

1) 引入坐标

org.springframework.boot

spring-boot-starter-data-redis-reactive

2.1.3.RELEASE

2) 创建bean对象(根据什么条件限流)

@Bean

public KeyResolver ipKeyResolver(){

return new KeyResolver() {

@Override

public Mono resolve(ServerWebExchange exchange) {

//此处根据用户的id做为条件限流

return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());

}

};

}

条件选择如下

用户ip地址(桶是私有)

用户用户名(桶是私有)

微服的路径(桶是共享的)

3)添加配置

routes:

- id: 微服务应用名

uri: lb://微服务应用名

predicates:

- Path=/微服务应用名/**

filters:

- StripPrefix= 1

- name: RequestRateLimiter #请求数限流 名字不能随便写

args:

key-resolver: "#{@ipKeyResolver}" #限流依据的条件bean对象id

redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率

redis-rate-limiter.burstCapacity: 1 #令牌桶总容量

二、GateWay网关实现默认令牌桶原理解析

a)springboot自动配置 E:/developSoftware/yntz_repository/org/springframework/cloud/spring-cloud-gateway-core/2.1.1.RELEASE/spring-cloud-gateway-core-2.1.1.RELEASE.jar!/META-INF/spring.factories 中org.springframework.cloud.gateway.config.GatewayRedisAutoConfiguration,

b)Lua脚本 位置: getway默认使用redis限流方式:核心内容就是如下的脚本中 spring-cloud-gateway-core-2.1.1.RELEASE.jar!/META-INF/scripts/request_rate_limiter.lua

执行原理流程解析如下:

1) 初始化对象-加载lua脚本

图1

图2

图3

2)执行脚本

local tokens_key = KEYS[1] -- 用户令牌 ip

local timestamp_key = KEYS[2] --用户今牌时间

local rate = tonumber(ARGV[1]) --放令牌速度(每秒)

local capacity = tonumber(ARGV[2])-- 桶大小

local now = tonumber(ARGV[3]) --当前时间秒值

local requested = tonumber(ARGV[4]) --当前请求数默认 1

local fill_time = capacity/rate --填满桶时间

local ttl = math.floor(fill_time*2) -- 过期时间 =填满桶时间的2倍

local last_tokens = tonumber(redis.call("get", tokens_key)) --获取当前桶中剩余令牌数

if last_tokens == nil then

last_tokens = capacity --设置桶大小

end

--redis.log(redis.LOG_WARNING, "last_tokens " .. last_tokens)

local last_refreshed = tonumber(redis.call("get", timestamp_key)) --获取上一次请求时间

if last_refreshed == nil then

last_refreshed = 0 -- 没有就是0

end

local delta = math.max(0, now-last_refreshed) -- 当前时间和上次访问时间的差值

local filled_tokens = math.min(capacity, last_tokens+(delta*rate)) --获取当前桶中剩余令牌数+ 上次访问和本次访问期间放放桶中的令牌数

local allowed = filled_tokens >= requested --判断桶中剩余令牌数,是否大于1

local new_tokens = filled_tokens --最新桶中令牌数

local allowed_num = 0 --允许的请求数

if allowed then

new_tokens = filled_tokens - requested --当前请求后的桶中的 令牌数

allowed_num = 1

end

redis.call("setex", tokens_key, ttl, new_tokens) -- new_tokens :当前剩余令牌数

redis.call("setex", timestamp_key, ttl, now) --当前时间

return { allowed_num, new_tokens }--返回容许数和剩余令牌数

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

  1. 基于Redis和 Lua 实现分布式令牌桶限流

    rpc-tech-stack 系列的实践文章 ~ 本文属于限流话题. 限流是一个很大的话题,准备把其中的所有限流器都实现一遍,以此也算全都写过了,到时候再用也不至于会心虚,毕竟真实写完成过.本文主要讲 ...

  2. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  3. java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...

    一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...

  4. java对接 布防 海康威视_基于海康威视SDK javaB/S

    基于海康威视SDK javaB/S 下载NetVideoActiveX23.cab文件,放在webRoot下面的codebase文件夹里 //全局变量定义 var m_iNowChanNo = -1; ...

  5. rs485与modbus流程图_基于Modbus协议的RS485总线通讯机设计原理及应用

    摘要:该文详细论述了基于Modbus协议的RS485总线通讯机设计原理及应用.物理结构上包括上位机.主站.和多个从站节点.在上位机与各从站节点间增加主站,承担上位机的轮询工作,使上位机从繁忙的通信工作 ...

  6. 脸书令牌怎么使用_网工知识角|QOS技术令牌桶算法一分钟速记,考试无忧

    点上方蓝字关注公众号,坚持每天技术打卡 学网络,就在IE-LAB 国内最著名的高端网络工程师培养基地 QOS是网络服务质量技术,是所有考试中都会有的考点,主要在SP的课程中详述,是高中低级的网工都有必 ...

  7. java实现layui分页_基于LayUI分页和LayUI laypage分页的使用示例

    本文介绍了LayUI分页,LayUI动态分页,LayUI laypage分页,LayUI laypage刷新当前页,分享给大家,具体如下: 效果图: 一.引用js依赖 主要是jquery-1.11. ...

  8. java 爬虫 百度新闻_基于HttpClient实现网络爬虫~以百度新闻为例

    在曾经的工作中,实现过简单的网络爬虫,没有系统的介绍过,这篇博客就系统的介绍以下怎样使用java的HttpClient实现网络爬虫. 关于网络爬虫的一些理论知识.实现思想以及策略问题.能够參考百度百科 ...

  9. java时序图工具_基于时序数据库,实现百亿级话单实时全景监控分析

    背景 随着流量业务的高速发展以及已经到来的5G时代,业务支撑系统的规模不断增大.服务不断增多,业务.应用和系统运行性能指标数据持续以指数级的速度增长,每日计费话单量已突破百亿.系统监控的实时性.准确性 ...

最新文章

  1. QTP时间格式的转换(YYYYMMDDHHMMSS)
  2. 远程桌面中Tab键不能补全的解决办法
  3. LINUX framebuffer
  4. bootstrap signin将邮件改成用户名_了解电子邮件传递背后的流程
  5. MySQL常用SQL总结
  6. Linux 之 利用Google Authenticator实现用户双因素认证
  7. kafka 同步提交 异步_Kafka 位移提交那些事儿
  8. mysql建表时添加时间默认值只存储时分秒且自动存储
  9. PDF控件Aspose.Pdf 12月新版17.12发布 | 附下载
  10. oracle清理磁盘空间
  11. 第 42 章 RTC—实时时钟
  12. 计算机win7不断重启,Win7旗舰版系统电脑反复自动重启怎么办?
  13. 2023年天津天狮学院专升本专业课如何线上考试考前准备的要求
  14. Python自学(三)
  15. 嘻哈说:设计模式之工厂方法模式
  16. python中function takes exactly_Python error TypeError: function takes exactly 1 argument (5 given)
  17. 如何快速制作gif图片
  18. 郑州大学现代远程教育《商务礼仪》课程考核作业要求院校通智慧校园
  19. 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用
  20. Java编程——杨辉三角(一)

热门文章

  1. 数字图像处理(第三版)绪论笔记
  2. python-----列表(list)下
  3. SpringBoot单元测试Mock静态方法
  4. python 3d库_python的3d库
  5. 一步入天象 eclipce 本地maven搭建
  6. Processing基础——钟表(简单)
  7. python第二周基本图形绘制
  8. java web argox打印机 用jna调用dll
  9. 单片机检测信号通断通用电路(3.3V/5V直流信号,24V+直流信号,220V交流信号)
  10. 下载vimeo视频_使用Vimeo的API和Slim构建基本的视频搜索应用