一.限流器介绍
简单来讲,限流器就是控制流量访问速率的一种机制,在短时间内大量流量访问时,不至于使服务器崩溃。比如,一分钟之内,如果限制1000个请求可以访问,当第1001个请求到达时,请求被拒绝(这时最好对其进行监控)。
二.限流器的实现方式
目前常用两种:
1.使用计数器法。一段时间内,限制请求可以访问的个数,guava框架里面有一个ratelimit。
2.令牌桶算法。系统之间通过令牌来检验请求,令牌是等时间间隔生成,消除了流量激增。
guava 的ratelimit是单机版,在分布式环境下无法使用,所以我们选用redis做数据存储对象。
三.分布式限流器-PDLR
1).简介
PDLR是一个居于redis的分布式限流器,环境使用jdk8,spring-boot,redis。它具有如下功能:
1.对系统限流控制
2.支持对路径的限流控制
3.支持对方法的限流控制
4.支持分布式锁级别的控制
2).使用说明
1.添加pom依赖
<dependency>
<groupId>com.pdlr.framework</groupId>
<artifactId>pdlr-core</artifactId>
<version>1.0</version>
</dependency>
2.添加注解
@EnablePDLRConfig
注:@EnablePDLRConfig将pdlr框架注入,建议和@SpringBootApplication注解放一起。
3.添加配置
在application.yml中添加
#pdlr:
# rate: 15
# timeOut: 5000 #5秒钟内只能有15个请求到达
# intercept-path: /api,/test/*
当然,第3步也可以不做,系统已经默认添加了默认值。rate为10,timeOut1000 ,intercept-path默认是/api/**路径。
3).实现原理
1.继承了方法拦截器(HandlerInterceptor),实现了before方法,在所有请求方法之前,会对请求速率做判断,包括更改,使用分布式锁等。
2.继承了webmvc适配器(WebMvcConfigurerAdapter),通过配置,拦截相应的请求路径。
3.使用反射和注解实现值(LimitRate)的设置和读取.
四.开源框架地址