author: van , [email protected]
基于JVM缓存的轻量级、注解式IP限流组件,方便项目快速引用,满足多线程场景。
默认为滑动窗口限流器,内置令牌桶限流器,可通过注解的属性配置修改
项目地址: https://github.com/DDAaTao/ip-limiter
包含较为详细的演示使用代码
样例项目地址: https://github.com/DDAaTao/ip-limiter-example
Ip-Limit 具有以下特性:
# 配置文件中配置,需要注意分隔符为半角的','
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"})
核心限流模式 - LimitType类
<dependency>
<groupId>io.github.DDAaTaogroupId>
<artifactId>ip-limiterartifactId>
<version>1.0.3version>
dependency>
如果项目中没有引入guava、spring-context包,则需要手动引入,否则会报java.lang.NoSuchMethodError异常
从1.0.1开始默认引入,如果项目中已有相关依赖,可以考虑通过去除掉
/**
* 默认情况下,当请求超出限流限制时,会打印日志并抛出 IpLimitException 异常
* 用户可以通过统一异常拦截器捕获并自定义业务处理
* 后续考虑增加回调或钩子方法
* */
@Slf4j
@ControllerAdvice
public class BaseExceptionHandler {
@ExceptionHandler(IpLimitException.class)
@ResponseBody
public RestApiResult
SpringCloud 项目或者大部分项目一般都会有做自己的鉴权机制,比如Spring-Security。
这个时候如果有需要和外部对接的接口,有两种处理方法,一个是通过类似Oauth2之类的三方协议处理,
但是流程对接较为麻烦。
尤其是有些内网项目,本身已有较好的安全保证。此时就可以另外一种方式,也就是 白名单 来处理
也就是 LimitType.WHITE_LIST
或在白名单之上追加限流规则,保障系统的可用性,也就是 LimitType.DEFAULT_WITH_WHITE_LIST
1.0.3 版本开始提供IpLimitUtils工具类,通过注入获取实例后可以实现动态配置黑白名单,该动态配置数据与注解中的配置取并集
IpLimitUtils提供方法如下
有了这些方法,就可以通过第三方(比如数据库)存储黑白名单数据,然后动态初始化、修改黑名单配置
加粗表示重要版本更新,删除线表示废弃版本,不建议使用