Springboot 整合 Current-Limiting 实现接口限流

简介: Springboot 整合 Current-Limiting 实现接口限流

该篇文章内容:



1.实现标题中提到的接口限流


2.使用压测工具jmeter给大家展现验证效果

 

第一部分,代码的实现


首先是导入依赖包:


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


然后是application.yml :


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


然后是写测试接口,使用限流注解标记接口的并发量 QPS :


    @RequestMapping("/testLimit")
    @CurrentLimiter(QPS = 5)
    public String testLimit1() throws InterruptedException {
        //业务处理......
        return "success";
    }


@CurrentLimiter(QPS = 5)  这个注解里的QPS =5 就是当前接口的每秒的并发量 。


最后再针对限流的访问做一个返回处理,新建MyCurrentLimitHandler.class :


import cn.yueshutong.springbootstartercurrentlimiting.annotation.CurrentLimiter;
import cn.yueshutong.springbootstartercurrentlimiting.handler.CurrentAspectHandler;
import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
/**
 * @Author : JCccc
 * @CreateTime : 2020/4/20
 * @Description :
 **/
@Component
public class MyCurrentLimitHandler  implements CurrentAspectHandler {
    @Override
    public Object around(ProceedingJoinPoint pjp, CurrentLimiter rateLimiter)  {
        //限流的返回数据可以自己根据需求场景设计
        JSONObject jsonObject=new JSONObject();
        jsonObject.put("resultCode",10011);
        jsonObject.put("msg","接口访问繁忙,休息一下");
        return jsonObject.toString();
    }
}


ps: 有兴趣的可以点进源码里面看,其实是我们非常熟悉的注解方式使用AOP的环绕。


第二部分,接口限流测试


我这边使用的是 Apache JMeter 压测工具给大家做个测试(大家不想额外用这种测试工具的话,设置并发QPS=1,然后手速快一点,再配合在接口里面sleep一下,也是能测试的,不过作为东道主,我就用这些专业点的给你们展示),


设置每秒10个并发


image.png


调用看下结果:


接口调用成功的返回是 success:


image.png


因为限流返回的失败处理是:


image.png



整体的结果是:


image.png


ps:提前跟小杠们说的 不是代码里设置的每秒5个并发么,为什么成功的才4个?


这个问题不做回应。


好了,这次springboot整合Current-Limiting 实现接口限流 就到此吧,其实看到yml的配置项,是可以设置系统级别的限流,但是该篇不做介绍,这些可以自己调试下就好,都是开箱即用。


ps:


这个限流jar不同版本差异还是存在的,如果是简单的单机使用,就用0.0.1版本即可:


0.0.1.RELEASE:单点限流,注解+全局配置。


0.0.2.RELEASE:结合Redis实现集群限流,使用选举算法选出Master节点。


0.0.3.RELEASE:可自定义规则限流、增加令牌桶算法与漏桶算法的切换,纳秒级并发控制。


0.0.4.RELEASE:解决大规模限流器注册而长时间不使用导致的内存泄漏问题,定时删除过期的限流器对象,秒级。统一线程池管理,并可定义核心线程数。


0.0.5.RELEASE:去掉集群限流器的锁操作,改进令牌桶算法,实现真正的无锁限流。使用享元模式减少大量对象的创建。


0.0.6.RELEASE:使用Lua脚本减少Redis网络请求次数。


0.0.7.RELEASE:从SpringBoot2切换到SpringBoot1.5开发。


0.0.8.RELEASE:修复了0.0.7版本的集群限流失效bug。



image.png

相关文章
|
3月前
|
存储 算法 安全
SpringBoot 接口加密解密实现
【10月更文挑战第18天】
|
2月前
|
Java 开发者 Spring
精通SpringBoot:16个扩展接口精讲
【10月更文挑战第16天】 SpringBoot以其简化的配置和强大的扩展性,成为了Java开发者的首选框架之一。SpringBoot提供了一系列的扩展接口,使得开发者能够灵活地定制和扩展应用的行为。掌握这些扩展接口,能够帮助我们写出更加优雅和高效的代码。本文将详细介绍16个SpringBoot的扩展接口,并探讨它们在实际开发中的应用。
63 1
|
3月前
|
存储 安全 Java
|
4月前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
|
3月前
|
监控 Java 开发者
掌握SpringBoot扩展接口:提升代码优雅度的16个技巧
【10月更文挑战第20天】 SpringBoot以其简化配置和快速开发而受到开发者的青睐。除了基本的CRUD操作外,SpringBoot还提供了丰富的扩展接口,让我们能够更灵活地定制和扩展应用。以下是16个常用的SpringBoot扩展接口,掌握它们将帮助你写出更加优雅的代码。
135 0
|
4月前
|
存储 前端开发 Java
springboot文件上传和下载接口的简单思路
本文介绍了在Spring Boot中实现文件上传和下载接口的简单思路。文件上传通过`MultipartFile`对象获取前端传递的文件并存储,返回对外访问路径;文件下载通过文件的uuid名称读取文件,并通过流的方式输出,实现文件下载功能。
springboot文件上传和下载接口的简单思路
|
5月前
|
前端开发 小程序 Java
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
本文详细介绍了如何在SpringBoot项目中统一处理接口返回结果及全局异常。首先,通过封装`ResponseResult`类,实现了接口返回结果的规范化,包括状态码、状态信息、返回信息和数据等字段,提供了多种成功和失败的返回方法。其次,利用`@RestControllerAdvice`和`@ExceptionHandler`注解配置全局异常处理,捕获并友好地处理各种异常信息。
2578 0
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
|
4月前
|
存储 数据采集 Java
Spring Boot 3 实现GZIP压缩优化:显著减少接口流量消耗!
在Web开发过程中,随着应用规模的扩大和用户量的增长,接口流量的消耗成为了一个不容忽视的问题。为了提升应用的性能和用户体验,减少带宽占用,数据压缩成为了一个重要的优化手段。在Spring Boot 3中,通过集成GZIP压缩技术,我们可以显著减少接口流量的消耗,从而优化应用的性能。本文将详细介绍如何在Spring Boot 3中实现GZIP压缩优化。
541 6
|
3月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
81 0
|
4月前
|
Java 网络架构
springboot配合thymeleaf,调用接口不跳转页面只显示文本
springboot配合thymeleaf,调用接口不跳转页面只显示文本
200 0