限制API接口访问速率

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

免责声明:本人无意侵权,奈何找不到原文作者,也找不到网址,于是自己记录一下,如果有侵权之嫌,请联系我删除文章文章来源地址https://www.toymoban.com/news/detail-804485.html

依赖

  <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>32.1.3-jre</version>
        </dependency>

注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface RateConfigAnno {

    String limitType();

    double limitCount() default 5d;
}

aop

import cn.hutool.core.thread.ThreadUtil;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.util.concurrent.RateLimiter;
import com.tjbchtyw.tjflowcontrol.annocation.RateConfigAnno;
import com.tjbchtyw.tjflowcontrol.helper.RateLimitHelper;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.io.IOException;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.Objects;

@Aspect
@Component
public class GuavaLimitAop {

    private static final Logger logger = LoggerFactory.getLogger(GuavaLimitAop.class);

    @Before("@annotation(com.tjbchtyw.tjflowcontrol.annocation.RateConfigAnno)")
    public void limit(JoinPoint joinPoint) {
        //1、获取当前的调用方法
        Method currentMethod = getCurrentMethod(joinPoint);
        if (Objects.isNull(currentMethod)) {
            return;
        }
        //2、从方法注解定义上获取限流的类型
        String limitType = currentMethod.getAnnotation(RateConfigAnno.class).limitType();
        double limitCount = currentMethod.getAnnotation(RateConfigAnno.class).limitCount();
        //使用guava的令牌桶算法获取一个令牌,获取不到先等待
        RateLimiter rateLimiter = RateLimitHelper.getRateLimiter(limitType, limitCount);
      //  boolean b =true;
        boolean pass = rateLimiter.tryAcquire();
        if (pass) {
            System.out.println("获取到令牌");
        }else {
            //重试 仅测试用 有优化方案可以放在评论区
            for (int i = 0; i < 5; i++) {
                ThreadUtil.safeSleep(1000);
                System.out.println("第" + (i + 1)  + "次获取令牌");
                if(rateLimiter.tryAcquire()) break;
                if(i == 4){
                    System.out.println("在第" + (i + 1) +"次后未获取到令牌 开始限流");
                    HttpServletResponse resp = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
                    JSONObject jsonObject=new JSONObject();
                    jsonObject.put("success",false);
                    jsonObject.put("msg","限流中");
                    try {
                        output(resp, jsonObject.toJSONString());
                    }catch (Exception e){
                        logger.error("error,e:{}",e);
                    }
                }
            }

        }
    }

    private Method getCurrentMethod(JoinPoint joinPoint) {
        Method[] methods = joinPoint.getTarget().getClass().getMethods();
        Method target = null;
        for (Method method : methods) {
            if (method.getName().equals(joinPoint.getSignature().getName())) {
                target = method;
                break;
            }
        }
        return target;
    }

    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(StandardCharsets.UTF_8));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            outputStream.flush();
            outputStream.close();
        }
    }
}

helper

import com.google.common.util.concurrent.RateLimiter;

import java.util.HashMap;
import java.util.Map;

public class RateLimitHelper {

    private RateLimitHelper(){}

    private static final Map<String,RateLimiter> rateMap = new HashMap<>();

    public static RateLimiter getRateLimiter(String limitType, double limitCount ){
        RateLimiter rateLimiter = rateMap.get(limitType);
        if(rateLimiter == null){
            rateLimiter = RateLimiter.create(limitCount);
            rateMap.put(limitType,rateLimiter);
        }
        return rateLimiter;
    }

}

Test

@RestController
    @Tag(name = "测试Controller", description = "这是描述")
    @RequestMapping("/pred-api")
    public class FlowController {
        @Autowired
        FlowContext flowContext;
    
        @PostMapping("/pdf/test")
        //Count 限制次数
        @RateConfigAnno(limitType = "makePdf",limitCount = 15)
        @Operation(summary = "限流接口")
        public String flowCont(@Parameter(name = "pdfParam", description = "参数对象,type标识执行不同的策略") @RequestBody Param Param) {
         
            return "test";
        }
    
    }

