Guava的RateLimiter實現接口限流
阿新 • • 發佈:2018-06-26
如果 pri work response 許可證 整理 ise quest 進行
最近開發需求中有需要對後臺接口進行限流處理,整理了一下基本使用方法。
首先添加guava依賴:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency>
然後封裝RateLimiter適用對多接口的限制:
import com.google.common.util.concurrent.RateLimiter;
import org.springframework.util.StringUtils;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
public class RateLimiterFactory {
private static ConcurrentHashMap<String, RateLimiter> limiterMap = new ConcurrentHashMap<>();
//每秒許可證數量
private static double permitsPerSecond = 1000;
//等待超時時間
private static long timeout = 4L;
/**
*@param apiId 對應接口的id
*@description 獲取許可
*/
public static boolean tryAcquire(String apiId) {
//如果傳入apiId為空則返回true
if (StringUtils.isEmpty(apiId)) {
return true;
}
limiterMap.putIfAbsent(apiId, RateLimiter.create(permitsPerSecond));
return limiterMap.get(apiId).tryAcquire(timeout, TimeUnit.SECONDS);
}
}
使用RateLimiterFactory實現對接口的限制:
@Controller
public class TestController {
...
@RequestMapping("/test")
@ResponseBody
public String test(){
if(!RateLimiterFactory.tryAcquire(ApiInfo.TEST)) {
return "當前請求數過高!";
}
...
}
}
以上就是RateLimiter實現接口限流的常見使用,頭一次發文,mark一下。
Guava的RateLimiter實現接口限流