rate-limit 一款 java 开源渐进式分布式限流框架使用介绍

news2024/12/22 19:51:21

项目简介

rate-limit 是一个为 java 设计的渐进式限流工具。

目的是为了深入学习和使用限流,后续将会持续迭代。

特性

  • 渐进式实现

  • 支持独立于 spring 使用

  • 支持整合 spring

  • 支持整合 spring-boot

  • 内置多种限流策略

在这里插入图片描述

快速开始

需求

  • jdk 1.7

  • maven 3.x+

maven 导入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>rate-limit-core</artifactId>
    <version>1.1.0</version>
</dependency>

入门例子

方法定义

@RateLimit 限流注解放在方法上,指定对应的限制频率。

也可以定义在类上,默认下面的所有方法生效。方法上的优先级高于类。

属性说明默认值
value方法访问一次消耗的令牌数1
timeUnit时间单位TimeUnit.SECONDS
interval时间间隔60
count可调用次数1000
enable是否启用true

默认为 60S 内,可以调用 1000 次。

public class UserService {

    @RateLimit(interval = 2, count = 5)
    public void limitCount() {
        log.info("{}", Thread.currentThread().getName());
    }

}

这个例子中我们 2S 内最多调用 5 次。

代码测试

RateLimitProxy.getProxy(xxx) 通过字节码获取方法对应的方法代理。

@Test(expected = RateLimitRuntimeException.class)
public void limitCountErrorTest() {
    UserService userService = RateLimitProxy.getProxy(new UserService());
    for(int i = 0; i < 3; i++) {
        userService.limitCount();
    }
}

当调用超出限制时,默认抛出 RateLimitRuntimeException 异常。

这里默认使用的是令牌桶算法,所以会出现异常。

重复注解 @RateLimits

有时候我们希望同时做多个的限制:

(1)一分钟不超过 10 次

(2)一小时不超过 30 次

为了支持多个配置,我们引入了新的注解 @RateLimits,可以指定一个 @RateLimit 数组。

方法上同时使用 @RateLimits + @RateLimit 是可以同时生效的,不过为了简单,一般不建议混合使用。

@RateLimits({@RateLimit(interval = 2, count = 5)})
public void limitCount() {
    //...
}

指定引导类

RateLimitProxy.getProxy(new UserService());

等价于

RateLimitProxy.getProxy(new UserService(), RateLimitBs.newInstance());

下面我们来一起看一下 RateLimitBs 引导类。

引导类

RateLimitBs 作为引导类,便于用户自定义配置。

方法说明默认值
rateLimit限流策略RateLimits.tokenBucket() 令牌桶算法
timer时间策略Timers.system() 系统时间
cacheService缓存策略CommonCacheServiceMap 基于本地 map 的缓存策略
cacheKeyNamespace缓存KEY命名空间RATE-LIMIT 避免不同的应用,命名冲突。
configService限制配置策略RateLimitConfigService 默认基于方法上的注解
tokenService身份标识策略RateLimitTokenService 默认基于 IP
methodService方法标识策略RateLimitMethodService 默认基于方法名+参数类型
rejectListener拒绝策略RateLimitRejectListenerException 限流时抛出异常

其中 rateLimit 内置 RateLimits 工具中的策略如下:

方法说明
fixedWindow()固定窗口
slideWindow(int windowNum)滑动窗口,可指定窗口大小
slideWindow()滑动窗口,默认为 10
slideWindowQueue()滑动窗口,基于队列的实现
leakyBucket()漏桶算法
tokenBucket()令牌桶算法

配置建议

  1. 分布式系统,cacheService 建议使用基于 redis 的集中式缓存策略。

  2. configService 如果想更加灵活,可以基于数据库的配置查询

RateLimitBs 引导类

RateLimitBs 默认配置如下:

RateLimitBs.newInstance()
      .timer(Timers.system())
      .methodService(new RateLimitMethodService())
      .tokenService(new RateLimitTokenService())
      .rejectListener(new RateLimitRejectListenerException())
      .configService(new RateLimitConfigService())
      .cacheService(new CommonCacheServiceMap())
      .rateLimit(RateLimits.tokenBucket())
      .cacheKeyNamespace(RateLimitConst.DEFAULT_CACHE_KEY_NAMESPACE);

spring 整合

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>rate-limit-spring</artifactId>
    <version>1.1.0</version>
</dependency>

类定义

方法

和上面使用类似,直接在方法上声明 @RateLimit 注解即可。

@Service
public class UserService {

