Java 实现限流器处理Rest接口请求详解流程


Posted in Java/Android onNovember 02, 2021

Maven依赖

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.0.1-jre</version>
        </dependency>

代码

上代码,不废话。

首先是限流器代码。

package com.huyi.csdn.tools.rate;
 
import com.google.common.util.concurrent.Monitor;
import com.google.common.util.concurrent.RateLimiter;
 
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.function.Consumer;
 
/**
 * @Program: csdn @ClassName: RequestRateLimiter @Author: huyi @Date: 2021-10-30 22:16 @Description:
 * 请求限流器 @Version: V1.0
 */
public class RequestRateLimiter {
  // 请求队列
  private final ConcurrentLinkedQueue<Request> bucket = new ConcurrentLinkedQueue<>();
  // 队列上限
  private static final int BUCKET_CAPACITY = 100;
  // 漏桶下沿水流速度
  private final RateLimiter rateLimiter = RateLimiter.create(10.0D);
  // 请求监视器
  private final Monitor requestMoniter = new Monitor();
  // 处理监视器
  private final Monitor handleMoniter = new Monitor();
 
  /** 请求实体 */
  public static class Request {
    private int data;
 
    public Request(int data) {
      this.data = data;
    }
 
    @Override
    public String toString() {
      return "Request{" + "data=" + data + '}';
    }
  }
 
  public void submitRequest(int data) {
    this.submitRequest(new Request(data));
  }
 
  public void submitRequest(Request request) {
    // 请求监视器,创建监视向导,队列数据量小于上限
    if (requestMoniter.enterIf(requestMoniter.newGuard(() -> bucket.size() < BUCKET_CAPACITY))) {
      try {
        boolean result = bucket.offer(request);
        if (result) {
          System.out.println("成功向队列加入新的请求!" + Thread.currentThread() + " request:" + request);
        } else {
          System.out.println("加入新请求失败!");
        }
      } finally {
        requestMoniter.leave();
      }
    } else {
      // 队列已满
      // System.out.println("请求队列已经上限,请稍后重试!");
    }
  }
 
  // 处理请求方法
  public void handleRequest(Consumer<Request> consumer) {
    if (handleMoniter.enterIf(handleMoniter.newGuard(() -> !bucket.isEmpty()))) {
      try {
        // 匀速处理
        rateLimiter.acquire();
        consumer.accept(bucket.poll());
      } finally {
        handleMoniter.leave();
      }
    }
  }
}

代码说明

1、有个长度100的任务队列,增加了监视器。

2、添加了限流器,限流为10。

验证代码

package com.huyi.csdn.tools.rate;
 
import java.time.LocalTime;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;
 
/**
 * @Program: csdn @ClassName: TestRateLimiter @Author: huyi @Date: 2021-10-30
 * 22:35 @Description: @Version: V1.0
 */
public class TestRateLimiter {
  private static final AtomicInteger DATA = new AtomicInteger(0);
  private static final RequestRateLimiter HANDLE = new RequestRateLimiter();
 
  public static void main(String[] args) {
    IntStream.range(0, 10)
        .forEach(
            (x) ->
                new Thread(
                        () -> {
                          while (true) {
                            HANDLE.submitRequest(DATA.getAndIncrement());
                            try {
                              TimeUnit.MILLISECONDS.sleep(100);
                            } catch (InterruptedException e) {
                              e.printStackTrace();
                            }
                          }
                        })
                    .start());
 
    IntStream.range(0, 20)
        .forEach(
            (x) ->
                new Thread(
                        () -> {
                          while (true) {
                            HANDLE.handleRequest(
                                y ->
                                    System.out.println(
                                        LocalTime.now() + ":处理数据 -> " + y.toString()));
                          }
                        })
                    .start());
  }
}

验证执行结果

Java 实现限流器处理Rest接口请求详解流程

总结

胸中一点浩然气,天地千里快哉风。

如果本文对你有用的,请不要吝啬你的赞,谢谢支持。

 

到此这篇关于Java 实现限流器处理Rest接口请求详解流程的文章就介绍到这了,更多相关Java Rest接口请求内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
Java实现斗地主之洗牌发牌
Jun 14 Java/Android
idea搭建可运行Servlet的Web项目
Jun 26 Java/Android
Spring Boot 启动、停止、重启、状态脚本
Jun 26 Java/Android
Java SSH 秘钥连接mysql数据库的方法
Jun 28 Java/Android
分析并发编程之LongAdder原理
Jun 29 Java/Android
springboot 启动如何排除某些bean的注入
Aug 02 Java/Android
Java中的随机数Random
Mar 17 Java/Android
Java的Object类的九种方法
Apr 13 Java/Android
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
Jun 01 Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 Java/Android
Java获取字符串编码格式实现思路
Sep 23 Java/Android
Mybatis 一级缓存和二级缓存原理区别
Sep 23 Java/Android
Java8中接口的新特性使用指南
Nov 01 #Java/Android
Spring中的使用@Async异步调用方法
Nov 01 #Java/Android
MyBatis自定义SQL拦截器示例详解
Oct 24 #Java/Android
java多态注意项小结
Spring Security中用JWT退出登录时遇到的坑
Java实现房屋出租系统详解
Oct 05 #Java/Android
Java Spring 控制反转(IOC)容器详解
You might like
谈谈PHP的输入输出流
2007/02/14 PHP
php中对2个数组相加的函数
2011/06/24 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
js计数器代码
2006/11/04 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
Jquery $.map使用方法实例详解
2020/09/01 jQuery
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
详解python程序中的多任务
2020/09/16 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
会计与审计专业大专生求职信
2013/10/03 职场文书
《口技》教学反思
2014/02/21 职场文书
租房协议书范本
2014/04/09 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
小学师德师风演讲稿
2014/09/02 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
农业项目合作意向书
2015/05/08 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
七年级话题作文之执着
2019/11/19 职场文书
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL