Java两大工具库:Commons和Guava(4)

news2024/12/24 9:25:14

您好,我是湘王,这是我的CSDN博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!


在Nginx中提到过通过限流算法实现对后端服务的保护,避免因服务器承载压力太大而被冲垮。大家都知道Guava是用来操作集合的,但其实Guava也可以实现限流的功能。

不说废话,直接上代码。

先引入依赖:

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

然后用Guava实现限流:

/**
 * 用Guava漏桶实现限流
 *
 * @author 湘王
 */
@Service
public class LeakyBucketService {
    // Guava限制每秒请求数量(漏桶的流速)
    private static final RateLimiter rateLimiter = RateLimiter.create(1);
    // 请求编号
    private volatile int count = 1;

    public boolean limit(HttpServletRequest request) throws InterruptedException {
        System.out.print("请求编号 = " + count++ + " ");
        // 休眠一秒,取决于机器性能
        Thread.sleep(1000);
        if (rateLimiter.tryAcquire()) {
            System.out.println(">>>>>>>> 请求成功 >>>>>>>>");
            return true;
        }
        System.out.println(">>>>>>>> 被限流了 >>>>>>>>");
        return false;
    }
}

创建控制器类:

/**
 * 限流Controller
 *
 * @author 湘王
 */
@RestController
public class LimitBucketController {
    @Resource
    private LeakyBucketService leakyBucketService;

    @GetMapping("/limit")
    public String limit(HttpServletRequest request) throws InterruptedException {
        leakyBucketService.limit(request);
        return "SUCCESS";
    }
}

为了模拟大流量并发访问,需要借助apache jmeter测试工具。在apache.org下载jmeter(需要JDK8以上版本),解压至指定目录后执行下面的命令:

cd $/apache-jmeter-5.3/bin

./jmeter

如果是Windows可以在$/apache-jmeter-5.3/bin目录中直接双击jmeter图标启动。

「Test Plan」上点击鼠标右键,依次选择「Add」->「Thread」->「Thread Group」

「Thread Group」上点击鼠标右键,依次选择「Add」->「Sampler」->「HTTP Request」

「HTTP Request」界面中填入如下信息,和之前的Controller对应:

回到「Test Group」界面,填入如下信息:

启动Springboot,点击「Start」按钮,运行测试:

从测试结果可以看到,漏桶限流发挥了作用:

漏桶是为了平滑访问流量,但是如果需要允许一些突发流量呢?Guava并没有实现,但可以通过令牌桶的思路来自己搞。和漏桶相比,令牌桶其实有几个关键的不同:

1、需要一个桶来装令牌;

2、请求数量会出现突发;

3、每次消费令牌的数量固定;

先创建令牌桶服务:

/**
 * 令牌桶限流
 *
 * @author 湘王
 */
@Service
public class TokenBucketService extends HandlerInterceptorAdapter {
    // 桶的容量,可用令牌总量
    private final int total = 10;
    // 消费速率
    private final int rate = 3;

    public boolean limit(HttpServletRequest request) throws InterruptedException {
        // 休眠一秒,取决于机器性能
        Thread.sleep(1000);
        if (tryAcquire()) {
            return true;
        }
        return false;
    }

    // 以固定速率消费请求,漏桶容量固定,每次用户请求都得放入桶中,桶满则拒绝请求或等待
    private synchronized boolean tryAcquire() {
        // 网络请求数量是随机的
        int requests = (int) (Math.random() * 10) + 1;
        System.out.print("消费速率 = " + rate + ",请求数量 = " + requests + "; ");
        if (total < requests + rate) {
            // 桶满则拒绝
            System.out.println("剩余容量 = " + (total - (requests + rate)) + "; >>>>>>>> 被限流了 >>>>>>>>");
            return false;
        } else {
            // 桶还未满
            System.out.println("剩余容量 = " + (total - (requests + rate)) + "; >>>>>>>> 请求成功 >>>>>>>>");
            return true;
        }
    }
}

然后修改之前的Controller:

/**
 * 桶限流Controller
 *
 * @author 湘王
 */
@RestController
public class LimitBucketController {
    @Resource
    private LeakyBucketService leakyBucketService;