到了这里,关于限制API接口访问速率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • OpenAI-ChatGPT最新官方接口《速率并发限制》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(八)(附源码)

    为了保证系统的可靠性和稳定性,ChatGPT设置了速率限制,限制每个用户在特定时间段内可以发送的消息数量。这样可以防止某些用户对系统进行滥用,并且减少资源占用。ChatGPT 的速率限制比较灵活,会根据用户的行为以及服务器的负载情况动态调整。例如,在繁忙的时段,

    2024年02月03日
    浏览(93)
  • openResty+lua+redis实现接口访问频率限制

    OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。 OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团

    2024年02月11日
    浏览(38)
  • SpringBoot限制接口访问频率 - 这些错误千万不能犯

    最近在基于SpringBoot做一个面向普通用户的系统,为了保证系统的稳定性,防止被恶意攻击,我想控制用户访问每个接口的频率。为了实现这个功能,可以设计一个annotation,然后借助AOP在调用方法之前检查当前ip的访问频率,如果超过设定频率,直接返回错误信息。 在开始介

    2024年02月05日
    浏览(34)
  • Turbo Intruder:突破速率限制

    很多测试因为速度达不到而使理论上的结果无法实现。即使可以增加线程数来提升速度,资源占用问题也会成为另一种瓶颈。 Turbo Intruder 是一个 Burp Suite 扩展插件, 用于发送大量 HTTP 请求并分析结果 。它旨在处理那些需要异常速度、持续时间或复杂性的攻击来补充Burp Intr

    2024年02月15日
    浏览(35)
  • 探索浏览器录屏Web API 接口的应用前景与限制

    简化录屏流程:浏览器录屏Web API 接口可以直接在网页中调用,无需安装额外的插件或软件,简化了录屏的流程。 实时录制与传输:Web API 接口可以实时录制用户操作并将录屏数据传输到服务器,实现即时的用户行为监测和分析。 跨平台兼容性:浏览器录屏Web API 接口在不同

    2024年03月09日
    浏览(43)
  • 猫头虎分享:Springboot项目中实现IP白名单限制访问接口的深度探讨

    博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接 : 🔗 精选专栏 : 《面试题大全》 — 面试准备的宝典! 《IDEA开发秘籍》 — 提升你的IDEA技能! 《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师! 《100天精通Golang(基础入门篇)》 — 踏入

    2024年02月22日
    浏览(49)
  • Taurus .Net Core 微服务开源框架:Admin 插件【4-8】 - 配置管理-Mvc【Plugin-Limit 接口访问限制、IP限制、Ack限制】

    继上篇:Taurus .Net Core 微服务开源框架:Admin 插件【4-7】 - 配置管理-Mvc【Plugin-Metric 接口调用次数统计】 本篇继续介绍下一个内容: 配置界面如下: 限制目前提供以下三个类别的限制: 对三种类别限制都有效。 对三种类别限制都有效。 对三种类别限制都有效。 对三种类别

    2024年02月04日
    浏览(30)
  • 【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

    使用Azure API Management, 想对一些固定的IP地址进行访问次数的限制,如被限制的IP地址一分钟可以访问10次,而不被限制的IP地址则可以无限访问?   最近ChatGPT爆火,所以也把这个问题让ChatGPT来解答,然后人工验证它的回答正确与否? 根据对APIM Policy的文档参考, choose 和 rat

    2023年04月24日
    浏览(33)
  • OpenAI取消GPT-4 Turbo每日限制,速率提升一倍;扩散模型的理论基础

    🦉 AI新闻 🚀 OpenAI取消GPT-4 Turbo每日限制,速率提升一倍 摘要 :OpenAI宣布取消GPT-4 Turbo的每日限制,提升速率限制1倍,每分钟可处理高达150万TPM的数据。 OpenAI解释速率限制对防止API滥用、确保公平访问和管理基础设施负载的重要性。 OpenAI发布了避免速率限制的攻略,包括使

    2024年02月21日
    浏览(30)
  • k8s之API接口访问

    1.1 API是什么? API(Application Programming Interface,应用程序接口): 是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。 用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。

    2024年02月06日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包