对外发布的api非常有必要进行流控,防止恶意攻击,从而尽可能地保护系统。ratelimitj是一个非常好的开源项目,提供了基于redis、hazelcast、inmemory版本的实现方案。这里简单演示一下如何使用inmemory版本。

maven

<!-- 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);
    }
}

doc


codecraft
11.9k 声望2k 粉丝

当一个代码的工匠回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞愧,这样,当他老的时候,可以很自豪告诉世人,我曾经将代码注入生命去打造互联网的浪潮之巅,那是个很疯狂的时代,我在一波波的浪潮上留下...