Limiter类是nacos中做限流的一个简单的类,代码行数很少,可以简单复用
public class Limiter {
private static final Logger LOGGER = LogUtils.logger(Limiter.class);
private static final int CAPACITY_SIZE = 1000;
private static final int LIMIT_TIME = 1000;
private static final Cache<String, RateLimiter> CACHE = CacheBuilder.newBuilder().initialCapacity(CAPACITY_SIZE)
.expireAfterAccess(1, TimeUnit.MINUTES).build();
/**
* qps 5.
*/
private static double limit = 5;
static {
try {
String limitTimeStr = System.getProperty("limitTime", String.valueOf(limit));
limit = Double.parseDouble(limitTimeStr);
LOGGER.info("limitTime:{}", limit);
} catch (Exception e) {
LOGGER.error("init limitTime fail", e);
}
}
/**
* Judge whether access key is limited.
*
* @param accessKeyID access key
* @return true if is limited, otherwise false
*/
public static boolean isLimit(String accessKeyID) {
RateLimiter rateLimiter = null;
try {
rateLimiter = CACHE.get(accessKeyID, new Callable<RateLimiter>() {
@Override
public RateLimiter call() throws Exception {
return RateLimiter.create(limit);
}
});
} catch (ExecutionException e) {
LOGGER.error("create limit fail", e);
}
if (rateLimiter != null && !rateLimiter.tryAcquire(LIMIT_TIME, TimeUnit.MILLISECONDS)) {
LOGGER.error("access_key_id:{} limited", accessKeyID);
return true;
}
return false;
}
}
里面使用了guava做本地缓存,使用RateLimiter做限流控制,默认的QPS是5