springboot访问限流(转)

https://zhuanlan.zhihu.com/p/60979444

https://www.cnblogs.com/leeego-123/p/11492822.html

https://www.cnblogs.com/liuqing576598117/p/11451474.html

https://www.jianshu.com/p/404aa2747809

https://zhuanlan.zhihu.com/p/72980217

一、RateLimiter

RateLimiter是guava实现的令牌桶算法,看起来跟Semaphore非常像,其实有所不同。

Semaphore用于处理同时并发访问的资源数量,使用的时候先获取再释放。

RateLimiter的令牌每秒都在产生,比如下面的代码,每秒产生5个令牌,用于限制一个时间范围内的访问次数,令牌只需要获取不用释放。

    private static RateLimiter rateLimiter = RateLimiter.create(5);

    public static void main(String[] args) throws InterruptedException {
        while (true) {
            get(1);
        }
    }

    private static void get(int permits) {
        rateLimiter.acquire(permits);
        System.out.println(System.currentTimeMillis());
    }

二、令牌桶算法和漏桶算法

基于漏桶(桶+恒定处理速率),可以起到对请求整流效果。漏桶算法可基于线程池来实现,线程池使用固定容量的阻塞队列+固定个数的处理线程来实现;最简单且最常见的漏桶思想的实现就是基于SynchronousQueue的线程池,其相当于一个空桶+固定处理线程 : )

令牌桶算法的原理是系统以恒定的速率产生令牌,然后把令牌放到令牌桶中,令牌桶有一个容量,当令牌桶满了的时候,再向其中放令牌,那么多余的令牌会被丢弃;当想要处理一个请求的时候,需要从令牌桶中取出一个令牌,如果此时令牌桶中没有令牌,那么则拒绝该请求。

三、基于Redis限流

基于Redis做限流操作,使用lua脚本保证命令原子性,比如qps设置为10,如果key不存在,就设置key过期时间1s,value=1;如果value小于10,则自增value;value达到10

四、基于Nginx的分布式限流

原文地址:https://www.cnblogs.com/wangbin2188/p/15211422.html