refactor: 调整ip限流单位为QPS
调整ip限流单位为QPS
This commit is contained in:
@@ -37,8 +37,7 @@ CREATE TABLE `sys_config` (
|
|||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB COMMENT='系统配置';
|
) 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(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);
|
||||||
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);
|
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for sys_dept
|
-- Table structure for sys_dept
|
||||||
|
|||||||
@@ -38,8 +38,7 @@ CREATE TABLE `sys_config` (
|
|||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB COMMENT='系统配置';
|
) 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(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);
|
||||||
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);
|
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for sys_dept
|
-- Table structure for sys_dept
|
||||||
|
|||||||
@@ -24,15 +24,8 @@ public interface SystemConstants {
|
|||||||
String ROOT_ROLE_CODE = "ROOT";
|
String ROOT_ROLE_CODE = "ROOT";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IP限流最大分钟数配置系统配置KEY
|
* IP请求限制QPS阈值配置KEY
|
||||||
*/
|
*/
|
||||||
String CONFIG_IP_RATE_LIMIT_MINUTE_KEY = "IP_RATE_LIMIT_MINUTE";
|
String CONFIG_IP_RATE_LIMIT_QPS_KEY = "IP_RATE_LIMIT_COUNT_QPS";
|
||||||
|
|
||||||
/**
|
|
||||||
* IP限流次数配置系统配置KEY
|
|
||||||
* 在最大分钟数内,允许访问的次数
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
String CONFIG_IP_RATE_LIMIT_COUNT_KEY = "IP_RATE_LIMIT_COUNT";
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ public class RedisRateLimiterFilter extends OncePerRequestFilter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 确认是否限流方法
|
* 确认是否限流方法
|
||||||
* 默认情况下:限制同一个IP在一分钟内只能访问100次,可以通过修改系统配置进行调整
|
* 默认情况下:限制同一个IP的QPS最大为10,可以通过修改系统配置进行调整
|
||||||
* 这里也可以进行扩展,比如redis记录同一个ip每天出发限流的上限次数,记录在redis中,达到某个阈值后,进行永久封禁这·
|
* 这里也可以进行扩展,比如redis记录同一个ip每天出发限流的上限次数,记录在redis中,达到某个阈值后,进行永久封禁这个ip
|
||||||
*
|
*
|
||||||
* @param ip ip地址
|
* @param ip ip地址
|
||||||
* @return 是否限流
|
* @return 是否限流
|
||||||
@@ -47,23 +47,15 @@ public class RedisRateLimiterFilter extends OncePerRequestFilter {
|
|||||||
String key = RedisKeyConstants.IP_RATE_LIMITER_KEY + ip;
|
String key = RedisKeyConstants.IP_RATE_LIMITER_KEY + ip;
|
||||||
Long count = redisTemplate.opsForValue().increment(key);
|
Long count = redisTemplate.opsForValue().increment(key);
|
||||||
if (count == null || count == 1) {
|
if (count == null || count == 1) {
|
||||||
Object ipRateLimitMinute = sysConfigService.getSystemConfig(SystemConstants.CONFIG_IP_RATE_LIMIT_MINUTE_KEY);
|
redisTemplate.expire(key,1, TimeUnit.SECONDS);
|
||||||
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);
|
Object systemConfig = sysConfigService.getSystemConfig(SystemConstants.CONFIG_IP_RATE_LIMIT_QPS_KEY);
|
||||||
}
|
long limit = 10;
|
||||||
Object systemConfig = sysConfigService.getSystemConfig(SystemConstants.CONFIG_IP_RATE_LIMIT_COUNT_KEY);
|
|
||||||
long limit = 100;
|
|
||||||
if(systemConfig != null){
|
if(systemConfig != null){
|
||||||
limit = Long.parseLong(systemConfig.toString());
|
limit = Long.parseLong(systemConfig.toString());
|
||||||
}else{
|
}else{
|
||||||
log.warn("[RedisRateLimiterFilter.rateLimit]系统配置中未配置IP限流次数配置,使用默认次数:{},请检查配置项:{}",
|
log.warn("[RedisRateLimiterFilter.rateLimit]系统配置中未配置IP请求限制QPS阈值配置,使用默认值:{},请检查配置项:{}",
|
||||||
limit,SystemConstants.CONFIG_IP_RATE_LIMIT_COUNT_KEY);
|
limit,SystemConstants.CONFIG_IP_RATE_LIMIT_QPS_KEY);
|
||||||
}
|
}
|
||||||
return count != null && count > limit;
|
return count != null && count > limit;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user