溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java怎么使用Semaphore對單接口進行限流

發(fā)布時間:2021-07-21 16:27:14 來源:億速云 閱讀:142 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Java怎么使用Semaphore對單接口進行限流”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java怎么使用Semaphore對單接口進行限流”吧!

目錄
  • 一、實戰(zhàn)說明

    • 1.1 效果說明

    • 1.2 核心知識點

  • 二、 環(huán)境搭建

    • 三、限流演示

      • 3.1 并發(fā)請求工具

      • 3.2 效果示例圖

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

    二、 環(huán)境搭建

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

    Java怎么使用Semaphore對單接口進行限流

    Java怎么使用Semaphore對單接口進行限流

    Java怎么使用Semaphore對單接口進行限流

    包目錄說明

    Java怎么使用Semaphore對單接口進行限流

    新建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. 一定要釋放,否則導(dǎo)致接口假死無法處理請求
                SEMAPHORE.release();
            }
        }
    }

    三、限流演示

    3.1 并發(fā)請求工具

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

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

    Java怎么使用Semaphore對單接口進行限流

    Java怎么使用Semaphore對單接口進行限流 

    3.2 效果示例圖

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

    Java怎么使用Semaphore對單接口進行限流

    b. 請求失敗

    Java怎么使用Semaphore對單接口進行限流

    感謝各位的閱讀,以上就是“Java怎么使用Semaphore對單接口進行限流”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java怎么使用Semaphore對單接口進行限流這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI