自定义注解之单机版限流

使用RateLimiter+自定义注解实现单机限流 单机限流 阅读详情

自定义注解之单机版限流

0、前言

1、实现自定义注解

1.1、创建自定义注解


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

/**
 * @author :
 * @date :Created in 15:11 2022/9/1
 * @description :自定义限流注解
 * @version: 1.0
 */
@Inherited
@Documented
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessLimit {
    // 限流方法名称
    String name() default "";
    // 每秒允许访问的次数10,底层令牌
    double permitsPerSecond() default 10;
}

1.2、通过AOP切面实现


import com.google.common.util.concurrent.RateLimiter;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

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

    @Resource
    protected HttpServletRequest httpServletRequest;

    //设置令牌生成的频率
    private Map<String, RateLimiter> rateLimiters = new ConcurrentHashMap<>();

    /**
     *  定义切入点
     * @Author 
     * @Date Created in 16:44 2022/9/1
     * @Description
     * @param
     * @return void
     **/
    @Pointcut("@annotation(com.*.annotation.AccessLimit)")
    public void limit() {
    }

    @Around("limit()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) {
        Signature signature = proceedingJoinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        AccessLimit accessLimit = methodSignature.getMethod().getDeclaredAnnotation(AccessLimit.class);
        double permitsPerSecond = accessLimit.permitsPerSecond();
        String name = accessLimit.name();
        RateLimiter rateLimiter = rateLimiters.get(name);
        if (rateLimiter == null) {
            rateLimiter = RateLimiter.create(permitsPerSecond);
            rateLimiters.put(name, rateLimiter);
        }
        boolean flag = rateLimiter.tryAcquire();
        Object obj = null;
        if (flag) {
            try {
                obj = proceedingJoinPoint.proceed();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        } else {
            log.warn("方法:{},{}", name, ExceptionCodeEnum.ACCESS_ERROR.getDesc());
            throw new BusinessException(ExceptionCodeEnum.ACCESS_ERROR);
        }
        return obj;
    }

}

1.3、使用

/**
 * @author :
 * @date :Created in 17:02 2022/9/2
 * @description :
 * @version: 1.0
 */
@Slf4j
@RestController
@RequestMapping(value = "/user")
@RequiredArgsConstructor
@Api(tags = "用户管理")
public class UserController {

    private final IUserService userService;

    @GetMapping
    @Operation(summary = "条件查询")
    @AccessLimit(name = "findUsers", permitsPerSecond = 40)
    public Result<PageResult<UserResponse>> findUser(UserConditionReq userReq) {
        log.info("[user--通过条件查询用户信息,data:{}]", userReq);
        return Result.success(userService.findUsersByCondition(userReq));
    }
}
从零实现反激式电源仿真:LTspice高级应用实例 深入解析反激式开关电源的建模与仿真过程,利用LTspice实现从零搭建电路,精准验证电路仿真效果,提升电源设计效率与可靠性。 阅读详情

相关推荐

再生龙(clonezilla)镜像比目标盘大——基于centos8.5

再生龙恢复到小盘遇到的问题及处理,首先是修改分区大小,进入dracut模式后再尝试恢复临时系统。

u010101453的博客 3692

java注解(实现原理及自定义注解)

注解的实现原理,自定义注解如何实现。

fengyanglian的博客 2350

MATLAB实战:5步搞定GNSS单点定位解算(附完整代码)

本文提供了一份基于MATLAB的GNSS单点定位实战指南。通过5个核心步骤,详细讲解了如何从卫星坐标和伪距观测值出发,利用最小二乘迭代算法,构建并实现一个完整的单点定位解算器。文章附有完整代码,并涵盖精度评估与结果分析,适合GNSS初学者和MATLAB用户快速上手实践。

a2b3c4d5e的博客 250

一般的注解aop切面解决限流问题。

