简单的针对某个接口进行限流,如果需要整体限流的话还是建议在网关上面或者服务器上面动手
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;
   }

  }

 

对某个接口进行限流 以 Aop 注解的形式绑定接口 用redis实现的更多相关文章

  1. 服务接口API限流 Rate Limit 续

    一.前言 上一篇文章中粗浅的介绍使用Redis和基于令牌桶算法进行对服务接口API限流,本文介绍另一种算法---漏桶算法的应用.Nginx想必大家都有所了解是一个高性能的 HTTP 和反向代理服务器, ...

  2. Guava RateLimiter实现接口API限流

    一.简介 Guava提供的RateLimiter可以限制物理或逻辑资源的被访问速率.RateLimit二的原理类似与令牌桶,它主要由许可发出的速率来定义,如果没有额外的配置,许可证将按每秒许可证规定的 ...

  3. Google Guava缓存实现接口的限流

    一.项目背景 最近项目中需要进行接口保护,防止高并发的情况把系统搞崩,因此需要对一个查询接口进行限流,主要的目的就是限制单位时间内请求此查询的次数,例如1000次,来保护接口. 参考了 开涛的博客聊聊 ...

  4. 使用AOP和Semaphore对项目中具体的某一个接口进行限流

    整体思路: 一 具体接口,可以自定义一个注解,配置限流量,然后对需要限流的方法加上注解即可! 二 容器初始化的时候扫描所有所有controller,并找出需要限流的接口方法,获取对应的限流量 三 使用 ...

  5. 服务接口API限流 Rate Limit

    一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...

  6. java 服务接口API限流 Rate Limit

    一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...

  7. day74:drf:drf其他功能:认证/权限/限流/过滤/排序/分页/异常处理&自动生成接口文档

    目录 1.django-admin 2.认证:Authentication 3.权限:Permissions 4.限流:Throttling 5.过滤:Filtering 6.排序:OrderingF ...

  8. 实例:接口并发限流RateLimiter

    需求:接口每秒最多只能相应1个请求 1.创建 全局类对象 import com.google.common.util.concurrent.RateLimiter; import org.spring ...

  9. Guava-RateLimiter实现令牌桶控制接口限流方案

    一.前言 对于一个应用系统来说,我们有时会遇到极限并发的情况,即有一个TPS/QPS阀值,如果超了阀值可能会导致服务器崩溃宕机,因此我们最好进行过载保护,防止大量请求涌入击垮系统.对服务接口进行限流可 ...

  10. Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流

    最近管点闲事浪费了不少时间,感谢网友libinwalan的留言提醒.及时纠正路线,继续跟大家一起学习Spring Cloud Alibaba. Nacos作为注册中心和配置中心的基础教程,到这里先告一 ...

随机推荐

  1. 入门 Python GUI 开发的第一个坑

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 使用 Anaconda 3(conda 4.5.11)的 tkinter python 包(c ...

  2. 使用默认pypi源出现连接超时

    背景信息 安装 dataworks sdk 时报错,原因是连接默认的 pypi 仓库超时 pip install aliyun-python-sdk-dataworks-public==4.2.1 报 ...

  3. Python3.9+torch1.7.1+cuda11.0+cudnn8.0+Anaconda3安装

    前言想要安装pytorch,至少得先安装Anaconda.python!!!必要的不想用cpu要用gpu的还需要cuda11.0+cudnn11.0!!!一.安装python3.9二.安装Anacon ...

  4. STL-queue(ACM)

    重构函数(默认) queue<int> q; 基本操作 q.front(); // 队列最前面的元素q.back(); // 队列最后面的元素q.size(); // 返回队列长度q.em ...

  5. W1R3S-1项目实战

    前言 您受聘在W1R3S.inc单个服务器上进行渗透测试,并报告所有发现.他们要求您获得root访问权限并找到标志(位于/root目录中). 难以获得低特权外壳:初级/中级 获得特权升级的难度:初级/ ...

  6. Spring MVC 前后台传递json格式数据 Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

    若使用默认的json转换器,则需要如下包: <mvc:annotation-driven /> 报错如下: Content type 'application/x-www-form-url ...

  7. 基于百度AI平台的人脸识别评分小程序

    face-recognition-scoring-applet 开放源代码,遵循Apache License 2.0 效果展示 可切换摄像头.拍照.从相册选择 效果预览 小程序账号注册及配置 地址:h ...

  8. 我用numpy实现了VIT,手写vision transformer, 可在树莓派上运行,在hugging face上训练模型保存参数成numpy格式,纯numpy实现

    先复制一点知乎上的内容 按照上面的流程图,一个ViT block可以分为以下几个步骤 (1) patch embedding:例如输入图片大小为224x224,将图片分为固定大小的patch,patc ...

  9. #Powerbi 10分钟,理解 Rankx 排名函数

    一:本文思维导图及示例数据图 1.1思维导图 1.2  示例数据图 二:度量值示例 2.1 函数简介 RANKX 首先为的每一行计值表达式,将结果临时存储为一个值列表.然后在当前筛选上下文中计值,将得 ...

  10. Java stream流使用

    1.使用filter()过滤List //查找身高在1.8米及以上的学生 List<StudentInfo> boys = studentList.stream().filter(s-&g ...