简介
call-limit提供接口限流、防刷的功能,插件基于spring开发,在应用应用的任何一个逻辑层皆可使用(web、service、dao),
插件支持单机应用下的限流和分布式应用的限流(分布式应用限流需要依赖redis),在简单业务场景下插件可为大家提供轻量
无逻辑侵入的限流、防刷的支持。
maven坐标
top.xiemingmin
call-limit
1.0.1-SNAPSHOT
目前SNAPSHOT版本只能发布到第三方仓库,如需使用请在maven配置中增加第三方repository
sonatype-nexus-snapshots
Sonatype Nexus Snapshots
https://oss.sonatype.org/content/repositories/snapshots/
用法
在项目中添加插件maven依赖
在spring xml配置中配置相关的bean
单机场景:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mm="http://www.xiemingmin.top/schema/mm"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.xiemingmin.top/schema/mm
http://www.xiemingmin.top/schema/mm.xsd">
分布式场景:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mm="http://www.xiemingmin.top/schema/mm"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.xiemingmin.top/schema/mm
http://www.xiemingmin.top/schema/mm.xsd">
3.实现用户信息接口(top.xiemingmin.call.limit.intf.UserInfoSupport)
返回每个请求线程的用户唯一标识,可使用请求的客户端ip,插件中会调用次接口判断是否同一用户的请求。
ps:可将用户信息放入ThreadLocal在此方法中直接取值
package com.xiemingmin.service;
import org.springframework.stereotype.Service;
import top.xiemingmin.call.limit.intf.UserInfoSupport;
@Service
public class UserInfoServiceImpl implements UserInfoSupport {
@Override
public String currentUserKey() {
return LoginContext.getUserId();
}
}
4.在需要限流或防刷的方法上添加top.xiemingmin.call.limit.annotation.CallLimit注解
参数说明:
time:单位时间内值允许调用1次
timeUnit:时间单位
onLimitException: 触发限流抛出的异常
如下配置表示30秒内值允许调用一次
@GetMapping("/getPerson/{name}")
@CallLimit(time = 30, timeUnit = TimeUnit.SECONDS)
public Result> getPerson(@PathVariable String name){
return personService.findPersonByName(name);
}
效果
第一次调用(成功)
调用成功
第二次调用(被限制)
被限制