Java使用Semaphore對單接口進行限流
一、實戰(zhàn)說明
1.1 效果說明
本篇主要講如何使用Semaphore對單接口進行限流,例如有如下場景
a. A系統(tǒng)的有a接口主要給B系統(tǒng)調(diào)用,現(xiàn)在希望對B系統(tǒng)進行限流,例如處理峰值在100,超過100的請求快速失敗
b. 接口作為總閘入口,希望限制所有外來訪問,例如某個房間只能同時100個玩家在線,只有前面的處理完后面的才能繼續(xù)請求
c. 其他類型場景,也就是資源固定的情況下需要輪流使用資源的可以采用Semaphore
不適用場景
a. 由于是針對總?cè)肟谶M行限流,所以不能根據(jù)IP或者token等進行限流,適用場景比較固定
b. 后續(xù)的博客中會介紹如何使用其他的針對IP/Token級別的限流,例如AOP+Redis+Lua進行限流
優(yōu)點主要有
a. 相比針對IP級別的限流,Semaphore實現(xiàn)相對簡單,對上述場景能快速實現(xiàn)限流效果
實現(xiàn)難度:3顆星
1.2 核心知識點
主要使用以下技術(shù)點
a. springboot
b. juc包中的Semaphore(tryAcquire、release方法)
Semaphore主要說明
a. Semaphore中可以通過tryAcquire和acquire獲取到一個許可證(默認),通過release釋放許可證
b. 兩個獲取許可證的主要區(qū)別就是前者是非阻塞而后者阻塞,如果我們要實現(xiàn)快速失敗的效果,就必須使用非阻塞獲取許可證方法
注意點
a. 一定要確保release方法被調(diào)用,例如放到finally中,否則許可證得不到釋放,將會導致接口被全部陷死,無法接收請求
二、環(huán)境搭建
環(huán)境使用idea+spring initializr創(chuàng)建
新建springboot web項目



包目錄說明

新建SemaphoreController,請求路徑為limit
a. 注意點已經(jīng)代碼注釋說明
package com.codecoord.semaphore.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.Semaphore;
/**
* 限流側(cè)測試
*
* @author tianxincode@163.com
* @since 2020-08-06
*/
@RestController
public class SemaphoreController {
/**
* 最大信號量,例如此處3,生成環(huán)境可以做成可配置項,通過注入方式進行注入
*/
private static final int MAX_SEMAPHORE = 3;
/**
* Semaphore主限流,全局就行
*/
private static final Semaphore SEMAPHORE = new Semaphore(MAX_SEMAPHORE);
@RequestMapping("/limit")
public String limit() {
// 01.使用非阻塞tryAcquire,如果獲取不到就快速返回失敗
if (!SEMAPHORE.tryAcquire()) {
return "請求頻率超過限制:" + MAX_SEMAPHORE;
}
// 02. 如果能進入到這里,說明一定獲取到了許可證
/// todo 可能的參數(shù)校驗,注意如果參數(shù)校驗不通過,一定要調(diào)用release方法
/*if (valid(xxx)) {
SEMAPHORE.release();
}*/
try {
// 03. 模擬業(yè)務(wù)處理,假如需要1s
Thread.sleep(1000);
return "業(yè)務(wù)處理成功";
} catch (InterruptedException e) {
// 錯誤處理
return "業(yè)務(wù)處理失敗";
} finally {
// 04. 一定要釋放,否則導致接口假死無法處理請求
SEMAPHORE.release();
}
}
}
三、限流演示
3.1 并發(fā)請求工具
并發(fā)請求將基于apache-jmeter-5.2.1進行測試,jmeter的使用相對簡單,請讀者自行百度
此處線程組的線程數(shù)量為10個,真實環(huán)境中根據(jù)需要調(diào)整配置大小

3.2 效果示例圖
啟動測試,可以看到處理成功的只有三個,剩下7個全部失敗
a. 請求成功

b. 請求失敗

到此這篇關(guān)于Java使用Semaphore對單接口進行限流的文章就介紹到這了,更多相關(guān)Java 單接口限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
舉例說明JAVA調(diào)用第三方接口的GET/POST/PUT請求方式
在日常工作和學習中,有很多地方都需要發(fā)送請求,這篇文章主要給大家介紹了關(guān)于JAVA調(diào)用第三方接口的GET/POST/PUT請求方式的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-01-01
工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解
這篇文章主要為大家介紹了工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實現(xiàn)
在Java編程中,經(jīng)常會遇到需要截取文件名的場景,本文主要介紹了JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-04-04
Spring中XmlWebApplicationContext的實現(xiàn)
XmlWebApplicationContext是Spring?Framework中的一個重要類,本文主要介紹了Spring中XmlWebApplicationContext,具有一定的參考價值,感興趣的可以了解一下2024-08-08

