您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java怎么使用Semaphore對單接口進行限流”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java怎么使用Semaphore對單接口進行限流”吧!
一、實戰說明
1.1 效果說明
1.2 核心知識點
二、 環境搭建
三、限流演示
3.1 并發請求工具
3.2 效果示例圖
本篇主要講如何使用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顆星
主要使用以下技術點
a. springboot
b. juc包中的Semaphore(tryAcquire、release方法)
Semaphore主要說明
a. Semaphore中可以通過tryAcquire和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; /** * 限流側測試 * * @author tianxincode@163.com * @since 2020-08-06 */ @RestController public class SemaphoreController { /** * 最大信號量,例如此處3,生成環境可以做成可配置項,通過注入方式進行注入 */ 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 可能的參數校驗,注意如果參數校驗不通過,一定要調用release方法 /*if (valid(xxx)) { SEMAPHORE.release(); }*/ try { // 03. 模擬業務處理,假如需要1s Thread.sleep(1000); return "業務處理成功"; } catch (InterruptedException e) { // 錯誤處理 return "業務處理失敗"; } finally { // 04. 一定要釋放,否則導致接口假死無法處理請求 SEMAPHORE.release(); } } }
并發請求將基于apache-jmeter-5.2.1進行測試,jmeter的使用相對簡單,請讀者自行百度
此處線程組的線程數量為10個,真實環境中根據需要調整配置大小
啟動測試,可以看到處理成功的只有三個,剩下7個全部失敗
a. 請求成功
b. 請求失敗
感謝各位的閱讀,以上就是“Java怎么使用Semaphore對單接口進行限流”的內容了,經過本文的學習后,相信大家對Java怎么使用Semaphore對單接口進行限流這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。