参考地址:GitHub - taptap/ratelimiter-spring-boot-starter: 基于 redis 的偏业务应用的分布式限流组件,使得项目拥有分布式限流能力变得很简单。
基于 redis 的偏业务应用的分布式限流组件,目前支持时间窗口
、令牌桶
两种限流算法。使得项目拥有分布式限流能力变得很简单。限流的场景有很多,常说的限流一般指网关限流,控制好洪峰流量,以免打垮后方应用。这里突出偏业务应用的分布式限流
的原因,是因为区别于网关限流,业务侧限流可以轻松根据业务性质做到细粒度的流量控制。
1、引入依赖:
<dependency>
<groupId>com.github.taptap</groupId>
<artifactId>ratelimiter-spring-boot-starter</artifactId>
<version>1.3</version>
</dependency>
或者
implementation 'com.github.taptap:ratelimiter-spring-boot-starter:1.3'
2、application.properties 配置
spring.ratelimiter.enabled=true
spring.ratelimiter.redis-address=redis://127.0.0.1:6379
spring.ratelimiter.redis-password=xxx
3、在需要加限流逻辑的方法上,添加注解 @RateLimit
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/get")
@RateLimit(rate = 5, rateInterval = "10s")
public String get(String name) {
return "hello";
}
}
4、示例:
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private RateLimiterService limiterService;
@GetMapping("/limiterService/time-window")
public String limiterServiceTimeWindow(String key) {
Rule rule = new Rule(Mode.TIME_WINDOW); // 限流策略,设置为时间窗口
rule.setKey(key); //限流的 key
rule.setRate(5); //限流的速率
rule.setRateInterval(10); //时间窗口大小,单位为秒
Result result = limiterService.isAllowed(rule);
if (result.isAllow()) { //如果允许访问
return "ok";
} else {
//触发限流
return "no";
}
}
@GetMapping("/limiterService/token-bucket")
public String limiterServiceTokenBucket(String key) {
Rule rule = new Rule(Mode.TOKEN_BUCKET); // 限流策略,设置为令牌桶
rule.setKey(key); //限流的 key
rule.setRate(5); //每秒产生的令牌数
rule.setBucketCapacity(10); //令牌桶容量
rule.setRequestedTokens(1); //请求的令牌数
Result result = limiterService.isAllowed(rule);
if (result.isAllow()) { //如果允许访问
return "ok";
} else {
//触发限流
return "no";
}
}
}