nacos源码解析

410 阅读1分钟

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