记录|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 "购买成功"; }

【记录|RateLimiter限流】
用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秒的情况
购买成功 购买成功 购买成功 购买成功 脸丑,短期无法获取令牌! 脸丑,短期无法获取令牌! 脸丑,短期无法获取令牌! 购买成功 购买成功 购买成功

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

    推荐阅读