54 lines
1.8 KiB
Java
54 lines
1.8 KiB
Java
package com.sf.vertx.handle;
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
|
import com.sf.vertx.api.pojo.AppCurrentLimitingConfig;
|
|
import com.sf.vertx.constans.RedisKeyConfig;
|
|
import com.sf.vertx.init.DynamicBuildServer;
|
|
import com.sf.vertx.service.impl.AppConfigServiceImpl;
|
|
import com.sf.vertx.utils.SpringUtils;
|
|
|
|
import io.vertx.ext.web.RoutingContext;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
@Slf4j
|
|
public class RedisRateLimiter {
|
|
public Boolean acquire(RoutingContext rc, int pattern) {
|
|
String appCode = rc.request().headers().get(DynamicBuildServer.SAC_APP_HEADER_KEY);
|
|
//TODO 先测试app模式,后面通过app缓存获取模式
|
|
switch (pattern) {
|
|
case 1:
|
|
String key = RedisKeyConfig.APP_CURRENT_LIMITING_CONFIG_KEY +":"+ appCode;
|
|
return rateLimiter(key, appCode);
|
|
default:
|
|
break;
|
|
}
|
|
return false;
|
|
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
private Boolean rateLimiter(String key, String appCode) {
|
|
RedisTemplate<String, Integer> redisTemplate = SpringUtils.getBean("redisTemplate", RedisTemplate.class);
|
|
AppCurrentLimitingConfig appCurrentLimitingConfig = AppConfigServiceImpl.getAppCurrentLimitingConfig(appCode);
|
|
Object count = redisTemplate.opsForValue().get(key);
|
|
//redisTemplate.delete(key);
|
|
log.info("count:{}", count);
|
|
if(count == null) {
|
|
// 初始化,设置过期时间
|
|
redisTemplate.opsForValue().increment(key);
|
|
log.info("redis app threshold: {}", redisTemplate.opsForValue().get(key));
|
|
redisTemplate.expire(key, appCurrentLimitingConfig.getTimeWindow(), TimeUnit.SECONDS);
|
|
} else if(Integer.valueOf(count.toString()) < appCurrentLimitingConfig.getThreshold()) {
|
|
redisTemplate.opsForValue().increment(key);
|
|
} else {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|