亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Java使用Semaphore對單接口進(jìn)行限流

瀏覽:22日期:2022-08-08 18:07:40
目錄一、實(shí)戰(zhàn)說明1.1 效果說明1.2 核心知識點(diǎn)二、 環(huán)境搭建三、限流演示3.1 并發(fā)請求工具3.2 效果示例圖一、實(shí)戰(zhàn)說明1.1 效果說明

本篇主要講如何使用Semaphore對單接口進(jìn)行限流,例如有如下場景a. A系統(tǒng)的有a接口主要給B系統(tǒng)調(diào)用,現(xiàn)在希望對B系統(tǒng)進(jìn)行限流,例如處理峰值在100,超過100的請求快速失敗b. 接口作為總閘入口,希望限制所有外來訪問,例如某個(gè)房間只能同時(shí)100個(gè)玩家在線,只有前面的處理完后面的才能繼續(xù)請求c. 其他類型場景,也就是資源固定的情況下需要輪流使用資源的可以采用Semaphore

不適用場景a. 由于是針對總?cè)肟谶M(jìn)行限流,所以不能根據(jù)IP或者token等進(jìn)行限流,適用場景比較固定b. 后續(xù)的博客中會介紹如何使用其他的針對IP/Token級別的限流,例如AOP+Redis+Lua進(jìn)行限流

優(yōu)點(diǎn)主要有a. 相比針對IP級別的限流,Semaphore實(shí)現(xiàn)相對簡單,對上述場景能快速實(shí)現(xiàn)限流效果

實(shí)現(xiàn)難度:3顆星

1.2 核心知識點(diǎn)

主要使用以下技術(shù)點(diǎn)a. springbootb. juc包中的Semaphore(tryAcquire、release方法)

Semaphore主要說明a. Semaphore中可以通過tryAcquire和acquire獲取到一個(gè)許可證(默認(rèn)),通過release釋放許可證b. 兩個(gè)獲取許可證的主要區(qū)別就是前者是非阻塞而后者阻塞,如果我們要實(shí)現(xiàn)快速失敗的效果,就必須使用非阻塞獲取許可證方法注意點(diǎn)a. 一定要確保release方法被調(diào)用,例如放到finally中,否則許可證得不到釋放,將會導(dǎo)致接口被全部陷死,無法接收請求

二、 環(huán)境搭建

環(huán)境使用idea+spring initializr創(chuàng)建新建springboot web項(xiàng)目

Java使用Semaphore對單接口進(jìn)行限流

Java使用Semaphore對單接口進(jìn)行限流

Java使用Semaphore對單接口進(jìn)行限流

包目錄說明

Java使用Semaphore對單接口進(jìn)行限流

新建SemaphoreController,請求路徑為limita. 注意點(diǎn)已經(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 */@RestControllerpublic class SemaphoreController { /** * 最大信號量,例如此處3,生成環(huán)境可以做成可配置項(xiàng),通過注入方式進(jì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. 如果能進(jìn)入到這里,說明一定獲取到了許可證/// todo 可能的參數(shù)校驗(yàn),注意如果參數(shù)校驗(yàn)不通過,一定要調(diào)用release方法/*if (valid(xxx)) { SEMAPHORE.release();}*/try { // 03. 模擬業(yè)務(wù)處理,假如需要1s Thread.sleep(1000); return '業(yè)務(wù)處理成功';} catch (InterruptedException e) { // 錯(cuò)誤處理 return '業(yè)務(wù)處理失敗';} finally { // 04. 一定要釋放,否則導(dǎo)致接口假死無法處理請求 SEMAPHORE.release();} }}三、限流演示3.1 并發(fā)請求工具

并發(fā)請求將基于apache-jmeter-5.2.1進(jìn)行測試,jmeter的使用相對簡單,請讀者自行百度

此處線程組的線程數(shù)量為10個(gè),真實(shí)環(huán)境中根據(jù)需要調(diào)整配置大小

Java使用Semaphore對單接口進(jìn)行限流

Java使用Semaphore對單接口進(jìn)行限流

3.2 效果示例圖

啟動測試,可以看到處理成功的只有三個(gè),剩下7個(gè)全部失敗a. 請求成功

Java使用Semaphore對單接口進(jìn)行限流

b. 請求失敗

Java使用Semaphore對單接口進(jìn)行限流

到此這篇關(guān)于Java使用Semaphore對單接口進(jìn)行限流的文章就介紹到這了,更多相關(guān)Java 單接口限流內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 在线成年人网站 | 娇喘呻吟福利视频在线观看 | 狠狠色噜噜狠狠狠狠97不卡 | 伊人久久中文字幕久久cm | 黄色小视频免费网站 | 农村黄a三级三级三级 | 欧美一区二区三区东南亚 | 一本到不卡 | 亚洲欧美偷拍视频 | 亚洲香蕉综合在人在线时看 | 综合欧美日韩一区二区三区 | 久久国产乱子伦精品岳两 | 久久综合久久综合久久综合 | 亚洲免费在线 | 黄色一级大片视频 | 麻豆视频官网 | a集毛片 | 日韩高清在线免费观看 | 欧美一级特黄特色大片 | 激情五月婷婷 | 国产人在线成免费视频麻豆 | 中国黄色一级 | 欧美高清一区二区三区欧美 | 国内精品视频区在线2021 | 久久精品国产精品亚洲精品 | 动漫精品专区一区二区三区不卡 | 欧美一欧美一区二三区性 | 国产亚洲一区二区手机在线观看 | 欧美成人免费观看 | 一个色综合网 | 日本在观线免费观看 | 91久久九九精品国产综合 | 视频1区| 亚洲一区有码 | 污污网站免费 | 色视频在线观看视频 | 手机看片福利永久 | 欧洲男女下面进出的视频 | 国产第一页在线视频 | 国产黄a三级三级三级 | 成人免费视频在线播放 |