首页 > 编程语言 >Java使用Semaphore对单接口进行限流

Java使用Semaphore对单接口进行限流

时间:2023-01-23 09:44:07浏览次数:45  
标签:Java 请求 Semaphore 接口 限流 SEMAPHORE release

java使用Semaphore对单接口进行限流

目录一、实战说明1.1 效果说明1.2 核心知识点二、?环境搭建三、限流演示3.1 并发请求工具3.2 效果示例图

一、实战说明

1.1 效果说明

本篇主要讲如何使用Semaphore对单接口进行限流,例如有如下场景

a. A系统的有a接口主要给B系统调用,现在希望对B系统进行限流,例如处理峰值在100,超过100的请求快速失败

b. 接口作为总闸入口,希望限制所有外来访问,例如某个房间只能同时100个玩家在线,只有前面的处理完后面的才能继续请求

c. 其他类型场景,也就是资源固定的情况下需要轮流使用资源的可以采用Semaphore

不适用场景

a. 由于是针对总入口进行限流,所以不能根据IP或者token等进行限流,适用场景比较固定

b. 后续的博客中会介绍如何使用其他的针对IP/Token级别的限流,例如AOP+Redis+Lua进行限流

优点主要有

a. 相比针对IP级别的限流,Semaphore实现相对简单,对上述场景能快速实现限流效果

实现难度:3颗星

1.2 核心知识点

主要使用以下技术点

a. springboot

b. juc包中的Semaphore(tryAcquire、release方法)

Semaphore主要说明

a. Semaphore中可以通过和acquire获取到一个许可证(默认),通过release释放许可证

b. 两个获取许可证的主要区别就是前者是非阻塞而后者阻塞,如果我们要实现快速失败的效果,就必须使用非阻塞获取许可证方法

注意点

a. 一定要确保release方法被调用,例如放到finally中,否则许可证得不到释放,将会导致接口被全部陷死,无法接收请求

二、?环境搭建

环境使用idea+spring initializr创建

新建springboot web项目

包目录说明

新建SemaphoreController,请求路径为limit

a. 注意点已经代码注释说明

package com.codecoord.semaphore.controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.Semaphore;

@RestConywEGmttroller

public class SemaphoreController {

private static final int MAX_SEMAPHORE=3;



private static final Semaphore SEMAPHORE=new Semaphore(MAX_SEMAPHORE);

@RequestMapping("/limit")

public String limit() {

    // 01.使用非阻塞tryAcquire,如果获取不到就快速返回失败

    if (!SEMAPHORE.tryAcquire()) {

        return "请求频率超过限制:" + MAX_SEMAPHORE;

    }

    // 02. 如果能进入到这里,说明一定获取到了许可证

    /// todo 可能的参数校验,注意如果参数校验不通过,一定要调用release方法

    

    try {

        // 03. 模拟业务处理,假如需要1s

        Thread.sleep(1000);

        return "业务处理成功";

    } catch (InterruptedException e) {

        // 错误处理

        return "业务处理失败";

    } finally {

        // 04. 一定要释放,否则导致接口假死无法处理请求

        SEMAPHORE.release();

    }

}

}

三、限流演示

3.1 并发请求工具

并发请求将基于apache-jmeter-5.2.1进行测试,jmeter的使用相对简单,请读者自行百度

此处线程组的线程数量为10个,真实环境中根据需要调整配置大小

3.2 效果示例图

启动测试,可以看到处理成功的只有三个,剩下7个全部失败

a. 请求成功

b. 请求失败

标签:Java,请求,Semaphore,接口,限流,SEMAPHORE,release
From: https://www.cnblogs.com/dituirenwu/p/17065007.html

相关文章

  • JavaScript学习笔记—数组去重实例
    编写代码去除数组中重复的元素constarr=[1,2,1,3,2,2,4,5,5,6,7];//分别获取数组中的元素for(leti=0;i<arr.length;i++){//获取当前值后边的所有值f......
  • javaweb基础知识梳理
    1、javaweb模型 java的代码是在内存里的,比如Array、LIst、Map这就意味着在这些容器中存储的数据都是临时的,重启java程序之后数据进入新的生命周期。这种程序也有,比如计......
  • 动力节点javaSE笔记
    目录调用方法:类名.方法名(其中在一个类中调用,类名可以省略)方法重载条件:面向对象三大特征:类--->[实例化]--->对象(实例)对象--->[抽象]--->类方法体内的变量是局部变......
  • JavaScript学习笔记—复制
    9.复制(1)浅拷贝(shallowcopy)通常对对象的拷贝都是浅拷贝只对对象的浅层进行复制(只复制一层)如果对象中存储的数据是原始值,那么拷贝的深浅是不重要浅拷贝只会对对象本......
  • JavaScript 跨域问题
    一、什么是跨域跨域(Cross-originresourcesharing,CORS)是指在浏览器中,同源策略限制了来自不同域的脚本对每个网络资源的访问权限。同源策略限制了一个网页脚本只能......
  • JavaScript学习笔记—数组的方法
    1.非破坏性方法(1)Array.isArray():用来检查一个对象是否是数组console.log(Array.isArray([1,2,3,4]));//trueconsole.log(Array.isArray({name:"孙悟空"}));//fals......
  • Java反序列化-CommonsCollections2利用链分析
    前言接上篇TemplatesImpl利用链分析,学习了通过TemplatesImpl利用链来进行类加载执行恶意代码,现在来学习一下CommonsCollections2利用链。分析前的准备漏洞组件:commons-c......
  • (七)Java IO流
    JavaIO流1、IO流分类1)按数据流向:输入流和输出流2)按处理单位:字节流和字符流3)按功能分类:节点流和处理流2、常用的流1)对文件进行操作:FileInputStream(字节输入流)、FileO......
  • 【java面试题】lock和synchronized有什么区别?
    学习目标:掌握lock与synchronized的区别理解ReentrantLock的公平、非公平锁理解ReentrantLock中的条件变量lock与synchronized的区别有三个层面学习内容:1.......
  • Java开发案例:使用JDBC技术来实现QQ登录
    在实际开发中,用户信息是存放在数据库中的,登录时的账号和密码信息也需要去数据库中查询,本节将使用JDBC技术来完善QQ登录案例。1.创建数据表,并添加用户数据在jdbc数据库中创建......