最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。
环境:SpringBoot3.2.5
1. 简介
在项目开发中,API接口的稳定性与安全性至关重要,而过度的重试请求不仅可能消耗大量资源,还可能引发服务雪崩效应。通过AOP技术,开发者可以在不改变原有业务逻辑的情况下,优雅地实现对API调用重试次数的限制,从而有效保护后端服务,提升系统的整体健壮性。为什么需要对API调用进行次数的限制总结如下:
防止资源耗尽:频繁的API调用会消耗服务器资源,如CPU、内存、数据库连接等。如果不对重试次数进行限制,恶意用户或出错的客户端可能会通过不断重试来耗尽服务器资源,导致服务不可用。
防止服务雪崩:在微服务架构中,一个服务的失败可能会引发连锁反应,导致其他服务也相继失败,这种现象被称为服务雪崩。限制API接口的重试次数可以减少因单个服务失败而引发的连锁反应,降低服务雪崩的风险。
保护后端系统:后端系统可能包含敏感数据或执行关键业务逻辑。如果不对API调用的重试次数进行限制,攻击者可能会通过不断尝试来绕过安全措施,从而访问或篡改敏感数据。
提高系统稳定性:通过限制API接口的重试次数,可以确保系统在面对大量请求时能够保持稳定。这有助于减少系统崩溃的风险,提高系统的可靠性和可用性。
本篇文章将详细的介绍如何利用AOP的切面特性,对调用 失败/错误 的接口进行重试的限制。我们将按照如下的内容逐步的实现:
自定义注解
我们将通过自定义注解的方式定义当前接口允许重试的次数,时间范围(超过了指定次数后,将在给定的时间范围呢直接返回)及消息提示等内容。
定义缓存策略
该缓存策略将会根据当前项目中配置的所有接口限制时间,生成对应的缓存对象Cache。
整合SpEL表达式
为了不将配置写死在代码中,我们需要配置的注解属性都能支持可配置形式。
定义Aspect切面
该切面是实现接口重试限制的核心。
接下来,我们将按照上面的顺序逐步实现功能。
2. 实战案例
2.1 环境准备
我们将使用Caffeine作为我们缓存策略。
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
有关Caffeine的使用请查看下面这篇文章
2.2 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PackLimit {
/**在指定的时间内最多可以执行几次*/
int count() default 3 ;
/**缓存key,支持SpEL表达式*/
String key() default "" ;
/**限制的时间*/
int time() default 3 ;
/**显示时间范围内不允许调用*/
TimeUnit unit() default TimeUnit.SECONDS ;
/**被限制后提示信息*/
String message() default "不允许操作" ;
}
该注解属性都有默认值;在切面当中会根据具体注解配置的值进行设置。
2.3 缓存配置