欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年07月21日 15:39:54   作者:TianXinCoord  
本篇主要講如何使用Semaphore對(duì)單接口進(jìn)行限流,主要有三種方式,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、實(shí)戰(zhàn)說明

1.1 效果說明

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

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

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

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

1.2 核心知識(shí)點(diǎn)

主要使用以下技術(shù)點(diǎn)
a. springboot
b. 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中,否則許可證得不到釋放,將會(huì)導(dǎo)致接口被全部陷死,無法接收請(qǐng)求

二、環(huán)境搭建

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

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

包目錄說明

在這里插入圖片描述

新建SemaphoreController,請(qǐng)求路徑為limit
a. 注意點(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è)測(cè)試
 *
 * @author tianxincode@163.com
 * @since 2020-08-06
 */
@RestController
public class SemaphoreController {
    /**
     * 最大信號(hào)量,例如此處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 "請(qǐng)求頻率超過限制:" + 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)致接口假死無法處理請(qǐng)求
            SEMAPHORE.release();
        }
    }
}

三、限流演示

3.1 并發(fā)請(qǐng)求工具

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

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

在這里插入圖片描述

在這里插入圖片描述 

3.2 效果示例圖

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

在這里插入圖片描述

b. 請(qǐng)求失敗

在這里插入圖片描述

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

相關(guān)文章

  • 詳解Java9新特性中的模塊化與反射機(jī)制

    詳解Java9新特性中的模塊化與反射機(jī)制

    Java9中的一個(gè)重大變化就是引入了模塊化系統(tǒng),這個(gè)系統(tǒng)使得Java應(yīng)用程序的構(gòu)建、發(fā)布和部署更加具有可控性和可重用性,與此同時(shí),Java9還改進(jìn)了反射機(jī)制,讓它與模塊化系統(tǒng)更好地配合,本文通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 舉例說明JAVA調(diào)用第三方接口的GET/POST/PUT請(qǐng)求方式

    舉例說明JAVA調(diào)用第三方接口的GET/POST/PUT請(qǐng)求方式

    在日常工作和學(xué)習(xí)中,有很多地方都需要發(fā)送請(qǐng)求,這篇文章主要給大家介紹了關(guān)于JAVA調(diào)用第三方接口的GET/POST/PUT請(qǐng)求方式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解

    工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解

    這篇文章主要為大家介紹了工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • JDK8?中Arrays.sort()?排序方法詳解

    JDK8?中Arrays.sort()?排序方法詳解

    這篇文章主要介紹了JDK8?中Arrays.sort()?排序方法解讀,本文先行介紹Arrays.sort()中影響排序方式的幾個(gè)因素,影響因素主要為數(shù)組類型、數(shù)組大小,結(jié)合閾值對(duì)排序方式進(jìn)行選擇,需要的朋友可以參考下
    2023-05-05
  • 劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹

    劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹

    跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • 深入理解JAVA抽象類和接口的比較與異同

    深入理解JAVA抽象類和接口的比較與異同

    這篇文章主要為大家詳細(xì)介紹了JAVA抽象類和接口的比較,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實(shí)現(xiàn)

    JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實(shí)現(xiàn)

    在Java編程中,經(jīng)常會(huì)遇到需要截取文件名的場(chǎng)景,本文主要介紹了JAVA?從完整的文件路徑中分別截取文件名和文件路徑的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • Spring中XmlWebApplicationContext的實(shí)現(xiàn)

    Spring中XmlWebApplicationContext的實(shí)現(xiàn)

    XmlWebApplicationContext是Spring?Framework中的一個(gè)重要類,本文主要介紹了Spring中XmlWebApplicationContext,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • java反射使用示例分享

    java反射使用示例分享

    這篇文章主要介紹了java反射使用示例,代碼很簡(jiǎn)單,需要的朋友可以參考下
    2014-02-02
  • Java?C++刷題leetcode1106解析布爾表達(dá)式

    Java?C++刷題leetcode1106解析布爾表達(dá)式

    這篇文章主要為大家介紹了Java?C++刷題leetcode1106解析布爾表達(dá)式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論