refactor: 调整ip限流单位为QPS
调整ip限流单位为QPS
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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";
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user