author: van , ggfanwentao@gmail.com
Ip-Limit: 輕量級注解式IP限流組件
項目簡介
基于JVM緩存的輕量級、注解式IP限流組件,方便項目快速引用,滿足多線程場景。
默認為滑動窗口限流器,內(nèi)置令牌桶限流器,可通過注解的屬性配置修改
項目Github地址: https://github.com/DDAaTao/ip-limiter
項目Gitee地址:https://gitee.com/fanwentaomayun/ip-limiter
使用樣例
包含較為詳細的演示使用代碼
樣例項目地址: https://github.com/DDAaTao/ip-limiter-example
Ip-Limit 具有以下特性:
- 基于注解使用,簡單快捷,可添加到Controller類上,也可以添加到具體的API方法上
- 業(yè)務入侵小,不用過多配置類,但可以支持多種場景配置
- 實現(xiàn)組級別統(tǒng)一限流,即可滿足單接口單組場景,又可滿足多接口單組
- 支持配置文件配置、外部動態(tài)配置(新增、刪除)黑白名單
# 配置文件中配置,需要注意分隔符為半角的','
my.white.ip.list=172.16.50.21,172.16.50.22,172.16.50.23
// 代碼中使用時
@IpLimit(limitType = LimitType.WHITE_LIST, whiteList = "${my.white.ip.list}")
// 或
@IpLimit(limitType = LimitType.WHITE_LIST, whiteList = {"${my.white.ip.list}","172.16.50.35"})
- 黑白名單IP規(guī)則實現(xiàn)多種模糊模式配置,支持IPv6
- 172.*.*.1
- 172.*.1
- 172.*
- *.21
- *
核心限流模式 - LimitType類
- DEFAULT - 走默認限流策略,不考慮黑白名單參數(shù)
- WHITE_LIST - 只考慮白名單策略,非白名單的請求全部回絕
- BLACK_LIST - 只考慮黑名單策略,非黑名單請求不做限流措施
- DEFAULT_WITH_WHITE_LIST - 在默認限流策略的基礎(chǔ)上,白名單內(nèi)的IP不做限流
- DEFAULT_WITH_BLACK_LIST - 在默認限流策略的基礎(chǔ)上,直接403黑名單
- DEFAULT_WITH_WHITE_AND_BLACK_LIST - 在默認限流策略的基礎(chǔ)上,直接403黑名單,再讓白名單內(nèi)的IP直接同行
快速開始
- 引入Ip-Limit依賴(已發(fā)布至Maven中央倉庫)
<!-- 建議使用最新版本{ip-limiter.version} -->
<dependency>
<groupId>io.github.DDAaTao</groupId>
<artifactId>ip-limiter</artifactId>
<version>1.0.3</version>
</dependency>
- 將 @EnableIpLimit 添加到 webApplication 類上,或其他可以被 Spring 掃描到的類上
- 將 @IpLimit 注解添加到想要做IP限流的方法(接口)上,根據(jù)需求動態(tài)調(diào)整參數(shù)
如果項目中沒有引入guava、spring-context包,則需要手動引入,否則會報java.lang.NoSuchMethodError異常
從1.0.1開始默認引入,如果項目中已有相關(guān)依賴,可以考慮通過去除掉
最佳實踐
一、自定義限流異常處理機制
/**
* 默認情況下,當請求超出限流限制時,會打印日志并拋出 IpLimitException 異常
* 用戶可以通過統(tǒng)一異常攔截器捕獲并自定義業(yè)務處理
* 后續(xù)考慮增加回調(diào)或鉤子方法
* */
@Slf4j
@ControllerAdvice
public class BaseExceptionHandler {
@ExceptionHandler(IpLimitException.class)
@ResponseBody
public RestApiResult<Object> resolveCommonException(IpLimitException e) {
log.error("IpLimitException Intercept. Please try again later.. " + e.getMessage());
// 此處可以通過 e.getRequestIp() 和 e.getGroupName() 做一些限流回調(diào)業(yè)務處理
return RestApiResult.fail("IpLimitException Intercept. Please try again later.. ");
}
}
二、已存在鑒權(quán)方案時的接入方案
SpringCloud 項目或者大部分項目一般都會有做自己的鑒權(quán)機制,比如Spring-Security。
這個時候如果有需要和外部對接的接口,有兩種處理方法,一個是通過類似Oauth2之類的三方協(xié)議處理,
但是流程對接較為麻煩。
尤其是有些內(nèi)網(wǎng)項目,本身已有較好的安全保證。此時就可以另外一種方式,也就是 白名單 來處理
也就是 LimitType.WHITE_LIST
或在白名單之上追加限流規(guī)則,保障系統(tǒng)的可用性,也就是 LimitType.DEFAULT_WITH_WHITE_LIST
三、動態(tài)配置黑白名單
1.0.3 版本開始提供IpLimitUtils工具類,通過注入獲取實例后可以實現(xiàn)動態(tài)配置黑白名單,該動態(tài)配置數(shù)據(jù)與注解中的配置取并集
IpLimitUtils提供方法如下
- putWhiteIpGroup - 可通過該方法動態(tài)配置新增白名單
- removeWhiteIpGroup - 可通過該方法動態(tài)清空對應 group 的白名單配置
- deleteWhiteIpGroupArrayStr - 可通過該方法動態(tài)去掉對應 group 中的某項 arrayStr 白名單
- putBlackIpGroup - 可通過該方法動態(tài)配置新增黑名單
- removeBlackIpGroup - 可通過該方法動態(tài)清空對應 group 的黑名單配置
- deleteBlackIpGroupArrayStr - 可通過該方法動態(tài)去掉對應 group 中的某項 arrayStr 黑名單
有了這些方法,就可以通過第三方(比如數(shù)據(jù)庫)存儲黑白名單數(shù)據(jù),然后動態(tài)初始化、修改黑名單配置文章來源:http://www.zghlxwxcb.cn/news/detail-588388.html
異常記錄
- 暫時不支持Spring-6.x
更新日志
加粗表示重要版本更新,刪除線表示廢棄版本,不建議使用文章來源地址http://www.zghlxwxcb.cn/news/detail-588388.html
-
1.0.1實現(xiàn)滑動窗口限流模式 - 1.0.2 調(diào)整規(guī)范,添加樣例項目鏈接
- 1.0.3 開放用戶動態(tài)配置黑白名單
Ip-Limit 計劃實現(xiàn)功能
- 用戶自定義限流器
- 全局限流、全局分IP限流
- 添加限流監(jiān)控,監(jiān)控數(shù)據(jù)回調(diào)(目前可以通過@ExceptionHandler(IpLimitException.class)處理異?;卣{(diào))
- IP緩存統(tǒng)計數(shù)據(jù)可更換其他存儲數(shù)據(jù)源,避免過多占用JVM緩存
- 可將IP更換為指定字段(比如賬號)限流
- 更加靈活的異常處理機制
到了這里,關(guān)于Ip-Limit: 輕量級注解式IP限流組件(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!