Spring Boot 3自定义注解+拦截器+Redis实现高并发接口限流

在当今互联网应用开发中,高并发访问是一个常见的挑战。为了保障系统的稳定性和可靠性,我们需要对接口进行限流,防止因过多的请求导致系统崩溃。

本文将介绍如何利用Spring Boot 3中的自定义注解、拦截器和Redis实现高并发接口限流,帮助程序员解决这一挑战。

1. 自定义注解

首先,我们需要定义一个自定义注解,用来标识需要进行限流的接口。在Spring Boot中,可以通过自定义注解来实现对接口的标记和控制。下面是一个简单的自定义注解的示例:

java 复制代码
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessLimit {
    int value() default 100; // 默认限流阈值为100
    int seconds() default 60; // 默认时间窗口为60秒
}

2. 拦截器

接下来,我们需要编写一个拦截器,用来拦截被@AccessLimit注解标记的接口,并进行限流处理。拦截器可以在请求到达Controller之前进行预处理,从而实现对接口的限流控制。

下面是一个简单的拦截器的示例:

java 复制代码
@Component
public class AccessLimitInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class);
            if (accessLimit != null) {
                int limit = accessLimit.value();
                int seconds = accessLimit.seconds();
                String key = request.getRequestURI();
                String count = redisTemplate.opsForValue().get(key);
                if (count == null) {
                    redisTemplate.opsForValue().set(key, "1", seconds, TimeUnit.SECONDS);
                } else {
                    int accessCount = Integer.parseInt(count);
                    if (accessCount < limit) {
                        redisTemplate.opsForValue().increment(key);
                    } else {
                        response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
                        return false;
                    }
                }
            }
        }
        return true;
    }
}

3. 注册拦截器

接下来,我们需要将拦截器注册到Spring Boot应用程序中,以便拦截器能够生效。在Spring Boot中,可以通过WebMvcConfigurer来注册拦截器。

下面是一个简单的拦截器注册的示例:

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private AccessLimitInterceptor accessLimitInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(accessLimitInterceptor);
    }
}

4. Redis实现限流

最后,我们需要利用Redis来实现接口的限流功能。Redis是一个高性能的内存数据库,非常适合用来存储限流的计数器。我们可以利用Redis的原子操作来实现对接口访问次数的统计和控制。

下面是一个简单的利用Redis实现限流的示例:

java 复制代码
@Component
public class AccessLimitInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class);
            if (accessLimit != null) {
                int limit = accessLimit.value();
                int seconds = accessLimit.seconds();
                String key = request.getRequestURI();
                String count = redisTemplate.opsForValue().get(key);
                if (count == null) {
                    redisTemplate.opsForValue().set(key, "1", seconds, TimeUnit.SECONDS);
                } else {
                    int accessCount = Integer.parseInt(count);
                    if (accessCount < limit) {
                        redisTemplate.opsForValue().increment(key);
                    } else {
                        response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
                        return false;
                    }
                }
            }
        }
        return true;
    }
}

总结

通过以上步骤,我们成功地利用Spring Boot 3中的自定义注解、拦截器和Redis实现了高并发接口限流。

这种方式能够有效地保护系统免受高并发请求的影响,保障系统的稳定性和可靠性。

相关推荐
在肯德基吃麻辣烫2 分钟前
《Redis》缓存与分布式锁
redis·分布式·缓存
Seven979 分钟前
了解GC吗?什么是GC?
java
Edingbrugh.南空24 分钟前
Flink ClickHouse 连接器维表源码深度解析
java·clickhouse·flink
掘金-我是哪吒44 分钟前
分布式微服务系统架构第157集:JavaPlus技术文档平台日更-Java多线程编程技巧
java·分布式·微服务·云原生·架构
飞翔的佩奇1 小时前
Java项目:基于SSM框架实现的忘忧小区物业管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告】
java·数据库·mysql·vue·毕业设计·ssm框架·小区物业管理系统
RainbowSea1 小时前
跨域问题(Allow CORS)解决(3 种方法)
java·spring boot·后端
掘金-我是哪吒1 小时前
分布式微服务系统架构第155集:JavaPlus技术文档平台日更-Java线程池实现原理
java·分布式·微服务·云原生·架构
RainbowSea1 小时前
问题 1:MyBatis-plus-3.5.9 的分页功能修复
java·spring boot·mybatis
前端 贾公子1 小时前
monorepo + Turborepo --- 开发应用程序
java·前端·javascript
不学会Ⅳ2 小时前
Mac M芯片搭建jdk源码环境(jdk24)
java·开发语言·macos