/获取客户端等待令牌的时间。if(myRateLimiter == null){ //程序正常执行,执行目标方法。//设置限流速率 rateLimiter.setRate(rate);//使用反射获取方法上是否存在@MyRateLimiter注解。tryAcquire){ //服务降级。//从令牌桶获取令牌的超时时间。//判断客户端获取令牌是否超时。//实现桶的限流和aop切面。//向令牌桶放入令牌的速率。//获取到令牌,直接执行。//获取注解上的参数。

trench的博客 496

TDSQL-单机安装

根据腾讯云官方要求,TDSQL安装至少需要三台机器。本人想要学习TDSQL但是没有足够的机器资源,经过仔细分析研究TDSQL安装过程,尝试发现单台机器也可以成功安装TDSQL,现将本人单台机器安装TDSQL的过程以及安装过程中遇到的问题在此分享。具体安装过程可参考腾讯官方文档,本文仅分享与官方文档不一致的步骤。

u012607648的博客 6812

ros2 humble中使用realsense t265与d435

前提,安装realsense SDK 2.51.1版本并且能成功启动realsense-viewer V2.51.1想要在ros2中使用realsense t265,必须配合realsense SDK v2.51.1使用realsense-ros 4.51.1版本,因为新版本realsense ros2不再对t265支持下面记录源码编译安装 realsense-ros 4.51.1版本。

m0_72797388的博客 957

单机限流策略

单机限流策略 算法:计数器,滑动窗口,漏桶,令牌桶 计数器 在一段时间内进行计算,与阈值进行比较,到了时间临界点,计数器清零。 优点:实现简单 缺点:临界点请求突然暴增,导致服务器压力过大 滑动窗口 将时间划分为多个区间 在每个区间内每有一次请求就将计数器加一维持一个时间窗口,占据多个区间 每经过一个区间的时间,则抛弃最老的一个区间,并纳入最新的一个区间 如果当前窗口区间的请求计数总和超过了限制数量,则本窗口内所有的请求都被丢弃 优点:避免了固定窗口计数器带来的双倍突增请求 .

lk57445285的博客 379

ASProxy64.dll导致jetbrains家的IDE都无法打开。

摘要:在Windows11系统中,JetBrains IDE无法启动,报错指向ASProxy64.dll文件。该第三方DLL被注入到JVM原生层,导致内存访问冲突(错误代码0xc0000005)。经排查发现此文件来自Astrill软件。解决方案为卸载Astrill后重启电脑,问题得以解决。该案例表明第三方DLL注入可能影响IDE正常运行,卸载相关软件是最直接的解决方法。(149字)

猿小白的博客 940

SpringCloud:服务保护——通过Future机制自定义服务保护

一,上一篇通过Hystrix对服务保护进行了分析;这一篇基于Future,分版本由浅入深对服务降级和服务隔离机制进行说明 二,服务端代码,线程随机沉睡200MS以内,客户端调用100MS超时,制造可能超时场景 package com.gupao.member.service.impl; import com.gupao.api.service.IMemberServier; import ...

zp_zhang的博客 469

2026年数学建模国赛C题利器:层次分析法与主成分分析在统计建模中的应用

本文系统探讨了层次分析法(AHP)与主成分分析(PCA)在数学建模竞赛,特别是全国大学生数学建模竞赛C题中的联合应用策略。通过理论阐述、方法对比和案例实践,本文揭示了两种方法从“数据降维”到“决策评价”的完整分析链条,提出了“PCA+AHP”协同框架,并通过实际算例验证了该框架在解决复杂评价类问题中的有效性和优越性。研究表明,将PCA的客观降维能力与AHP的主观决策优势有机结合,能够显著提升统计建模的科学性、合理性和解释力,是应对日益复杂的竞赛题目的重要方法论工具。关键词:层次分析法;主成分分析;数学建模。

YOLO 41

[网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了逆向分析OllyDbg动态调试工具的基本用法,包括界面介绍、常用快捷键和TraceMe案例分析。这篇文章将继续详细讲解WannaCry蠕虫的传播机制,带领大家详细阅读源代码,分享WannaCry勒索病毒是如何传播感染的。作者分析该病毒一个月,一方面觉得自己技术菜,另一方面深知系统安全需要坚持,继续加油。希望文章对您有所帮助~

杨秀璋的专栏 1万+

令牌桶算法的限流组件实现

令牌桶算法的限流组件实现

qq_43649937的博客 613

【MODBUS】Java实现的Modbus协议类库——推荐j2mod库

Jamod是另一个开源的Modbus Java库。这个库的设计是完全面向对象的,基于抽象,应该支持易于理解、可重用性和可扩展性。它支持Modbus RTU和Modbus TCP,并且提供了主站和从站的功能。这是jamod Modbus库的一个分支,取自1.2.1版本,根据Apache 2许可证发布,包含在该项目的SVN存储库中。j2mod项目的目标是基于Java编程语言生成一个功能更全面的Modbus(tm)通信库。这是一个积极开发的项目,接受具有Modbus主站和从站开发经验的专业软件工程师提交的文件。

开源物联网项目商业化作者 5639

【限流】4 种常见的限流实现方案

自定义一个限流用的注解,后面在需要限流的方法或接口上面只需添加该注解即可// 限制类型 String limitType();// 每秒 5 个请求 double limitCount() default 5d;// 限制类型 String resourceName();// 每秒 5 个 int limitCount() default 5;

sco5282的博客 5705

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OpenHuman Web Scraper(web_fetch)深度指南:把“抓网页“变成“读文章“的专用取读工具

OpenHuman 为 Agent 内置了一个专用网络工具 `web_fetch`(文档中称为 Web Scraper),它与通用的 `http_request` / `curl` 不同,核心使命是"抓取 URL 并返回干净文本"——Agent 不需要原始 HTML,它需要的是文章正文。本文结合仓库源码,完整讲解该工具的能力边界、安全护栏、配置项与适用场景,读完即可掌握如何在 OpenHuman

gitblog_00999的博客 412

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spring AOP + Guava RateLimiter 用注解实现优雅限流

RateLimit这个注解承载了限流的所有配置元数据。/*** 限流阈值 (QPS),默认每秒 5 个*//*** 获取令牌的策略* true: 阻塞模式(直到拿到令牌或超时)* false: 非阻塞模式(拿不到立即失败)*//*** 阻塞等待的超时时间(仅当 block=true 时生效)* 默认 0,表示无限等待*//*** 超时时间单位*//*** 预热时间* 默认 0 (SmoothBursty);

xdpcxq1029的博客 1036

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

经典限流算法实现(结合AOP+注解以及拦截器)

想限制瞬时请求量 ➜ 用窗口法想限制整体处理速率 ➜ 用令牌桶或漏桶有突发请求但能缓冲 ➜ 用令牌桶需要严格匀速处理 ➜ 用漏桶参考链接:https://juejin.cn/post/7209504489010430010。

weixin_45865163的博客 875

使用Guava和AOP实现单机版限流

计数器限流、漏桶算法,令牌桶算法、滑动窗口。

qq798280904的博客 448

利用redis做分布式限流

SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 本篇从 Spring Boot、Redis 应用层面来实现分布式的限流…. 分布式限流 单机版中我们了解到 AtomicInteger、RateLimiter、Semaphore 这几种解决方案...

Vincent2014Linux 766

SpringBoot 2.x 优雅解决分布式限流

某天A君突然发现自己的接口请求量突然涨到之前的10倍,没多久该接口几乎不可使用,并引发连锁反应导致整个系统崩溃。如何应对这种情况呢?生活给了我们答案:比如老式电闸都安装了保险丝,一旦有人使用超大功率的设备,保险丝就会烧断以保护各个电器不被强电流给烧坏。同理我们的接口也需要安装上“保险丝”,以防止非预期的请求对系统压力过大而引起的系统瘫痪,当流量过大时,可以采取拒绝或者引流等机制。 一、常用的限流算...

我飞故我在的专栏 1万+

巧用SpringBoot优雅解决分布式限流

SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 本篇从Spring Boot、Redis应用层面来实现分布式的限流…. 分布式限流 单机版中我们了解到 AtomicInteger、RateLimiter...

578

SpringBoot(五)之分布式限流

为什么80%的码农都做不了架构师?>>> ...

weixin_33998125的博客 684

Spring AOP + Guava RateLimiter:我是如何用注解实现优雅限流的?

free-fs—— 一个基于 Spring Boot 4.x 的企业级文件管理网盘系统后端,专注于提供高性能、高可靠的文件存储和管理服务。功能特色完整的文件管理能力:不仅提供上传、下载、预览、重命名、移动、复制等常见的文件管理功能,而且支持文件分享、回收站机制功能强大的大文件传输:支持分片上传、断点续传、秒传功能,并且支持通过 SSE 技术实时推送上传进度丰富的在线预览:提供强大的文件在线预览功能,包括图片、文档、音视频、压缩包等类型文件的预览插件化存储。

FUfqpE4W2的博客 214

分布式服务限流

文章目录本章目标自定义注解切面LimitInterceptor注解使用 单机版中我们了解到 AtomicInteger、RateLimiter、Semaphore 这几种解决方案,但它们也仅仅是单机的解决手段,在集群环境下就透心凉了,后面又讲述了 Nginx 的限流手段,可它又属于网关层面的策略之一,并不能解决所有问题。例如供短信接口,你无法保证消费方是否会做好限流控制,所以自己在应用层实现限流还是很有必要的。 本章目标 利用 自定义注解、Spring Aop、Redis Cache 实现分布式限流 自定义

憧憬的专栏 274

实践应用:Spring Boot优雅解决分布式限流

*** 自定义异常*/super(msg);super(msg);return msg;

qq_39093474的博客 861

优雅解决分布式限流

SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 在前面的两篇文章中,介绍了一些限流的类型和策略,本篇从Spring Boot、Redis应用层面来实现分布式的限流…. 分布式限流 单机版中我们...

weixin_30371875的博客 70
上一篇: 9、SpringSecurity+JWT+RSA分布式版实战
下一篇: 自定义注解之防刷新(重复提交)(一)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白de成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值