Guava限流工具RateLimiter使用
公司最近在推一个限流工具接入,提供的功能有单机限流、集群限流等。想了解一下限流的原理和设计,看了一下wiki里面有提到用了guava的ratelimiter工具,查了一些资料了解了一下
主要的限流算法有: 漏斗算法和令牌桶算法
漏斗算法: 往漏斗里面放请求,我的理解漏斗就是一个变量或者集合。在以固定的速率去消费这些请求,如果请求超过了漏斗的容量,就溢出,即被限流
令牌桶算法: 以一定的速度向一个桶(一个变量或者其他设计)放令牌(变量加1)。请求来了,去桶里获取令牌,如果获取到,就执行。没有获取到,阻塞,看源码,应该是sleep了一段时间
写了一个demo, 很简单
guava maven依赖
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- <version>27.0-jre</version>
- </dependency>
RateLimiter.java
- import com.google.common.util.concurrent.RateLimiter;
- /**
- * @Author: <guanxianseng@163.com>
- * @Description:
- * @Date: Created in : 2018/11/4 3:02 PM
- **/
- public class RateLimiterDemo {
- public static void main(String[] args) {
- testWithRateLimiter();
- }
- public static void testWithRateLimiter() {
- RateLimiter limiter = RateLimiter.create(1.0); // 每秒不超过1个任务被提交
- for (int i = 0; i < 1000; i++) {
- double timeWaited = limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞
- System.out.println("time waited: " + timeWaited);
- }
- }
- }
备注: 这里被限流的请求可能会一直被hold住,如果想立刻返回可以使用tryAcquire()这个guava api
后面还需要查资料,看下源码
1. 怎么放令牌的
2. 怎么取令牌的
3. sleep的时间怎么计算的
Guava限流工具RateLimiter使用的更多相关文章
- guava的限流工具RateLimiter使用
guava限流工具使用 非常详细的一篇使用博客:https://www.cnblogs.com/yeyinfu/p/7316972.html 1,原理:Guava RateLimiter基于令牌桶算法 ...
- java限流工具类
代码 import com.google.common.util.concurrent.RateLimiter; import java.util.concurrent.ConcurrentHashM ...
- 最近学习了限流与RateLimiter
前言 分布式环境下应对高并发保证服务稳定几招,按照个人理解,优先级从高到低分别为缓存.限流.降级.熔断,每招都有它的作用,本文重点就讲讲限流这部分. 坦白讲,其实上面的说法也不准确,因为服务降级.熔断 ...
- java高并发系列 - 第15天:JUC中的Semaphore,最简单的限流工具类,必备技能
这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能 ...
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- Lavavel5.5源代码 - 限流工具
app('redis')->connection('default')->throttle('key000') // 每60秒,只能有10个资源被获取,在3秒内获取不到锁抛出异常 -> ...
- 常用限流算法与Guava RateLimiter源码解析
在分布式系统中,应对高并发访问时,缓存.限流.降级是保护系统正常运行的常用方法.当请求量突发暴涨时,如果不加以限制访问,则可能导致整个系统崩溃,服务不可用.同时有一些业务场景,比如短信验证码,或者其它 ...
- 超详细的Guava RateLimiter限流原理解析
超详细的Guava RateLimiter限流原理解析 mp.weixin.qq.com 点击上方“方志朋”,选择“置顶或者星标” 你的关注意义重大! 限流是保护高并发系统的三把利器之一,另外两个是 ...
- RateLimit--使用guava来做接口限流
转:https://blog.csdn.net/jiesa/article/details/50412027 一.问题描述 某天A君突然发现自己的接口请求量突然涨到之前的10倍,没多久该接口几乎不 ...
随机推荐
- PHP 访问链接的3种方式
对于php访问url的方法比价多,对于一些防护比较低的网站,可以轻易的实现刷网站浏览量的可能 1.fopen方式 function access_url($url) { if ($url=='') r ...
- Windows 断开CIFS共享出现 “此网络连接不存在”
Windows 断开CIFS共享出现 "此网络连接不存在" 首先请您尝试 net use * /delete /y 命令,若无效本文就是为您准备的. 检查是否是因为用户被设置共享桌 ...
- docker微服务部署之:一,搭建Eureka微服务项目
先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...
- linux C API连接并查询mysql5.7.9
开发环境: ubuntu16.04 mysql5.7.9 原生C API VIM 配置远程连接 配置mysql允许远程连接的方法默认情况下,mysql只允许本地登录,如果要开启远程连接,则需要修改/e ...
- 手动抠下的wordpress登录页面样式
CSS文件 login.css body, html { height: 100%; margin: 0; padding: 0; } html[Attributes Style] { -webkit ...
- 2018-2019 20165226 Exp7 网络欺诈防范
2018-2019 20165226 Exp7 网络欺诈防范 目录 一.实验内容说明及基础问题回答 二.实验过程 1.简单应用SET工具建立冒名网站 2.ettercap DNS spoof 3.结合 ...
- flask _bootstrap中使用flash
在模板中获取flash闪现的那段代码要和内容块放在同一级别上.不然网页上是看不到闪现的内容的. 比如在基模板里定义一个content block ,里面一个是get_flashed_messages代 ...
- [BZOJ 2894]世界线
传送门 \(\color{green}{solution}\) 在开这道题之前建议先看看3756:pty的字符串,然后你会发现这题就很zz了. 当然,作为一名合格的博主,我还是应该写点什么的 首先,我 ...
- 自定义ASP.NET Core日志中间件
这个日志框架使用的是ASP.NET Core的NLog,用来记录每次请求信息和返回信息. 1.首先创建一个Web应用项目,我选择的是MVC模板: 2.使用NuGet添加Microsoft.Extens ...
- 2019.4.24 3D效果滚筒导航练习
效果图: 彩千圣天下第一!(小声bb) 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...