基于RateLimiter实现单机版限流方案

作者:神秘网友 发布时间:2020-10-31 19:53:26

基于RateLimiter实现单机版限流方案

基于RateLimiter实现单机版限流方案

RateLimiter 限流方案只适合轻量级别的单机限流,并不适合分布式限流

pom.xm文件

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>

application.yml

spring:
  application:
    name: rate-limiter
server:
  port: 10086

启动方法

@SpringBootApplication
public class RateLimiterApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(RateLimiterApplication.class).web(WebApplicationType.SERVLET).run(args);

    }

}

controller

package hy.controller;

import com.google.common.util.concurrent.RateLimiter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

/**
 * @author 寒夜
 */
@RestController
@Slf4j
public class Controller {
    RateLimiter limiter = RateLimiter.create(2.0);

    /**
     * 非阻塞限流
     *
     * @param count 每秒消费的令牌个数 (每秒允许放行的请求次数)
     * @return success/fail
     */
    @GetMapping("/tryAcquire")
    public String tryAcquire(Integer count) {
        if (limiter.tryAcquire(count)) {
            log.info("success,rate is {}", limiter.getRate());
            return "success";
        } else {
            log.info("fail ,rate is {} ", limiter.getRate());
            return "fail";
        }

    }

    /**
     * 限定时间的非阻塞限流
     *
     * @param count 每秒消费的令牌个数 (每秒允许放行的请求次数)
     * @return success/fail
     */
    @GetMapping("/tryAcquireWithTimeOut")
    public String tryAcquireWithTimeOut(Integer count, Integer timeout) {
        if (limiter.tryAcquire(count, timeout, TimeUnit.SECONDS)) {
            log.info("success,rate is {}", limiter.getRate());
            return "success";
        } else {
            log.info("fail ,rate is {} ", limiter.getRate());
            return "fail";
        }

    }

    /**
     * 同步阻塞限流
     * @param count 每秒消费的令牌个数 (每秒允许放行的请求次数)
     * @return success
     */
    @GetMapping("/acquire")
    public String acquire(Integer count) {
        limiter.acquire(count);
        log.info("success,rate is {}", limiter.getRate());
        return "success";
    }

}

 

实际项目中可以直接写入到代码实现类中,也可以写入拦截器里面。

看成功记录的时间间隔

http://127.0.0.1:10086/tryAcquire?count=2

基于RateLimiter实现单机版限流方案

http://127.0.0.1:10086/tryAcquireWithTimeOut?count=10&timeout=5

基于RateLimiter实现单机版限流方案

http://127.0.0.1:10086/acquire?count=4

多次点击会发现请求会被阻塞,返回延时

基于RateLimiter实现单机版限流方案

 

 

                                                                                                                           点赞关注,后续更新分布式限流方案

 

 

 

 

 

基于RateLimiter实现单机版限流方案相关教程

  1. 自定义的View实现跟随手指的小兔子

    自定义的View实现跟随手指的小兔子 按前面的例子新创建一个project,再在project中新创建一个module 将需要的背景图和兔子图片放入mipmap中 将布局管理器改为帧布局管理器 ?xml version=1.0 encoding=utf-8?//修改为帧布局管理器FrameLayoutFrameLayout xmlns

  2. 基于电商中台架构-商品系统设计(二):类目设计

    基于电商中台架构-商品系统设计(二):类目设计 类目设计 概念定义 什么是类目 前后台类目 属性和属性值 导航属性 销售属性 普通属性 子属性和子属性值 技术设计 关系图 类目属性树形结构图 类目表 缓存 分布式缓存 分布式本地缓存 总结 概念定义 类目简单来说

  3. 基于Thinkphp使用同一个域名,PC和M端访问不同模板

    基于Thinkphp使用同一个域名,PC和M端访问不同模板 一、首先目录结构展示:(主要修改这几个文件) 二、更改入口文件 index.php require DIR . ‘./isMobile.php’; 三、在入口文件index.php同级目录下,增加common.php 文件,代码为: ?phpfunction isMobile

  4. 王者荣耀手风琴效果实现

    王者荣耀手风琴效果实现 0x00 网页地址 http://pvp.qq.com/strategy/ 0x01 代码 HTML div class=demo p class=title周免英雄(10月26号-11月1号)/p ul li class=active img src=img/113.jpg alt= width=69 height=69 class=small img src=img/113-freehover.pn

  5. elementUI <el-cascader> 实现省市区三级联动

    elementUI <el-cascader> 实现省市区三级联动 二三级城市数据下载地址 实现效果 具体代码 el-form-item label=省市区 prop=formAddress el-cascader v-model=form.formAddress placeholder=请选择 :options=addressOptions filterable / /el-form-item scri

  6. 【项目技术点总结之一】vue集成d3.js利用svg加载图片实现缩放拖

    【项目技术点总结之一】vue集成d3.js利用svg加载图片实现缩放拖拽功能 【项目技术点总结之一】vue集成d3.js利用svg加载图片实现缩放拖拽功能 前言 概述 技术介绍 实现过程 插件安装 引用组件 初始化组件 实现效果 简单理解 使用d3创建一个svg 在svg中提添加元

  7. 基于arcgis的遥感影像标签制作(目标检测)

    基于arcgis的遥感影像标签制作(目标检测) 文章目录 1. 在arcgis中新建线矢量 2. 检测框绘制 3. 检测框坐标转换(线矢量) 4. 检测框坐标转换(面矢量) 1. 在arcgis中新建线矢量 新建线矢量,添加空间参考,例如wgs_1984。 2. 检测框绘制 3. 检测框坐标转换

  8. 利用Python如何实现数据驱动的接口自动化测试

    利用Python如何实现数据驱动的接口自动化测试 前言 大家在接口测试的过程中,很多时候会用到对CSV的读取操作,本文主要说明Python3对CSV的写入和读