Springboot限流工具之CurrentLimiting

1.工具简介

CurrentLimiting:基于令牌桶算法和漏桶算法实现的纳秒级分布式无锁限流插件,完美嵌入SpringBoot、SpringCloud应用,支持接口限流、方法限流、系统限流、IP限流、用户限流等规则,支持设置系统启动保护时间(保护时间内不允许访问),提供快速失败与CAS阻塞两种限流方案,开箱即用

2.引入包和配置

maven包的引入

<dependency>
  <groupId>cn.yueshutong</groupId>
  <artifactId>spring-boot-starter-current-limiting</artifactId>
  <version>0.0.8.RELEASE</version>
</dependency>

application.yml配置

current:
  limiting:
    #开启全局限流
    enabled: false
    #开启注解限流,可使注解失效
    part-enabled: true
      #每秒并发量 这里的qps是全局限流开启的时候的值,如果使用注解在注解里设置QPS值
    qps: 100
      #开启快速失败,可切换为阻塞
    fail-fast: true
      #系统启动保护时间为0
    initial-delay: 0

3. 接口限流代码

1.接口代码   @CurrentLimiter(QPS = 2)  这个注解里的QPS =2 就是当前接口的每秒的并发量

@RestController
public class MyController {
    @RequestMapping("/hello")
    @CurrentLimiter(QPS = 2)
    public String hello(){
        return "hello";
    }
}

2. 拒绝策略:针对限流的访问做一个返回处理,新建MyCurrentLimitHandler.class

@Component
public class MyCurrentLimitHandler  implements CurrentAspectHandler {
    @Override
    public Object around(ProceedingJoinPoint pjp, CurrentLimiter rateLimiter)  {
 
        //限流的返回数据可以自己根据需求场景设计
 
        JSONObject jsonObject=new JSONObject();
 
        jsonObject.put("code",500);
        jsonObject.put("msg","接口访问繁忙,休息一下");
        return jsonObject.toString();
    }
}

 

4.接口限流测试

已经用jemter或者调用工具手动测试,发现每秒接口并发超过2的时候会返回我们定义的提示信息:

接口访问繁忙,休息一下

5.集群限流

集群限流的目的是对相同实例(即ApplicationName)的集群进行统一的限流,前提是已经开启并配置好Redis,直接开启即可:

spring:
    redis:
        host: 127.0.0.1
        password: 
        port: 6379
#一行开启
current:
    limiting:
        cloud-enabled: true

6.自定义限流规则

在实际场景中,我们的限流规则并不只是简单的对整个系统或单个接口进行流控,需要考虑的是更复杂的场景。例如:

  1. 对请求的目标URL进行限流(例如:某个URL每分钟只允许调用多少次)
  2. 对客户端的访问IP进行限流(例如:某个IP每分钟只允许请求多少次)
  3. 对某些特定用户或者用户组进行限流(例如:非VIP用户限制每分钟只允许调用100次某个API等)
  4. 多维度混合的限流。此时,就需要实现一些限流规则的编排机制。与、或、非等关系。

7.总结

CurrentLimiting支持单接口限流,单机限流和集群限流。基本能完成业务常用的需求。是一个非常值得选择的限流工具。

框架源码地址

posted @ 2021-12-05 19:15  森林木马  阅读(1485)  评论(0编辑  收藏  举报