對外發布的api很是有必要進行流控,防止惡意攻擊,從而儘量地保護系統。ratelimitj是一個很是好的開源項目,提供了基於redis、hazelcast、inmemory版本的實現方案。這裏簡單演示一下如何使用inmemory版本。git
<!-- https://mvnrepository.com/artifact/es.moki.ratelimitj/ratelimitj-core --> <dependency> <groupId>es.moki.ratelimitj</groupId> <artifactId>ratelimitj-core</artifactId> <version>0.4.0.M1</version> </dependency> <dependency> <groupId>es.moki.ratelimitj</groupId> <artifactId>ratelimitj-inmemory</artifactId> <version>0.4.0.M1</version> </dependency>
@Component public class RateLimitService { Set<RequestLimitRule> rules = Collections.singleton(RequestLimitRule.of(1, TimeUnit.MINUTES, 50)); // 50 request per minute, per key RequestRateLimiter requestRateLimiter = new InMemorySlidingWindowRequestRateLimiter(rules); public boolean reached(String key){ return requestRateLimiter.overLimitWhenIncremented(key); } }