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

这篇具有很好参考价值的文章主要介绍了Spring Boot 3自定义注解+拦截器+Redis实现高并发接口限流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

1. 自定义注解

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

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

2. 拦截器

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

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

@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来注册拦截器。

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

@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实现限流的示例:

@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实现了高并发接口限流。

这种方式能够有效地保护系统免受高并发请求的影响,保障系统的稳定性和可靠性。文章来源地址https://www.toymoban.com/news/detail-860390.html

到了这里,关于Spring Boot 3自定义注解+拦截器+Redis实现高并发接口限流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自定义注解与拦截器实现不规范sql拦截(自定义注解填充插件篇)

    在自定义注解与拦截器实现不规范sql拦截(拦截器实现篇)中提到过,写了一个idea插件来辅助对Mapper接口中的方法添加自定义注解,这边记录一下插件的实现。 在上一篇中,定义了一个自定义注解对需要经过where判断的Mapper sql方法进行修饰。那么,现在想使用一个idea插件来

    2024年01月23日
    浏览(39)
  • SpringBoot Redis 注解 拦截器来实现接口幂等性校验

    幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如:订单接口, 不能多次创建订单 支付接口, 重复支付同一笔订单只能扣一次钱 支付宝回调接口, 可能会多次回调, 必须处理重复回调 普通表单提交接口, 因为网络超时等原因多次点击提

    2024年01月19日
    浏览(42)
  • 使用spring boot拦截器实现青少年模式

    便用Spring Boot拦截器采累计在线时间采实现青少年模式的步骤,可以参考以卜步骤: 1.创建一个拦截器类,实现Handlerlnterceptor 接口。 2.在拦截器类中,定义一个变量来记录用户在线时间。 3.在preHandle方法中,记录用户的登录时间。 4.在afterCompletion方法中,计算用户在线时间,

    2023年04月08日
    浏览(33)
  • 防重复提交:自定义注解 + 拦截器(HandlerInterceptor)

    防重复提交:自定义注解 + 拦截器(HandlerInterceptor) 一、思路: 1、首先自定义注解; 2、创建拦截器实现类(自定义类名称),拦截器(HandlerInterceptor); 3、创建类:配置拦截器路径(拦截URL规则); 二、代码示例: 1、首先自定义注解; 2、创建拦截器实现类(自定义类名

    2024年02月10日
    浏览(31)
  • spring boot3token拦截器链的设计与实现

      ⛰️个人主页:     蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 写在前面 流程分析 需要清楚的 实现步骤 1.定义拦截器 2.创建拦截器链配置类 3.配置拦截器链顺序 4.配置拦截排除项 最后 本文介绍了spring boot后端服务开发中有关如何设计

    2024年03月11日
    浏览(38)
  • 【Spring Boot系列】- Spring Boot拦截器

    拦截器(Interceptor)是在面向切面编程中应用的,就是在service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能。 在 Spring Boot 项目中,

    2024年02月13日
    浏览(31)
  • spring boot 拦截器例子

    在Spring Boot中,拦截器是通过实现`HandlerInterceptor`接口来实现的。它允许你在请求到达控制器方法之前和之后执行自定义的逻辑。下面我将为你提供一个简单的Spring Boot拦截器的例子。 假设我们有一个简单的控制器类`UserController`,其中有两个请求处理方法:`getUser`和`saveUser`,

    2024年02月15日
    浏览(28)
  • Spring Boot 配置拦截器

    通过拦截器,我们可以针对特定 URI 做拦截,做相关业务处理,比如检查用户是否登录,打印每个请求的处理耗时等。 新建登录验证类  LoginValidationInterceptor.java : 定义一个拦截器类后,您需要实现  HandlerInterceptor  接口,其有三个方法可以重写: preHandle : 在调用 Controller 方

    2024年02月08日
    浏览(42)
  • Spring Boot 统一功能处理(拦截器实现用户登录权限的统一校验、统一异常返回、统一数据格式返回)

    目录 1. 用户登录权限校验 1.1 最初用户登录权限效验 1.2 Spring AOP 用户统⼀登录验证 1.3 Spring 拦截器 (1)创建自定义拦截器 (2)将自定义拦截器添加到系统配置中,并设置拦截的规则 1.4 练习:登录拦截器 (1)实现 UserController 实体类 (2)返回的登录页面:login.html (3)实

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包