RateLimiter限流

 1.RateLimiter比较常用的方法

    /**
     * 创建一个稳定输出令牌的RateLimiter,保证了平均每秒不超过permitsPerSecond个请求
     * 当请求到来的速度超过了permitsPerSecond,保证每秒只处理permitsPerSecond个请求
     * 当这个RateLimiter使用不足(即请求到来速度小于permitsPerSecond),会囤积最多permitsPerSecond个请求
     */
    public static RateLimiter create(double permitsPerSecond);



    /**
     * tryAcquire(long timeout, TimeUnit unit)
     * 从RateLimiter 获取许可如果该许可可以在不超过timeout的时间内获取得到的话,
     * 或者如果无法在timeout 过期之前获取得到许可的话,那么立即返回false(无需等待)
     */
    public boolean tryAcquire(long timeout, TimeUnit unit);

2.acquire()方法

    RateLimiter rateLimiter = RateLimiter.create(3);

    @RequestMapping("/spike")
    public Object spike() {
        System.out.println("等待时间" + rateLimiter.acquire());
        //购买逻辑
        return "购买成功";
    }

 

用JMeter同时发5个请求访问,可以发现出现了等待

等待时间0.0
等待时间0.0
等待时间0.0
等待时间0.0
等待时间0.284812

3.tryAcquire()方法

    @RequestMapping("/buy")
    public Object buy() {
        //判断能否在1秒内得到令牌,如果不能则立即返回false,不会阻塞程序
        if (!rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
            System.out.println("脸丑,短期无法获取令牌!");
            return "购买失败";
        }
        System.out.println("购买成功");
        //购买逻辑
        return "购买成功";
    }

用JMeter同时发10个请求访问,可以发现出现了等待超过1秒的情况

购买成功
购买成功
购买成功
购买成功
脸丑,短期无法获取令牌!
脸丑,短期无法获取令牌!
脸丑,短期无法获取令牌!
购买成功
购买成功
购买成功

                                                                                                                           --------个人使用记录,希望能帮助到大家一点点。

你可能感兴趣的:(记录,限流,单应用)