SpringBoot利用Guava实现单机app限流访问

这篇具有很好参考价值的文章主要介绍了SpringBoot利用Guava实现单机app限流访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot利用Guava实现单机app限流访问

物料准备:
1.引入Guava依赖
2.定义一个限流注解作用于api接口的方法上
3.定义一个切面,对注解标注的方法实现一个限流访问

引入Guava依赖

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.2-jre</version>
        </dependency>

定义注解@RateLimitAspect

package com.example.demo.service.guava;

import java.lang.annotation.*;


@Inherited
@Documented
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimitAspect {
}

定义对应的处理的AOP逻辑

package com.example.demo.service.guava;

import com.alibaba.fastjson.JSON;
import com.example.demo.web.AjaxPubResponse;
import com.google.common.util.concurrent.RateLimiter;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;



@Component
@Scope
@Aspect
@Slf4j
public class RateLimitAop {

    @Autowired
    private HttpServletResponse response;
    @Pointcut("@annotation(com.example.demo.service.guava.RateLimitAspect)")
    public void serviceLimit() {
    }
    private RateLimiter rateLimiter = RateLimiter.create(5.0); //比如说,我这里设置"并发数"为5
    @Around("serviceLimit()")
    public Object around(ProceedingJoinPoint joinPoint) {
        Boolean flag = rateLimiter.tryAcquire();
        Object obj = null;
        try {
            if (flag) {
                obj = joinPoint.proceed();
            }else{
                String result = JSON.toJSONString(AjaxPubResponse.error("2003", "未获取到许可"));
//                String result = JSONObject.fromObject(AjaxPubResponse.error("100", "failure")).toString();
                output(response, result);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
        log.info("flag={},obj={}",flag,obj);
//        System.out.println("flag=" + flag + ",obj=" + obj);
        return obj;
    }


    public void output(HttpServletResponse response, String msg) throws IOException {
        response.setContentType("application/json;charset=UTF-8");
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
            outputStream.write(msg.getBytes("UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            outputStream.flush();
            outputStream.close();
        }
    }

}


使用方法,把@RateLimitAspect 注解添加到需要限流的API接口上即可,如
添加到@GetMapping 或 @PostMapping上文章来源地址https://www.toymoban.com/news/detail-515411.html

到了这里,关于SpringBoot利用Guava实现单机app限流访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Guava RateLimiter限流

    令牌桶是按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减为零时则拒绝新的请求;漏桶则是按照常量固定速率流出请求,流入请求速率任意,当流入的请求数累积到漏桶容量时,则新流入的请求被拒绝; 令牌桶限制的是平均流入速率,允

    2024年02月10日
    浏览(29)
  • Java的guava 限流写法

    就这么简单!

    2024年02月11日
    浏览(19)
  • (四)RabbitMQ高级特性(消费端限流、利用限流实现不公平分发、消息存活时间、优先级队列

    Lison dreamlison@163.com , v1.0.0 , 2023.06.23 之前我们讲过MQ可以对请求进行“削峰填谷”,即通过消费端限流的方式限制消息的拉取速度,达到保护消费端的目的。 1、 生产者批量发送消息 2、消费端配置限流机制 3、消费者监听队列 在RabbitMQ中,多个消费者监听同一条队列,则队列

    2024年02月15日
    浏览(32)
  • springboot 自定义注解 ,实现接口限流(计数器限流)【强行喂饭版】

    思路:通过AOP拦截注解标记的方法,在Redis中维护一个计数器来记录接口访问的频率, 并根据限流策略来判断是否允许继续处理请求。 另一篇:springboot 自定义注解 ,aop切面@Around; 为接口实现日志插入【强行喂饭版】 不多说,直接上代码: 一:创建限流类型 二:创建注解

    2024年02月15日
    浏览(52)
  • springboot高级教程基于 redis 通过注解实现限流

    Spring Boot整合Redis有一种方便的方式是使用注解方式实现限流。 可以通过自定义注解的方式来标注需要限流的方法,在方法执行前进行限流的检查。 以下是具体实现方式: 1. 自定义注解`@RedisLimit`,并定义注解元素,如限流的时间、限流的次数等。 2. 编写切面类`RedisLimitAspe

    2024年02月10日
    浏览(27)
  • SpringBoot第22讲:SpringBoot如何实现接口限流之分布式

    上文中介绍了单实例下如何在业务接口层做限流,本文是SpringBoot第22讲,主要介绍分布式场景下限流的方案, 以及什么样的分布式场景下需要在业务层加限流而不是接入层 ; 并且结合 开源的ratelimiter-spring-boot-starter 为例,作者是kailing, 学习 思路+代码封装+starter封装 。

    2024年02月13日
    浏览(30)
  • 【微服务】springboot 通用限流方案设计与实现

    目录 一、背景 二、限流概述 2.1 dubbo 服务治理模式 2.1.1 dubbo框架级限流 2.1.2 线程池设

    2024年02月10日
    浏览(27)
  • 从0到1实现单机记账APP原理与细节uniApp内含源码 (一)

    具体演示如下面视频所示。免费下载地址:点击进入 预览APP(内含开屏广告)下载地址:http://8.142.10.182:8888/down/aWHWeGaEQE2W.apk 服务器买的便宜,带宽很小所以下载速度慢,主要还是囊中羞涩,哈哈。 内容有点长,将结构、样式、方法都写进去了,可以复制粘贴直接用,资源就

    2024年02月09日
    浏览(31)
  • SpringBoot定义拦截器+自定义注解+Redis实现接口防刷(限流)

    在拦截器Interceptor中拦截请求 通过地址+请求uri作为调用者访问接口的区分在Redis中进行计数达到限流目的 定义参数 访问周期 最大访问次数 禁用时长 代码实现 定义拦截器:实现HandlerInterceptor接口,重写preHandle()方法 注册拦截器:配置类实现WebMvcConfigurer接口,重写addIntercep

    2024年02月05日
    浏览(43)
  • 【springboot】spring的Aop结合Redis实现对短信接口的限流

    场景: 为了限制短信验证码接口的访问次数,防止被刷,结合Aop和redis根据用户ip对用户限流 首先我们创建一个 Spring Boot 工程,引入 Web 和 Redis 依赖,同时考虑到接口限流一般是通过注解来标记,而注解是通过 AOP 来解析的,所以我们还需要加上 AOP 的依赖,最终的依赖如下:

    2024年02月05日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包