Spring Boot实现接口限流

server/2024/10/20 12:52:45/

API限流是一种重要的策略,用于控制对API的访问速率,以保护后端服务免受过载和滥用。以下是API限流的必要性:

  1. 防止服务过载

    当API的请求量突然激增时,如果没有限流措施,可能会导致服务器资源耗尽,从而影响服务的稳定性和可用性。
  2. 提高系统稳定性

    通过限制每个用户的请求频率,可以确保系统在高负载下仍能正常运行,避免因单个用户或服务的过度请求而导致的系统崩溃。
  3. 防止恶意攻击

    限流可以作为一种安全措施,防止恶意用户通过发起大量请求来攻击系统,如DDoS攻击或暴力破解尝试。

在 Spring Boot 中,可以通过多种方式实现接口限流。

以下是几种常用的实现方法:

1. 使用 Bucket4j

Bucket4j 是一个 Java 的限流库,可以很容易地集成到 Spring Boot 项目中。

步骤:

  1. 添加 Maven 依赖:

    <!-- https://mvnrepository.com/artifact/com.bucket4j/bucket4j-core -->
    <dependency><groupId>com.bucket4j</groupId><artifactId>bucket4j-core</artifactId><version>8.10.1</version>
    </dependency>
    
  2. 创建限流配置:

    import net.jodah.bucket4j.Bucket;
    import net.jodah.bucket4j.BucketBuilder;
    import java.time.Duration;@Service
    public class RateLimiterService {private final Bucket bucket;public RateLimiterService() {this.bucket = Bucket.builder().addLimit(BucketLimit.of(10, Duration.ofMinutes(1))).build();}public boolean tryConsume() {return bucket.tryConsume(1);}
    }
    
  3. 在控制器中使用限流:

    @RestController
    public class MyController {private final RateLimiterService rateLimiterService;@Autowiredpublic MyController(RateLimiterService rateLimiterService) {this.rateLimiterService = rateLimiterService;}@GetMapping("/api")public ResponseEntity<String> api() {if (!rateLimiterService.tryConsume()) {return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("请求过于频繁,请稍后再试。");}return ResponseEntity.ok("请求成功!");}
    }
    

2. 使用 Spring Cloud Gateway

如果你使用 Spring Cloud Gateway,可以在配置文件中设置限流规则。

示例配置:

spring:cloud:gateway:routes:- id: my_routeuri: lb://my-servicepredicates:- Path=/api/**filters:- requestRateLimiter:rateLimiter:refillPolicy:tokens: 10duration: 1sburstCapacity: 20

3. 使用 AOP 方式

通过 AOP(面向切面编程)也可以实现限流。

步骤:

  1. 创建注解:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface RateLimit {int limit() default 10; // 限制次数int timeout() default 60; // 超时时间
    }
    
  2. 使用 AOP 切面:

    @Aspect
    @Component
    public class RateLimitAspect {// 实现限流逻辑@Around("@annotation(rateLimit)")public Object limit(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {// 限流逻辑return joinPoint.proceed();}
    }
    
  3. 在需要限流的控制器方法上使用:

    @RestController
    public class MyController {@RateLimit(limit = 10, timeout = 60)@GetMapping("/api")public ResponseEntity<String> api() {return ResponseEntity.ok("请求成功!");}
    }
    

4. 集成第三方库Resilience4j

  • Resilience4j是一个轻量级的容错库,它提供了多种限流器实现,如SemaphoreBasedRateLimiter
  • 添加Resilience4j依赖后,可以配置限流器,并在控制器中使用注解@RateLimiter进行限流。

5.使用分布式锁实现限流

  • 在某些情况下,可以使用分布式锁(如Redisson)来实现限流,尤其是在需要防止用户重复操作的场景中。

结论

以上是常用的几种限流实现方式,可以根据项目需求选择适合的方法。

选择哪种限流方案取决于具体的业务需求和系统架构。对于分布式系统,通常推荐使用Redis或第三方库如Resilience4j来实现限流,以保证限流的准确性和一致性。而对于单机应用,Guava RateLimiter或Spring Boot Actuator的@RateLimiter注解可能是更简单的选择。


http://www.ppmy.cn/server/133340.html

相关文章

网站cms系统 开源cms建站系统

在数字化时代&#xff0c;企业对于快速、灵活且成本效益高的网站构建方案的需求日益增长。开源CMS&#xff08;内容管理系统&#xff09;建站系统因其灵活性、可定制性和强大的社区支持而成为众多企业和开发者的首选。本文将探讨开源CMS系统的优势、功能、应用案例以及如何选择…

《京东金融APP的鸿蒙之旅系列专题》新特性篇:意图框架接入

作者&#xff1a;京东科技 杨拓 一、意图框架服务介绍 HarmonyOS NEXT引入了多项创新特性&#xff0c;其中的意图框架能够将应用中的业务功能智能分发至手机的各大系统入口&#xff0c;其中系统入口包括小艺对话、小艺搜索和小艺建议等。通过这一特性&#xff0c;用户不仅可以主…

【Golang】Go语言Web开发之模板渲染

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Vue Google 广告的配置

前置条件&#xff1a;已经在Google AdSense 中 添加网站 并通过审核 同时已创建广告单元。 因 VUE 的 Script 配置问题&#xff0c;所以不能直接拷贝内容。 index.html 配置 添加 Google 广告的脚本。 //index.template.html /* * 在head标签中添加 script 【 **** 】&#…

【Docker】Harbor 私有仓库和管理

目录 一、搭建本地私有仓库 二、harbor简介&#xff08;特性、构成、架构的数据流向&#xff09; 2.1 什么是Harbor 2.2 Harbor的特性 2.3 Harbor的构成 2.4 Harbor的工作原理&#xff08;运行流程&#xff09; 三、harbor部署以及配置文件 1. 部署 Docker-Compose 服…

React中的useState和useEffect解析

一、组件状态管理——useState 1.定义 useState 是一个 React Hook&#xff08;函数&#xff09;&#xff0c;它允许我们向组件添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 和普通JS变量不同的是&#xff0c;状态变量一旦发生变化组件的视图UI也会跟着变化&…

STM32F1+HAL库+FreeTOTS学习17——事件标志组

STM32F1HAL库FreeTOTS学习17——事件标志组 1. 事件标志组1.1 事件标志组的的引入1.2 事件标志组简介1.3 事件标志组与队列、信号量的区别 2. 事件标志组下相关API函数2. 1 xEventGroupCreate()2. 2 xEventGroupCreateStatic()2. 3 vEventGroupDelete()2. 4 xEventGroupWaitBit…

python 爬虫 入门 三、登录以及代理。

目录 一、登录 &#xff08;一&#xff09;、登录4399 1.直接使用Cookie 2.使用账号密码进行登录 可选观看内容&#xff0c;使用python对密码进行加密&#xff08;无结果代码&#xff0c;只有过程分析&#xff09; 二、代理 免费代理 后续&#xff1a;协程&#xff0c;…