    private static final Log log = LogFactory.getLog(UserService.class);

    @RateLimit(interval = 2, count = 5)
    public void limitCount() {
        log.info("{}", Thread.currentThread().getName());
    }

}

配置

通过 @EnableRateLimit 声明启用限流。

@Configuration
@ComponentScan("com.github.houbb.rate.limit.test.core")
@EnableRateLimit
public class SpringConfig {

}

@EnableRateLimit 的属性配置和 RateLimitBs 属性是以一一对应的。

方法说明默认值
rateLimit限流策略令牌桶算法
timer时间策略系统时间
cacheService缓存策略基于本地 map 的缓存策略
cacheKeyNamespace缓存KEY命名空间RATE-LIMIT 避免不同的应用,命名冲突。
configService限制配置策略默认基于方法上的注解
tokenService身份标识策略默认基于 IP
methodService方法标识策略默认基于方法名+参数类型
rejectListener拒绝策略限流时抛出异常

这里的属性值,都是对应的 spring bean 名称,支持用户自定义。

spring-boot 整合

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>rate-limit-springboot-starter</artifactId>
    <version>1.1.0</version>
</dependency>

使用

其他和 spring 保持一致。

缓存相关工具

cache: 手写渐进式 redis

common-cache: 通用缓存标准定义

redis-config: 兼容各种常见的 redis 配置模式

lock: 开箱即用的分布式锁

resubmit: 防重复提交

rate-limit: 限流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM S5PV210 时钟系统与时钟体系框图

前言 This chapter describes the clock management unit (CMU) supported by S5PV210. The system controller (SYSCON) manages CMU and power management unit (PMU) in S5PV210. 本章介绍 S5PV210 支持的时钟管理单元&#xff08;CMU&#xff09;。系统控制器&#xff08…

【软考】系统集成项目管理工程师(十一)项目人力资源管理

一、项目人力资源管理概述二、激励理论1. 马斯洛需求层次理论2. 赫茨伯格的双因素理论3. X 理论/ Y 理论4. 期望理论三、人力资源管理子过程1. 规划人力资源管理2. 组建项目团队3. 建设项目团队4. 管理项目团队一、项目人力资源管理概述 在了解人力资源管理之前,我们先来认识…

从局部到全局:语义相似度的测地线距离

©PaperWeekly 原创 作者 | 苏剑林单位 | 追一科技研究方向 | NLP、神经网络前段时间在最近的一篇论文《Unsupervised Opinion Summarization Using Approximate Geodesics》[1] 中学到了一个新的概念&#xff0c;叫做“测地线距离&#xff08;Geodesic Distance&#xff…

.net开发安卓入门 - Service (服务)

.net开发安卓入门 - Service Android Service 概述Service VS Thread &#xff08;服务和线程之间进行选择&#xff09;前台服务代码启动前台服务方法运行效果后台服务代码启动代码绑定服务AIDL同系列文章推荐Android Service 概述 移动应用不像桌面应用。 桌面具有大量资源&a…

基于51单片机的正弦波发生器设计

程序运行图&#xff1a; 仿真原理图&#xff1a; 部分程序&#xff1a; #include <reg52.h> //接口定义 sbit DA P1^1; sbit CK P1^2; sbit CS P1^4; //10bit取样&#xff0c;1024点正弦查表数据 unsigned int code sine_dot[1024] { 0x200,0x203,0x206,0x209,…

可视化编排的数据集成和分发开源框架Nifi轻松入门-上

文章目录概述定义dataflow面临挑战特性核心概念架构高级概述安装部署常见处理器入门示例概述 定义 Nifi 官网地址 https://nifi.apache.org/ Nifi 官网文档 https://nifi.apache.org/docs.html Nifi GitHub源码地址 https://github.com/apache/nifi Apache NiFi是一个易于使用…

NetInside助力IT提高业务性能管理能力(二)

​​需求简介 某外高桥公司的OA系统是其重要的业务系统&#xff0c;OA系统负责人表示&#xff0c;部分用户反馈&#xff0c;访问OA系统时比较慢。需要通过分析系统看一下实际情况。 本次分析重点针对OA系统性能进行分析&#xff0c;以供安全取证、性能分析、网络质量监测以及…

关于推特隐私设置的一些小窍门

大家在使用推特进行引流的时候&#xff0c;在使用的时候难免会遇到一些功能模糊不清&#xff0c;这里twitter群推王给大家总结了一些偏门功能应该如何去设置&#xff0c;让你使用起来更加得心应手。 一、推特怎么设置自动放声音 1、首先打开推特APP并登陆。 2、其次在推特主…

