AOP高级应用,优雅实现异常重试机制

文摘   2024-11-12 19:00   新疆  

最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。

环境:SpringBoot3.2.5



1. 简介

在项目开发中,API接口的稳定性与安全性至关重要,而过度的重试请求不仅可能消耗大量资源,还可能引发服务雪崩效应。通过AOP技术,开发者可以在不改变原有业务逻辑的情况下,优雅地实现对API调用重试次数的限制,从而有效保护后端服务,提升系统的整体健壮性。为什么需要对API调用进行次数的限制总结如下:

  1. 防止资源耗尽:频繁的API调用会消耗服务器资源,如CPU、内存、数据库连接等。如果不对重试次数进行限制,恶意用户或出错的客户端可能会通过不断重试来耗尽服务器资源,导致服务不可用。

  2. 防止服务雪崩:在微服务架构中,一个服务的失败可能会引发连锁反应,导致其他服务也相继失败,这种现象被称为服务雪崩。限制API接口的重试次数可以减少因单个服务失败而引发的连锁反应,降低服务雪崩的风险。

  3. 保护后端系统:后端系统可能包含敏感数据或执行关键业务逻辑。如果不对API调用的重试次数进行限制,攻击者可能会通过不断尝试来绕过安全措施,从而访问或篡改敏感数据。

  4. 提高系统稳定性:通过限制API接口的重试次数,可以确保系统在面对大量请求时能够保持稳定。这有助于减少系统崩溃的风险,提高系统的可靠性和可用性。

     

       

本篇文章将详细的介绍如何利用AOP的切面特性,对调用 失败/错误 的接口进行重试的限制。我们将按照如下的内容逐步的实现:

  1. 自定义注解

    我们将通过自定义注解的方式定义当前接口允许重试的次数,时间范围(超过了指定次数后,将在给定的时间范围呢直接返回)及消息提示等内容。

  2. 定义缓存策略

    该缓存策略将会根据当前项目中配置的所有接口限制时间,生成对应的缓存对象Cache。

  3. 整合SpEL表达式

    为了不将配置写死在代码中,我们需要配置的注解属性都能支持可配置形式。

  4. 定义Aspect切面

    该切面是实现接口重试限制的核心。

     

接下来,我们将按照上面的顺序逐步实现功能。

2. 实战案例

2.1 环境准备

我们将使用Caffeine作为我们缓存策略。

<dependency>  <groupId>com.github.ben-manes.caffeine</groupId>  <artifactId>caffeine</artifactId></dependency>

有关Caffeine的使用请查看下面这篇文章

高性能缓存神器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 缓存配置

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章