一.限流器介紹
簡單來講,限流器就是控制流量訪問速率的一種機制,在短時間內大量流量訪問時,不至於使服務器崩潰。比如,一分鐘之內,如果限制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)的設置和讀取.
四.開源框架地址