专栏首页房东的猫Spring Boot 集成RateLimiter限流
原创

Spring Boot 集成RateLimiter限流

RateLimiter 限流

RateLimiter 是基于令牌桶实现的限速。

匀速执行

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

import java.time.LocalTime;

public class RateLimiterTest {

    public static void main(String[] args) {
        RateLimiter rateLimiter = RateLimiter.create(5);
        for (int i=0; i< 10; i++) {
            rateLimiter.acquire();
            System.out.println(LocalTime.now());
        }
    }

}

运行结果:
10:23:53.612
10:23:53.741
10:23:53.940
10:23:54.137
10:23:54.335
10:23:54.538
10:23:54.737
10:23:54.935
10:23:55.135
10:23:55.339

可以看到,基本是相隔200ms打印一次时间。

acquire 方法会返回秒级的耗时:

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

public class RateLimiterTest {

    public static void main(String[] args) {
        RateLimiter rateLimiter = RateLimiter.create(5);
        for (int i=0; i< 10; i++) {
            double timeCost = rateLimiter.acquire();
            System.out.println("获取令牌耗时(单位秒): " + timeCost);
        }
    }

}

运行结果:
获取令牌耗时(单位秒): 0.0
获取令牌耗时(单位秒): 0.198251
获取令牌耗时(单位秒): 0.197075
获取令牌耗时(单位秒): 0.195677
获取令牌耗时(单位秒): 0.19635
获取令牌耗时(单位秒): 0.196841
获取令牌耗时(单位秒): 0.195845
获取令牌耗时(单位秒): 0.194625
获取令牌耗时(单位秒): 0.199044
获取令牌耗时(单位秒): 0.1966

突发流量

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

import java.util.concurrent.TimeUnit;

public class RateLimiterTest {

    public static void main(String[] args) {
        RateLimiter rateLimiter = RateLimiter.create(5);
        System.out.println("sleep 5秒");
        Uninterruptibles.sleepUninterruptibly(5, TimeUnit.SECONDS);
        for (int i=0; i< 10; i++) {
            double timeCost = rateLimiter.acquire();
            System.out.println("获取令牌耗时(单位秒): " + timeCost);
        }
    }

}

运行结果:
获取令牌耗时(单位秒): 0.0
获取令牌耗时(单位秒): 0.0
获取令牌耗时(单位秒): 0.0
获取令牌耗时(单位秒): 0.0
获取令牌耗时(单位秒): 0.0
获取令牌耗时(单位秒): 0.0
获取令牌耗时(单位秒): 0.196621
获取令牌耗时(单位秒): 0.197801
获取令牌耗时(单位秒): 0.199491
获取令牌耗时(单位秒): 0.200235

RateLimiter.create(5) 指定每秒匀速产生 5 个令牌,且令牌桶中最多5个令牌。

示例代码中获取的前5个令牌是之前颁发的已经在令牌桶中的令牌,所以获取的很快,几乎是同一时间旧全部拿出了。

预热限速

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

import java.util.concurrent.TimeUnit;

public class RateLimiterTest {

    public static void main(String[] args) {

        RateLimiter rateLimiter = RateLimiter.create(2, 3, TimeUnit.SECONDS);
        for (int i=0; i< 10; i++) {
            double timeCost = rateLimiter.acquire();
            System.out.println("获取令牌耗时(单位秒): " + timeCost);
        }
    }
}

运行结果:
获取令牌耗时(单位秒): 0.0
获取令牌耗时(单位秒): 1.331039
获取令牌耗时(单位秒): 0.996633
获取令牌耗时(单位秒): 0.664236
获取令牌耗时(单位秒): 0.496114
获取令牌耗时(单位秒): 0.496574
获取令牌耗时(单位秒): 0.498551
获取令牌耗时(单位秒): 0.49505
获取令牌耗时(单位秒): 0.498739
获取令牌耗时(单位秒): 0.499335

可以看到,耗时是逐步减少到500ms左右。

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • Spring Cloud 入门教程9、服务限流/API限流(Zuul+RateLimiter)

    RateLimiter是Google开源的实现了令牌桶算法的限流工具(速率限制器)。http://ifeve.com/guava-ratelimiter/

    KenTalk
  • Spring Boot的应用限流

    前言 在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。 比如最近...

    程序猿DD
  • Spring Boot 集成 Spring Security

    Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用...

    阿宝哥
  • 详解Spring Boot的应用限流

    比如最近就有个这样的需求,我作为客户端要向kafka生产数据,而kafka的消费者则再源源不断的消费数据,并将消费的数据全部请求到web服务器,虽说做了负载(有...

    本人秃顶程序员
  • 6.1 Spring Boot集成mybatis6.1 Spring Boot集成mybatis

    在SpringBoot集成MyBatis时,我们将去掉和Mybatis配置相关的xml文件配置方式,用注解和属性配置来代替这些繁杂的配置。

    一个会写诗的程序员
  • Spring Boot(十八):使用 Spring Boot 集成 FastDFS

    上篇文章介绍了如何使用 Spring Boot 上传文件,这篇文章我们介绍如何使用 Spring Boot 将文件上传到分布式文件系统 FastDFS 中。

    纯洁的微笑
  • Spring Boot集成Mybatis

    Spring Boot集成Mybatis的配置方式有很多种,可以使用mybatis-spring-boot-starter、注解方式、传统集成方式等。本文采用的...

    高广超
  • Spring Boot日志集成

    Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starte...

    Java技术栈
  • Spring boot集成MybatisPlus

    Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。(摘自myba...

    二十三年蝉
  • Spring Boot 集成 Freemarker

    2. application.properties 文件中添加 Freemarker 相关配置

    北漂的我
  • Spring Boot集成Redis

    “ 在昨天我们讲解了如何在Linux上部署Redis,那么今天我们来看一看Spring Boot如何集成Redis。”

    每天学Java
  • Spring Boot集成FreeMarker

    FreeMarker是一种Java模板引擎,类似jsp、themleaf,FreeMarker适合用于页面伪静态化,方便爬虫爬取,比较适用于官网。

    小诸葛
  • MyBatis 集成 【Spring Boot】

    用户1180017
  • Spring Boot 集成 Memcached

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、...

    Cheng_Blog
  • Spring Boot 集成Thymeleaf

    thymeleaf 语法——input、select、radio、textarea 回显

    HLee
  • Spring Boot 集成 Mybatis

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工...

    微观技术
  • spring boot 集成Druid

    Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和...

    雷子
  • Spring Boot 集成 Kafka

    消息通信有两种基本模型,即发布-订阅(Pub-Sub)模型和点对点(Point to Point)模型,发布-订阅支持生产者消费者之间的一对多关系,而点对点模型...

    微观技术
  • 微服务三大利器之限流

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。缓存、降级和限流是保护微服务系统运行稳定性的三大利器。

    一笠风雨任生平

扫码关注云+社区

领取腾讯云代金券