    @Resource
    private TokenBucketService tokenBucketService;

    @GetMapping("/limit")
    public String limit(HttpServletRequest request) throws InterruptedException {
        //leakyBucketService.limit(request);
        tokenBucketService.limit(request);
        return "SUCCESS";
    }
}
 

修改Jmeter并发线程的数量:

测试结果如当初所愿:


节日期间,您仍然可以随时咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~再次祝您兔年吉祥,万事胜意!

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

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

相关文章

说一下Vue组件中的自定义事件和全局事件总线

一&#xff0c;自定义事件 1.自定义事件是什么 自定义事件一种组件间通信的方式&#xff0c;适用于 子组件 ——> 父组件传输数据等 2.要在什么地方使用 若App是父组件&#xff0c;School是子组件&#xff0c;School想给App传数据&#xff0c;那么就要在App中给School绑…

MySQL表中的聚合查询

聚合查询在MySQL初阶中进行的查询都是对于同一条记录的列与列之间进行的运算,那如何对多条记录的不同行进行运算呢(比如计算所有同学某一单科的总分,某一单科的平均分)?此时就需要聚合查询来操作了!1.聚合函数函数 说明COUNT([DISTINCT] expr)返回查询到的数据的数量SUM([DIST…

pod访问不通问题--kube-proxy未正常创建

用户问题Pod创建后访问对象存储OSS不通。初步排查初步排查&#xff0c;网络连通性是OK的。再次反馈创建Pod后2分钟内可能存在业务不通。业务架构该集群采用了节点自动弹缩功能&#xff0c;节点弹缩范围在13-28之间。用户周期性创建大批量Pod&#xff0c;共300个&#xff0c;与对…

46_API接口漏洞

API接口漏洞 一、概念 api > application interface 应用接口 向特定的接口发送一个请求包 返回一个类似于json格式的字符串 二、REST型web service 可以从网上去搜索下api接口去理解,下面有个我找到的网址,给出api接口的分类 https://blog.csdn.net/t79036912/article…

Linux(Ubuntu)通过NFS服务挂载群晖NAS为虚拟磁盘

1. 设置NAS&#xff0c;共享目录 1. 文件服务 设置 首先进入NAS服务&#xff0c;打开 [控制面板] &#xff0c;在控制面版包含** 文件服务 ** 功能如图所示。 2.选中要共享的文件夹后&#xff0c;点击操作栏的 【编辑】 按钮&#xff0c;如图&#xff1a; 3.进入编辑面板后&a…

盘点三个超好用的截图软件

一款好用的截图软件往往能给人们带来更高的工作效率&#xff0c;目前市面上的截图软件已经很多&#xff0c;今天就给大家盘点一些好用的截图软件。 QQ截图 QQ截图软件是QQ内置自带的一款截图&#xff0c;快捷键ctrlA 可以唤起&#xff0c;其功能也是应有尽有包括屏幕录制&#…

【JavaScript】数据劫持(代理)详解

&#x1f4bb; 【JavaScript】数据劫持(代理)详解 &#x1f3e0;专栏&#xff1a;JavaScript &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前主攻…

3万行代码硬撸一个一键发布文章工具,简直不要太好用,从此写文章,发文章,太简单了好伐

theme: channing-cyan highlight: github-gist 本人6年前端开发老鸟- 【程序员蜗牛】&#xff0c;欢迎沟通交流 操作演示&#xff08;视频&#xff09; 视频演示 项目背景 程序员工作中&#xff0c;不免会遇到一些技术难题&#xff0c;然后通过不懈努力将问题攻克&#xf…

1x1卷积、Inception网络、

目录1.1x1卷积(1x1 convolution)又称网络中的网络(network in network)池化层只能压缩图像的宽和高&#xff0c;1x1卷积能压缩通道数量&#xff0c;减少计算成本。如上图&#xff0c;输入维度的通道数为192&#xff0c;用32个1x1x192的filters&#xff0c;就能将输出的通道数压…

【Rust】20. Rust 的高级特征

20.1 不安全 Rust 20.1.1 不安全的超能力 20.1.2 解引用裸指针 裸指针&#xff08;raw pointers&#xff09;&#xff1a;类似于引用类型&#xff1b;和引用一样&#xff0c;裸指针是不可变或可变的&#xff0c;分别写作 *const T 和 *mut T&#xff0c;这里的星号不是解引用运…

Kubernetes集群部署与实践

一、提要 部署Kubernetes集群至少需要3台服务器&#xff0c;其中至少要有1个服务器做master节点&#xff0c;至少要有1个服务器做node节点&#xff0c;且节点名称是唯一的。 当集群中只有一个master节点时&#xff0c;如果其出现了故障&#xff0c;会导致Kubernetes的控制平面…

规则引擎-drools-5-决策表

文章目录Excel格式决策表 官网地址决策表使用方式Excel组成部分与drl规则文件对应关系Excel文件内容示例drl规则文件内容Excel决策表内容说明1. RuleSet2. RuleTable3. Attributes示例Excel转化drl代码及结果执行drl代码及结果Excel格式决策表 官网地址 决策表这部分内容在官网…

几种IO模型

IO真正的IO操作涉及到和IO设备的交互&#xff0c;而操作系统限制了应用程序直接和设备交互。我们通常说的IO操作实际上是应用程序和操作系统进行交互&#xff0c;一般会使用操作系统的System Call&#xff0c;即系统调用&#xff0c;读是read()&#xff0c;写是write()&#xf…

设计模式-结构型模式

目录 5.结构型模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 JDK动态代理 5.1.5 CGLIB动态代理 5.1.6 三种代理的对比 5.1.7 优缺点 5.1.8 使用场景 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 应…

聊聊关于矩阵反向传播的梯度计算

目录 1. 前向传播 2. 反向传播 3. 矩阵反向传播 4. 总结 1. 前向传播 建立如图所示的简单网络 W 是权重矩阵&#xff0c;初始赋值为 2*2 的矩阵 X 是输入特征&#xff0c;初始赋值为 2*1 的矩阵 这样通过矩阵乘法 &#xff0c; Y WX &#xff0c;应该得到一个 2*1 的输…

在这竞争激烈的时代,如何才能够在激烈竞争中脱颖而出呢

不管是在职场想要获得认可得到晋升&#xff0c;还是与客户谈合作&#xff1b;都需要你能够脱颖而出。让他人能够看到你并且认可你。那如何才能脱颖而出呢&#xff1f;首先你要先认识自己&#xff0c;知道自己有什么优势、劣势、技能、兴趣、爱好等等。明确自己有什么价值&#…

软件工程(1)--初识基础概念

前言 学习了半年的软件工程课程&#xff0c;总不能一无所获吧&#xff0c;故此写下文章总结一番。 软件工程是一门综合性交叉学科&#xff0c;它涉及计算机科学、工程科学、管理科学和数学等领域。学习目标是掌握需求分析、软件设计、编码风格、软件测试的工程化方法。 软件程序…

什么是股票量化研究?

谈到股票量化研究领域&#xff0c;肯定少不了有自动交易系统的支撑&#xff0c;像平时能将股票池中的数据挖掘出来也能熟能生巧的进行自助量化研究&#xff0c;包括数据接口系统的开发使用都是受到量化的影响&#xff0c;那么&#xff0c;如何看待股票量化研究&#xff1f;像平…

arm版(以uos为例)linux安装mysql8

官网下载&#xff1a;https://downloads.mysql.com/archives/community/上传到服务器&#xff0c;然后解压缩tar -zxvf mysql-8.0.31-linux-glibc2.17-aarch64.tar.gzmv mysql-8.0.31-linux-glibc2.17-aarch64 /usr/local/mysql-8创建MySQL数据目录mkdir -p /datacd datamkdir …

打通对账的最后一公里——对账管理平台

背景 日新月异的科技与快速变化的消费需求不断驱动零售模式的变革&#xff0c;实体商业与数字经济、传统零售与新零售&#xff0c;逐渐融合并形成了全渠道、一体化的发展趋势&#xff0c;也改变了以往企业认知中线上、线下渠道割裂的思维定式&#xff0c;零售快消类企业纷纷建…