From b61e57e1329e00ea8ca1efa8f9255b65241b9c32 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Sat, 10 Aug 2024 17:12:11 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4ip=E9=99=90?= =?UTF-8?q?=E6=B5=81=E5=8D=95=E4=BD=8D=E4=B8=BAQPS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整ip限流单位为QPS --- sql/mysql5/youlai_boot.sql | 3 +-- sql/mysql8/youlai_boot.sql | 3 +-- .../common/constant/SystemConstants.java | 11 ++-------- .../system/filter/RedisRateLimiterFilter.java | 22 ++++++------------- 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/sql/mysql5/youlai_boot.sql b/sql/mysql5/youlai_boot.sql index 0911e89f..0abf4260 100644 --- a/sql/mysql5/youlai_boot.sql +++ b/sql/mysql5/youlai_boot.sql @@ -37,8 +37,7 @@ CREATE TABLE `sys_config` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='系统配置'; -INSERT INTO `sys_config` VALUES(1,'IP限流控制单位时长','IP_RATE_LIMIT_MINUTE','1','IP限流控制单位时长(分钟)','2024-08-10 14:31:34','2','2024-08-10 14:53:51','2',0); -INSERT INTO `sys_config` VALUES(2,'IP限流控制最大访问次数配置','IP_RATE_LIMIT_COUNT','100','IP限流控制一个单位时长内最大访问次数','2024-08-10 14:31:51','2','2024-08-10 14:53:09','2',0); +INSERT INTO `sys_config` VALUES(1,'IP请求限制QPS阈值','IP_RATE_LIMIT_COUNT_QPS','10','IP请求限制QPS阈值','2024-08-10 14:31:34','2','2024-08-10 14:53:51','2',0); -- ---------------------------- -- Table structure for sys_dept diff --git a/sql/mysql8/youlai_boot.sql b/sql/mysql8/youlai_boot.sql index c587e890..1540f4e8 100644 --- a/sql/mysql8/youlai_boot.sql +++ b/sql/mysql8/youlai_boot.sql @@ -38,8 +38,7 @@ CREATE TABLE `sys_config` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='系统配置'; -INSERT INTO `sys_config` VALUES(1,'IP限流控制单位时长','IP_RATE_LIMIT_MINUTE','1','IP限流控制单位时长(分钟)','2024-08-10 14:31:34','2','2024-08-10 14:53:51','2',0); -INSERT INTO `sys_config` VALUES(2,'IP限流控制最大访问次数配置','IP_RATE_LIMIT_COUNT','100','IP限流控制一个单位时长内最大访问次数','2024-08-10 14:31:51','2','2024-08-10 14:53:09','2',0); +INSERT INTO `sys_config` VALUES(1,'IP请求限制QPS阈值','IP_RATE_LIMIT_COUNT_QPS','10','IP请求限制QPS阈值','2024-08-10 14:31:34','2','2024-08-10 14:53:51','2',0); -- ---------------------------- -- Table structure for sys_dept diff --git a/src/main/java/com/youlai/system/common/constant/SystemConstants.java b/src/main/java/com/youlai/system/common/constant/SystemConstants.java index 7c9ba50e..26e52fad 100644 --- a/src/main/java/com/youlai/system/common/constant/SystemConstants.java +++ b/src/main/java/com/youlai/system/common/constant/SystemConstants.java @@ -24,15 +24,8 @@ public interface SystemConstants { String ROOT_ROLE_CODE = "ROOT"; /** - * IP限流最大分钟数配置系统配置KEY + * IP请求限制QPS阈值配置KEY */ - String CONFIG_IP_RATE_LIMIT_MINUTE_KEY = "IP_RATE_LIMIT_MINUTE"; - - /** - * IP限流次数配置系统配置KEY - * 在最大分钟数内,允许访问的次数 - * @since 1.0.0 - */ - String CONFIG_IP_RATE_LIMIT_COUNT_KEY = "IP_RATE_LIMIT_COUNT"; + String CONFIG_IP_RATE_LIMIT_QPS_KEY = "IP_RATE_LIMIT_COUNT_QPS"; } diff --git a/src/main/java/com/youlai/system/filter/RedisRateLimiterFilter.java b/src/main/java/com/youlai/system/filter/RedisRateLimiterFilter.java index a227d226..06b2db46 100644 --- a/src/main/java/com/youlai/system/filter/RedisRateLimiterFilter.java +++ b/src/main/java/com/youlai/system/filter/RedisRateLimiterFilter.java @@ -37,8 +37,8 @@ public class RedisRateLimiterFilter extends OncePerRequestFilter { /** * 确认是否限流方法 - * 默认情况下:限制同一个IP在一分钟内只能访问100次,可以通过修改系统配置进行调整 - * 这里也可以进行扩展,比如redis记录同一个ip每天出发限流的上限次数,记录在redis中,达到某个阈值后,进行永久封禁这· + * 默认情况下:限制同一个IP的QPS最大为10,可以通过修改系统配置进行调整 + * 这里也可以进行扩展,比如redis记录同一个ip每天出发限流的上限次数,记录在redis中,达到某个阈值后,进行永久封禁这个ip * * @param ip ip地址 * @return 是否限流 @@ -47,23 +47,15 @@ public class RedisRateLimiterFilter extends OncePerRequestFilter { String key = RedisKeyConstants.IP_RATE_LIMITER_KEY + ip; Long count = redisTemplate.opsForValue().increment(key); if (count == null || count == 1) { - Object ipRateLimitMinute = sysConfigService.getSystemConfig(SystemConstants.CONFIG_IP_RATE_LIMIT_MINUTE_KEY); - long expire = 1; - if(ipRateLimitMinute != null){ - expire = Long.parseLong(ipRateLimitMinute.toString()); - }else { - log.warn("[RedisRateLimiterFilter.rateLimit]系统配置中未配置IP限流最大分钟数,使用默认分钟数:{},请检查配置项:{}", - expire,SystemConstants.CONFIG_IP_RATE_LIMIT_MINUTE_KEY); - } - redisTemplate.expire(key,expire, TimeUnit.MINUTES); + redisTemplate.expire(key,1, TimeUnit.SECONDS); } - Object systemConfig = sysConfigService.getSystemConfig(SystemConstants.CONFIG_IP_RATE_LIMIT_COUNT_KEY); - long limit = 100; + Object systemConfig = sysConfigService.getSystemConfig(SystemConstants.CONFIG_IP_RATE_LIMIT_QPS_KEY); + long limit = 10; if(systemConfig != null){ limit = Long.parseLong(systemConfig.toString()); }else{ - log.warn("[RedisRateLimiterFilter.rateLimit]系统配置中未配置IP限流次数配置,使用默认次数:{},请检查配置项:{}", - limit,SystemConstants.CONFIG_IP_RATE_LIMIT_COUNT_KEY); + log.warn("[RedisRateLimiterFilter.rateLimit]系统配置中未配置IP请求限制QPS阈值配置,使用默认值:{},请检查配置项:{}", + limit,SystemConstants.CONFIG_IP_RATE_LIMIT_QPS_KEY); } return count != null && count > limit; }