Java 使用 Google Guava 实现接口限流
一、引入依赖
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version>
</dependency>
二、自定义注解及限流拦截器
自定义注解:@Limiter
package com.haitai.web.device.annotation;import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;/*** 限流注解** @Author xincheng.du* @Date 2023/7/5 17:13*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Limiter {/*** 每秒创建令牌个数,默认:0.5* 代表每秒允许通过的请求数为0.5个,即2秒只能通过一个请求*/double qps() default 0.5D;/*** 获取令牌等待超时时间 默认:500*/long timeout() default 500;/*** 超时时间单位 默认:毫秒*/TimeUnit timeunit() default TimeUnit.MILLISECONDS;/*** 限速提示信息*/String msg() default "访问过于频繁,请稍候再试";
}
限流拦截器:RequestLimitingInterceptor
package com.haitai.web.device.interceptor;import com.google.common.util.concurrent.RateLimiter;
import com.haitai.web.device.annotation.Limiter;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 限流拦截器** @Author xincheng.du* @Date 2023/7/5 15:38*/
@Component
@Slf4j
public class RequestLimitingInterceptor implements HandlerInterceptor {private final Map<String, RateLimiter> rateLimiterMap = new ConcurrentHashMap<>();@Overridepublic boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) {if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;Limiter rateLimit = handlerMethod.getMethodAnnotation(Limiter.class);// 判断是否有注解if (rateLimit != null) {// 获取请求urlString url = request.getRequestURI();// 判断map集合中是否有创建好的令牌桶rateLimiterMap.put(url, rateLimiterMap.computeIfAbsent(url, key -> RateLimiter.create(rateLimit.qps())));RateLimiter rateLimiter = rateLimiterMap.get(url);// 获取令牌boolean acquire = rateLimiter.tryAcquire(rateLimit.timeout(), rateLimit.timeunit());if (!acquire) {log.warn("请求被限流,url:{}", request.getServletPath());throw new RuntimeException(rateLimit.msg());}}}return true;}}
三、测试
package com.haitai.web.controller.device;import com.haitai.common.annotation.Anonymous;
import com.haitai.web.device.annotation.Limiter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Author xincheng.du* @Date 2023/7/24 10:04*/
@RestController
@RequestMapping("/test")
public class LimiterTestController {@Anonymous // 允许匿名访问@Limiter(qps = 0.2D) // 5秒一次@GetMapping("/limiter")public void limiter() {System.out.println("=============正常请求=============");}}
5秒内第一次请求:

5秒内第二次请求:

相关文章:
Java 使用 Google Guava 实现接口限流
一、引入依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version> </dependency>二、自定义注解及限流拦截器 自定义注解:Limiter package com.haita…...
帮助中心的价值是什么?怎样才能在线搭建官网网站帮助中心?
帮助中心(Help Center)是一个提供公司或组织产品或服务相关信息的在线平台。它的价值在于为用户提供便捷的自助服务和解决问题的渠道,同时也能减轻客服人员的负担。 如何在线搭建官网网站帮助中心的步骤 确定需求:在搭建帮助中心…...
Kubernetes——理论基础
Kubernetes——理论基础 一、Kubernetes 概述1.K8S 是什么?2.为什么要用 K8S?3.Kubernetes 主要功能 二、Kubernetes 集群架构与组件三、Master 组件1.Kube-apiserver2.Kube-controller-manager3.Kube-scheduler4.配置存储中心——etcd 四、Node 组件1.Kubelet2.Ku…...
【VUE3】
Vue 3 是当下最流行的前端框架之一,其主要特点是性能更好、体积更小、更易于维护。下面是 Vue 3 的一些重要知识点和代码示例: 创建 Vue 实例 import { createApp } from vueconst app createApp({data() {return {message: Hello, Vue 3!}} })app.mo…...
《金融数据保护治理白皮书》发布(137页)
温馨提示:文末附完整PDF下载链接 导读 目前业界已出台数据保护方面的治理模型,但围绕金融数据保护治理的实践指导等尚不成熟,本课题围绕数据保护治理的金融实践、发展现状,探索和标准化相关能力要求,归纳总结相关建…...
上海亚商投顾:沪指震荡微涨 金融、地产午后大幅走强
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数早盘震荡,午后集体拉升反弹,创业板指涨超1%。券商等大金融板块午后再度走强&#…...
Linux文件管理知识:查找文件
前几篇文章一一介绍了LINUX进程管理控制命令及网络层面的知识体系,综所周知,一个linux系统是由很多文件组成的,那么既然有那么多文件,那我们该如何管理这些文件呢? Linux中的所有数据都是以文件形式存在的,…...
【TypeScript】安装的坑!
TypeScript安装 安装TypeScript安装时候可能报错这样开头的数据(无法枚举容器中的对象)——原因:没权限先解决没权限的问题如果发现无法修改-高级-修改继续安装想使用tsc-发现,tsc不能用解决方法:配置环境变量最后的最…...
spring boot 2.x 使用 jpa 映射 json mysql列数据映射乱码
通过下面的依赖,可以将 mysql 的 json 列字段(mysql 5.7及以上的版本支持),映射成 Java Bean <dependency><groupId>com.vladmihalcea</groupId><artifactId>hibernate-types-52</artifactId><v…...
创建Helm脚本
一、创建脚本 Helm 是 Kubernetes 的包管理工具,它可以帮助您简化和自动化 Kubernetes 应用程序的部署和管理。使用 Helm,您可以创建和管理称为 Helm Chart 的应用程序打包,这些 Chart 包含了 Kubernetes 资源和配置信息,可以在不…...
2.05 购物车后台刷新并显示
一.用户登录添加商品使用cookie存入购物车,并把购物车商品传入到后台 步骤1:创建购物车BO对象 public class ShopcartBO {private String itemId;private String itemImgUrl;private String itemName;private String specId;private String specName;p…...
2023年第四届“华数杯”数学建模思路 - 案例:异常检测
文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常检测 异常…...
inline的盒子设置transform不生效
目录 如何遇到的问题原因为什么会这样怎么解决 如何遇到的问题 最近在开发过程中,因为需要对一个icon进行旋转,而icon本身,是设置span的伪类来进行的,结果我发现无论怎么设置transform都无法使其生效。 span::before {font-famil…...
自然语言处理学习笔记(四)————词典分词
目录 1.中文分词 2.词典分词 (1)词的定义 (2)词典性质——齐夫定律 (3)词典 (4)加载词典 (5)hanlp词典路径 1.中文分词 中文分词:指的是将一…...
jsoncpp库和nlohmann-json库实现JSON与字符串类型转换
在ROS中,可以使用jsoncpp库来实现JSON与字符串类型之间的转换。jsoncpp是ROS自带的一个JSON库,它提供了一些函数来解析和生成JSON数据。 下面是一个使用jsoncpp库实现JSON与字符串类型转换的示例代码: #include <ros/ros.h> #include…...
20230803 函数传参引用
定义多输出变量的函数时,通过直接传参数内存地址在函数内部直接修改外部变量的值。需要定义函数时 在输入参数前加 引用符号 & 。 C 值传递、指针传递、引用传递详解...
IDEA SpringBoot项目引入外部jar并打包
1、首先,我们再pom.xml中导入依赖包时,打包可以正常进行。 但如果我们引入了第三方的外部jar包(这里需要先把jar包添加到该项目依赖库中,这里不做演示),如图 2、导致打包时报错,程序包不存在或…...
ModaHub魔搭社区——阿里云通义千问宣布开源!70亿参数模型上线魔搭社区,免费可商用
通义千问开源!8月3日,AI模型社区魔搭ModaHub上架两款开源模型Qwen-7B和Qwen-7B-Chat,阿里云确认其为通义千问70亿参数通用模型和对话模型,两款模型均开源、免费、可商用。在多个权威测评中,通义千问7B模型取得了远超国内外同等尺寸模型的效果,成为当下业界最强的中英文7B…...
Jenkins 自动化部署实例讲解,另附安装教程!
【2023】Jenkins入门与安装_jenkins最新版本_丶重明的博客-CSDN博客 也可以结合这个互补看 前言 你平常在做自己的项目时,是否有过部署项目太麻烦的想法?如果你是单体项目,可能没什么感触,但如果你是微服务项目,相…...
arcgis字段计算器
1、两字段叠加。要求待叠加的字段类型为文本或字符串类型。如下: 2、字符串部分提取。...
Vue-Awesome:10分钟快速掌握Vue.js最佳SVG图标组件
Vue-Awesome:10分钟快速掌握Vue.js最佳SVG图标组件 【免费下载链接】vue-awesome Awesome SVG icon component for Vue.js, built-in with Font Awesome icons. 项目地址: https://gitcode.com/gh_mirrors/vu/vue-awesome Vue-Awesome是Vue.js生态中最受欢迎…...
Plecs电力电子仿真进阶指南-高效操作与实用技巧
1. Plecs电力电子仿真效率提升秘籍 刚接触Plecs时,我总是一步一步地点击菜单栏操作,效率低得让人抓狂。直到有天看到同事手指在键盘上飞舞,几分钟就完成了我半小时的工作量,才意识到掌握快捷键的重要性。下面这些组合键是我在实际…...
手把手教你解决Realsense D455在ROS下IMU数据不输出的问题(附固件降级指南)
深度解析Realsense D455在ROS中IMU数据丢失的排查与修复方案 最近在机器人开发社区中,不少工程师反馈在使用Intel Realsense D455深度相机时遇到了一个棘手问题——在ROS环境中无法获取IMU数据,而在realsense_viewer工具中却能正常显示。这个问题看似简单…...
Python如何计算移动平均值_Pandas实现滚动窗口函数应用
rolling()默认右对齐,前N?1行不足时返回NaN;需中心对齐用centerTrue;时间序列优先用rolling(5D);min_periods1可首行出值但掩盖稀疏问题;apply()须返回标量,推荐lambda x: x.quantile(0.5);ski…...
全球远程工作机会:开发者地理套利策略
远程革命下的测试职业新机遇随着云计算与协作工具的普及,软件测试行业正经历全球化重构。世界经济论坛预测,2030年全球完全远程岗位将达9.2亿个。对测试工程师而言,地理套利(Geoarbitrage)——通过为高薪地区雇主远程服…...
保姆级教程:用Python和OpenCV同时录制RealSense D435i的深度、彩色、红外和IMU数据流
RealSense D435i多模态数据采集实战:从环境配置到自动化脚本的全流程指南 当你第一次拿到RealSense D435i这款强大的深度感知设备时,可能会被它丰富的传感器阵列所震撼——RGB摄像头、立体红外摄像头、深度传感器以及惯性测量单元(IMU)的集成,…...
【例题2】图书管理(信息学奥赛一本通- P1456)
【题目描述】图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入。为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统。该系统需要支持 2 种操作&…...
让万物互联更简单:物联网设备iPaaS系统集成解决方案
物联网设备集成面临严峻挑战,根据Eseye 2025年报告,76%的企业因硬件盲点导致项目受阻,35%因连接不稳定增加成本与损失效率。数据迫切证明,需通过iPaaS实现统一集成,打通数据壁垒、保障安全合规,释放物联网潜…...
LiuJuan Z-Image Generator部署教程:NVIDIA Jetson Orin边缘设备部署可行性
LiuJuan Z-Image Generator部署教程:NVIDIA Jetson Orin边缘设备部署可行性 想在自己的NVIDIA Jetson Orin设备上跑一个高质量的图片生成工具吗?今天我们来聊聊LiuJuan Z-Image Generator在边缘设备上的部署可能性。 这是一个基于阿里云通义Z-Image扩散…...
【全球仅开放前500份】2026奇点大会图像描述生成白皮书精要版:含可商用微调框架+中文细粒度评估集
第一章:2026奇点智能技术大会:图像描述生成 2026奇点智能技术大会(https://ml-summit.org) 本届大会首次设立“视觉语义协同”专项赛道,聚焦图像描述生成(Image Captioning)在多模态大模型驱动下的范式跃迁。与传统基…...
