最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年07月21日 15:39:54   作者:TianXinCoord  
本篇主要講如何使用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è)務處理,假如需要1s
            Thread.sleep(1000);
            return "業(yè)務處理成功";
        } catch (InterruptedException e) {
            // 錯誤處理
            return "業(yè)務處理失敗";
        } 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)文章

  • SpringMVC中的異常處理機制詳解

    SpringMVC中的異常處理機制詳解

    SpringMVC提供了基于xml和基于注解的異常處理機制,一般情況下兩者都要進行配置,xml異常處理機制主要用于處理xml方式產(chǎn)生的異常,注解異常處理機制主要用于處理基于注解方式產(chǎn)生的異常,這篇文章主要介紹了SpringMVC中的異常處理機制,需要的朋友可以參考下
    2024-05-05
  • 分享一些Java的常用工具

    分享一些Java的常用工具

    今天給大家?guī)淼氖顷P(guān)于Java的一些常用的工具,文中有非常詳細的介紹,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 解決JAVA遍歷List集合,刪除數(shù)據(jù)時出現(xiàn)的問題

    解決JAVA遍歷List集合,刪除數(shù)據(jù)時出現(xiàn)的問題

    這篇文章主要介紹了解決JAVA遍歷List集合時,刪除數(shù)據(jù)出現(xiàn)的問題,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • windows上nacos自啟動的三種方法小結(jié)

    windows上nacos自啟動的三種方法小結(jié)

    本文主要給大家介紹了windows上nacos自啟動的三種方法,借助WinSW.exe添加到服務列表,修改nacos啟動配置以及以開機"啟動"方式——啟動Nacos的startup.cmd這三種方法,文中通過圖文講解的非常詳細,需要的朋友可以參考下
    2023-12-12
  • SpringMVC處理數(shù)據(jù)輸出的實例代碼

    SpringMVC處理數(shù)據(jù)輸出的實例代碼

    這篇文章主要給大家介紹了關(guān)于SpringMVC處理數(shù)據(jù)輸出的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • SpringBoot接口參數(shù)的默認值與必要性最佳實踐記錄

    SpringBoot接口參數(shù)的默認值與必要性最佳實踐記錄

    這篇文章主要介紹了SpringBoot接口參數(shù)的默認值與必要性,通過合理設置接口參數(shù)的默認值和必要性,我們可以創(chuàng)建出既健壯又靈活的?RESTful?API,需要的朋友可以參考下
    2024-08-08
  • 最新評論

    嘉善县| 松阳县| 重庆市| 景泰县| 鄱阳县| 青铜峡市| 红原县| 眉山市| 和平区| 叶城县| 乐亭县| 清镇市| 犍为县| 永顺县| 枞阳县| 兴义市| 六安市| 屯门区| 安徽省| 广饶县| 子洲县| 衡东县| 深水埗区| 温州市| 青河县| 泌阳县| 左贡县| 高平市| 稻城县| 穆棱市| 余姚市| 武强县| 睢宁县| 达尔| 山西省| 新巴尔虎左旗| 巨野县| 闽侯县| 社旗县| 明水县| 葫芦岛市|