CPDA认证|数据分析能给企业带来哪些好处?

数据分析的核心并不在于数据本身&#xff0c;而在于设计有意义、有价值的数据分析主题与指标体系&#xff0c;通过科学有效的手段去分析&#xff0c;进而发现问题优化迭代。 无论分析给出的结果是积极的还是负面的&#xff0c;都是价值承载体&#xff0c;必须以客观的态度面对。…

Enum枚举

枚举一般是针对常量需求,优化代码,.使代码看起来简洁 看下下面这个工具类 说有问题,那就是是看起来代码不够简洁 我看着倒还行,也许也是枚举不怎么实用的原因 下面就用枚举来优化这个代码,首先看下枚举介绍 java中对常量数据的配置可以使用枚举类型实现,,枚举类型是面向对象…

3小时!开发ChatGPT微信小程序

导读 | 上周OpenAI发布了对话语言模型 ChatGPT&#xff0c;相关讨论引爆全网。你是否也迫不及待体验一番&#xff1f;本文特邀作者腾讯云开发者社区作者戴传友从开发环境准备、开发过程、服务器接口、腾讯API网关接入到部署&#xff0c;详细教你如何动手开发一个chatGPT微信小程…

2022年华中杯数学建模挑战赛A题分拣系统优化问题

2022年华中杯数学建模 A 题 分拣系统优化问题 真的有想占便宜的 醉了 几十元让我写论文这是什么选手 想占便宜想疯了么 还要求查重率在10% 一开始说想看看你的A题论文 想学习一下 然后谈完价(几十块钱)之后 需要改成现做一篇独一无二的论文 然后想套路我占便宜 套路是真的深啊…

【R语言绘图】R在气象、水文中数据处理及结果分析、绘图技术

【查看原文】R语言在气象、水文中数据处理及结果分析、绘图实践技术应用 【内容简述】&#xff1a; 一、R简介与 R 在气象水文中的应用 R语言与 R软件简介 R 在各行业的应用 R 与其他语言的比较及其在数据分析与作图上的优势 R 在地学中的应用以及R 在气象水文中的应用 二、…

【react】虚拟DOM的两种创建方式

1、使用js创建虚拟DOM <body><div id"test"></div><!-- 引入react核心库 --><script src"../js/react.development.js"></script><!-- 引入react-dom&#xff0c;用于支持react操作dom --><script src"…

大数据期末课设~基于spark的气象数据处理与分析

目录 一 、项目背景 .......................................... 3 二 、实验环境 .......................................... 3 三 、实验数据来源 ................................... 4 四 、数据获取 .......................................... 5 五 、数据分析 ....…

港科夜闻|2022年香港科大气候适应及复原力大会圆满闭幕,政经领袖研讨香港气候政策与绿色金融发展...

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、2022年香港科大气候适应及复原力大会圆满闭幕&#xff0c;政经领袖研讨香港气候政策与绿色金融发展。该会议由香港科大主办&#xff0c;于12月10日开幕。会议以跨领域的知识及观点交流为方针&#xff0c;凝聚公营及私营部门…

vulnhub serial讲解

环境搭建 下载 https://download.vulnhub.com/serial/serial.zip ​ 你会得到一个这样的文件&#xff0c;这里使用VMware新建一个虚拟机&#xff0c;这里记录比较重要的几部分。 ​ ​ ​ ​ 这里就是使用我们刚才下过来的。 ​ 漏洞过程详解 1.信息收集 netdiscover -i …

[附源码]Node.js计算机毕业设计调查问卷及调查数据统计系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【论文】Auto-Encoding Variational Bayes

1.预备概念 1.1 后验分布 最大后验&#xff08;Maximum a Posteriori&#xff0c;MAP&#xff09;概率估计详解 【参考文章】https://blog.csdn.net/fq_wallow/article/details/104383057 1.2 重参数 Reparameterization 目的是&#xff1a; 转为公式表达从而实现微分 知乎…

编辑部已成羊村,这几天幸亏有ChatGPT(doge)

梦晨 羿阁 发自 凹非寺量子位 | 公众号 QbitAI坏事了&#xff0c;AI真的来抢饭碗了。还是我的饭碗&#xff01;这两天你们看的推送&#xff0c;有些标题是AI帮忙取的&#xff0c;有些文章甚至由AI完成了主要工作。我呢&#xff1f;我不过是打打下手&#xff0c;加些过渡句&…