java网关限流_基于网关GateWay实现限流-令牌桶 及原理解析
一、使用流程
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实现限流-令牌桶 及原理解析相关推荐
- 基于Redis和 Lua 实现分布式令牌桶限流
rpc-tech-stack 系列的实践文章 ~ 本文属于限流话题. 限流是一个很大的话题,准备把其中的所有限流器都实现一遍,以此也算全都写过了,到时候再用也不至于会心虚,毕竟真实写完成过.本文主要讲 ...
- java项目----教务管理系统_基于Java的教务管理系统
java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...
- java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...
一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...
- java对接 布防 海康威视_基于海康威视SDK javaB/S
基于海康威视SDK javaB/S 下载NetVideoActiveX23.cab文件,放在webRoot下面的codebase文件夹里 //全局变量定义 var m_iNowChanNo = -1; ...
- rs485与modbus流程图_基于Modbus协议的RS485总线通讯机设计原理及应用
摘要:该文详细论述了基于Modbus协议的RS485总线通讯机设计原理及应用.物理结构上包括上位机.主站.和多个从站节点.在上位机与各从站节点间增加主站,承担上位机的轮询工作,使上位机从繁忙的通信工作 ...
- 脸书令牌怎么使用_网工知识角|QOS技术令牌桶算法一分钟速记,考试无忧
点上方蓝字关注公众号,坚持每天技术打卡 学网络,就在IE-LAB 国内最著名的高端网络工程师培养基地 QOS是网络服务质量技术,是所有考试中都会有的考点,主要在SP的课程中详述,是高中低级的网工都有必 ...
- java实现layui分页_基于LayUI分页和LayUI laypage分页的使用示例
本文介绍了LayUI分页,LayUI动态分页,LayUI laypage分页,LayUI laypage刷新当前页,分享给大家,具体如下: 效果图: 一.引用js依赖 主要是jquery-1.11. ...
- java 爬虫 百度新闻_基于HttpClient实现网络爬虫~以百度新闻为例
在曾经的工作中,实现过简单的网络爬虫,没有系统的介绍过,这篇博客就系统的介绍以下怎样使用java的HttpClient实现网络爬虫. 关于网络爬虫的一些理论知识.实现思想以及策略问题.能够參考百度百科 ...
- java时序图工具_基于时序数据库,实现百亿级话单实时全景监控分析
背景 随着流量业务的高速发展以及已经到来的5G时代,业务支撑系统的规模不断增大.服务不断增多,业务.应用和系统运行性能指标数据持续以指数级的速度增长,每日计费话单量已突破百亿.系统监控的实时性.准确性 ...
最新文章
- QTP时间格式的转换(YYYYMMDDHHMMSS)
- 远程桌面中Tab键不能补全的解决办法
- LINUX framebuffer
- bootstrap signin将邮件改成用户名_了解电子邮件传递背后的流程
- MySQL常用SQL总结
- Linux 之 利用Google Authenticator实现用户双因素认证
- kafka 同步提交 异步_Kafka 位移提交那些事儿
- mysql建表时添加时间默认值只存储时分秒且自动存储
- PDF控件Aspose.Pdf 12月新版17.12发布 | 附下载
- oracle清理磁盘空间
- 第 42 章 RTC—实时时钟
- 计算机win7不断重启,Win7旗舰版系统电脑反复自动重启怎么办?
- 2023年天津天狮学院专升本专业课如何线上考试考前准备的要求
- Python自学(三)
- 嘻哈说:设计模式之工厂方法模式
- python中function takes exactly_Python error TypeError: function takes exactly 1 argument (5 given)
- 如何快速制作gif图片
- 郑州大学现代远程教育《商务礼仪》课程考核作业要求院校通智慧校园
- 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用
- Java编程——杨辉三角(一)