首页 > 数据库 >对某个接口进行限流 以 Aop 注解的形式绑定接口 用redis实现

对某个接口进行限流 以 Aop 注解的形式绑定接口 用redis实现

时间:2023-09-21 11:34:01浏览次数:43  
标签:count return String redis 接口 限流 limitRequest

简单的针对某个接口进行限流,如果需要整体限流的话还是建议在网关上面或者服务器上面动手
Controller:


  @LimitRequest(count = 1,time = 60 * 1000 * 2)
  @PostMapping("limit")
  public String getLimitResult() {
   return "ok";
  }
Annotation:
  
  @Retention(RetentionPolicy.RUNTIME) // 运行时
  @Target({ElementType.TYPE, ElementType.METHOD}) // 可以被用在类及方法上
  @Order(Ordered.HIGHEST_PRECEDENCE) // 最高优先级
  public @interface LimitRequest {

  /**
   * @return 允许的请求次数,默认 MAX_VALUE
   */
   int count() default Integer.MAX_VALUE;

  /**
   * @return 时间段,单位为毫秒数(和redis统一),默认 1分钟
   */
  int time() default 60 * 1000;
  
  /**
   * @return 触发限流之后抛出的异常信息
   */
   String meg() default "登记太频繁,请2分钟之后再次登记!";
  }

AOP:

  @Slf4j
  @Aspect
  @Component
  @Order(1)
  public class LimitRequestAop {
   @Autowired
   private RedisTemplate<String, String> redisTemplate;
  
   @Around("@annotation(limitRequest)")
  public Object doAround(ProceedingJoinPoint joinPoint, LimitRequest limitRequest) throws Throwable {
   // 获取当前请求对象
   ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
   boolean flag = true;
   HttpServletRequest request = attributes.getRequest();
      // String ipAddr = request.getRemoteAddr(); //根据自己需求来确定下面拼redis key值的时候要不要拼上客户端的ip
      // logger.info("ip" + ipAddr);
   String uri = request.getRequestURI();
  if (limitRequest != null) {
   flag = validRequestCount( uri.replace("/", "_"), limitRequest.count(), limitRequest.time());
   }
   if (flag) {
   return joinPoint.proceed();
   }
  
   throw new RuntimeException(limitRequest.meg());
   }

   /**
   * 判断某一个ip请求接口的次数是否超过限制
   *
  * @param uri 接口路径
  * @param limitCount 限流大小
  * @param timeOut 判断限流的时间
   * @return true 未限流 false 限流
   */
   private boolean validRequestCount(String uri, int limitCount, long timeOut) {
   try {
   // /api/queryInfo
   String redisKey = "req_limit_".concat(uri);
   long count = redisTemplate.opsForValue().increment(redisKey, 1);
   if (count == 1) {
   redisTemplate.expire(redisKey, timeOut, TimeUnit.MILLISECONDS);
  }
   if (count > limitCount) {
   return false;
  }
   } catch (Exception e) {
   return false;
   }
   return true;
   }


  }

 

标签:count,return,String,redis,接口,限流,limitRequest
From: https://www.cnblogs.com/ji-firee/p/17719510.html

相关文章

  • 国标视频云服务 EasyGBS视频存储平台如何正确调阅实时录像接口?
    视频监控平台EasyCVR是一个高度灵活、功能丰富的视频监控系统,其强大的拓展性和便捷的部署方式使其在众多场景中都能发挥出色的性能。EasyCVR平台支持多种主流标准协议,包括但不限于国标GB28181、RTSP/Onvif、RTMP等,这些协议为设备之间的互联互通提供了基础。 在接收到用户......
  • Restful API 接口测试工具 HTTP Client
    HTTPClient软件项目开发有很多RESTfulAPI接口需要运行来验证效果,所以急需一款高效的接口测试工具。可能大家用的比较多的是swagger或者postman,这2个确实不错,不过这里我给大家推荐一种更简单的接口测试工具。这款工具就是idea中的自带的:HTTPClient,这款工具特别好用,主......
  • Windows10 Redis数据库的搭建
    参考:https://blog.csdn.net/qq_53381910/article/details/130383352  http://wed.xjx100.cn/news/96490.html?action=onClick......
  • Go语言实现接口IP限流,黑名单&白名单的实例,都可用!
    Go语言实现接口IP限流,黑名单&白名单的实例,都可用!原创 学习与分享 Go语言圈 2023-07-1808:30 发表于广东收录于合集#学Go语言哪些事儿221个MySQL大牛带你全面剖析与系统梳理数据库(mysql等)知识分享,总结数据库技巧和方法,提升你的技术技能。45篇原创内容......
  • Redis持久化机制
    Redis的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证Redis的数据不会因为故障而丢失,这种机制就是Redis的持久化机制。Redis的持久化机制有两种,第一种是RDB快照,第二种是AOF日志。快照是一次全量备份,AOF日志是连续的增量备份。快照是内存数据的......
  • Redis漏洞总结--未授权--沙箱绕过--(CNVD-2015-07557)&&(CNVD-2019-21763)&&(CVE-2022
    Redis未授权--沙箱绕过--(CNVD-2015-07557)&&(CNVD-2019-21763)&&(CVE-2022-0543)环境复现采用Vulfocus靶场进行环境复现,官网docker搭建有问题,具体搭建教程参考vulfocus不能同步的解决方法/vulfocus同步失败CNVD-2015-07557未授权访问影响版本Redis<=5.0.5漏洞探测使用端......
  • Redis7 10大数据类型(Redis地理空间)
    一、简介移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、高德地图附近的核酸检查点等等,那这种附近各种形形色色的XXX地址位置选择是如何实现的?地球上的地理位置是使用二维的经纬度表示,经度范围(-180,180],纬度范围(-90,90],只要我们确定一个......
  • 最新SSL证书申请源码,支持API接口,支付在线
    最新SSL证书申请源码,支持API接口,支付在线目前测试还不需要授权,以后更新版就不知道了SSL证书保证网络安全的基本保障。向您介绍我们的在线生成SSL证书系统支持在线生成SSL证书系统,用户登录可在线申请SSL,后台对接ssl证书api接口www.httple.net源码截图: ......
  • 使用Jest测试接口时间
    引言在开发和测试过程中,我们经常需要对接口的性能进行评估和优化。一个重要的指标是接口的执行时间。本文将介绍如何使用Jest来测试接口的执行时间,并提供示例代码。Jest简介Jest是一个流行的JavaScript测试框架,广泛应用于前端和后端的单元测试、集成测试和性能测试。它简单易用......
  • 自动化测试系列:接口自动化测试框架--05通过邮件发送测试结果的封装
    From: https://mp.weixin.qq.com/s/3w9GT2TYKIhrKCi36-DYRw---------------------------------------------------------------------------------------框架功能介绍1.自动整理接口测试用例:只需使用抓包工具,将需要接口请求另存为HAR文件,执行har2excel.bat即可自动生成接口请......