springboot 限制请求频率,springboot接口并发数限制
需要用到的知识:注解、AOP、ExpiringMap(带有有效期的映射)
我们可以自定义注解,把注解添加到我们的接口上。定义一个切面,执行方法前去ExpiringMap查询该互联网协议(互联网协议)在规定时间内请求了多少次,如超过次数则直接返回请求失败。
需要用到的依赖
!- AOP依赖-依赖groupIdorg.springframework.boot/groupId artifactId spring-boot-starter-AOP/artifactId version2.1.5.RELEASE/version/dependency!-地图依赖-依赖关系groupIdnet.jodah/groupId artifactIdexpiringmap/artifactId版本0 .5 .8/版本/依赖关系自定义注解@限制请求
@Documented@Target(ElementType .方法)//说明该注解只能放在方法上面@保留(保留政策.运行时)公共@接口限制请求{长时间()默认6000;//限制时间单位:毫秒int计数()默认为1;//允许请求的次数}自定义面向切面编程
@ Aspect @ component公共类LimitRequestAspect { private static concurrent hashmap string,ExpiringMapString,Integer book=new concurrent hashmap();//定义切点//让所有有@限制请求注解的方法都执行切面方法@ Pointcut( @ annotation(limit request))公共void借口服务(limit request limit request){ } @ Around(借口服务(limit request))公共对象DOA round(ProceedingJoinPoint pjp,limit request limit request)Throwable获得请求对象请求属性ra=requestcontextholder。getrequestattributes();ServletRequestAttributes SRA=(ServletRequestAttributes)ra;http servlet请求request=SRA。get request();//获取地图对象,如果没有则返回默认值//第一个参数是钥匙,第二个参数是默认值ExpiringMapString,整数UC=book。getordefault(请求。getrequest uri(),ExpiringMap.builder().变量Expiration().build());整数uCount=UC。getordefault(请求。getremote addr(),0);if(uCount=限制请求。count()){//超过次数,不执行目标方法返回接口请求超过次数;} else if (uCount==0){ //第一次请求时,设置有效时间///**根据上次访问时间*///访问时间使条目过期,///**根据创建时间*///创建时间使条目过期uc.put(request.getRemoteAddr(),uCount 1,ExpirationPolicy .CREATED,limitRequest.time(),TimeUnit .毫秒);} else { //未超过次数,记录加一uc.put(request.getRemoteAddr(),uCount 1);}书。放(请求。getrequesturi()、UC);//结果的值就是被拦截方法的返回值对象结果=pjp。proceed();返回结果;} }第一个静态地图是多线程安全的地图(ConcurrentHashMap),它的键是接口对于的url,它的价值是一个多线程安全且键值对是有有效期的地图(ExpiringMap)。
ExpiringMap的键是请求的互联网协议(互联网协议的缩写)地址,值是已经请求的次数。
ExpiringMap更多的使用方法可以参考:https://github。com/jhalterman/过期地图
最后在方法上面加上@限制请求就行了
到此这篇关于跳羚在一定时间内限制接口请求次数的实现示例的文章就介绍到这了,更多相关跳羚限制接口请求次数内容请搜索盛行信息技术以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行它!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。