模擬併發的 4 種方式,還有誰不會??

来源:https://www.cnblogs.com/javastack/archive/2022/06/04/16341895.html
-Advertisement-
Play Games

一、Postman Postman 是一個款 HTTP 請求模擬工具 首先演示一下 Postman 最基本的使用,創建一個 Spring Boot 項目,測試的代碼如下: import org.springframework.web.bind.annotation.GetMapping; impor ...


一、Postman

Postman 是一個款 HTTP 請求模擬工具

首先演示一下 Postman 最基本的使用,創建一個 Spring Boot 項目,測試的代碼如下:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("test")
public class TestConrtoller {

    @GetMapping("demo")
    public String testDemo() {
        return "result~";
    }
}

為了便於操作,一般會將

http://127.0.0.1:8080 是經常使用的地址+埠號,可以設置為環境,點擊右上角的設置圖標

選擇 global

輸入信息

以後再進行測試就能這樣搞簡寫了

知道基本使用之後,我們來看一下如何模擬併發測試

填寫基本信息後,創建:

這個時候會創建出Concurrency的文件夾,我們可以把剛纔測試的demo的例子放進這個文件夾下:

這個時候就可以在Concurrency下看到這個介面測試了

選擇併發測試:

這個時候彈出我們想要的框了

點擊 Run Concurrency

你可以立馬感覺到 CPU 在“燃燒”,因為要記錄並列印日誌,顯示的話是一條一條來的,其實測試的速度,要比你看到的列印的日誌的速度快,綠色表示正常

二、Apache Bench(AB)

ApacheBench 是 Apache 伺服器自帶的一個web壓力測試工具,簡稱ab。

ab又是一個命令行工具,對發起負載的本機要求很低,根據ab命令可以創建很多的併發訪問線程,模擬多個訪問者同時對某一URL地址進行訪問,因此可以用來測試目標伺服器的負載壓力。總的來說ab工具小巧簡單,上手學習較快,可以提供需要的基本性能指標,但是沒有圖形化結果,不能監控。

使用的話,首先需要安裝 Apache 伺服器

網站:傳送門 http://httpd.apache.org/download.cgi

因為我的操作系統是 windows10, 這裡選擇 File for Microsoft Windows

Linux下的安裝是非常簡單的,這裡不再演示

選擇 ApacheHaus

進入下載頁面 選擇適合自己電腦的版本

文件解壓到本地文件夾下,如果不是解壓在c盤,需要設置參數,註意文件路徑最好都是英文,關於需要設置參數,conf->httpd.conf 使用文本編輯器打開,需要修改的有三個地方:

運行根目錄,修改成自己解壓到本地的路徑

監聽埠,預設監聽埠是80,如果已被使用會報錯需要修改,如果80埠未被使用,可不修改;如果修改了監聽埠,則需要把ServerName localhost也相應改成同樣的端 口號

DocumentRoot 測試文件存放地,且該目錄必須存在

配置完成後,命令行cmd進入 D:\softUtil\Apache24\bin 目錄下

httpd.exe -k install

啟動:

httpd.exe -k start

測試:

-n :請求數
-c: 併發數

三、併發模擬工具JMeter

JMeter也是一款性能測試工具,是圖形化的。下載地址:傳送門 http://jmeter.apache.org/

需要 Java8+ 的環境

解壓到你覺得合適的目錄下(註意最好是英文路徑),進入它的 bin 目錄下 啟動 jmeter.bat 即可。

使用很簡單,首先在測試計劃部分新建一個線程組

設置好基礎信息後添加HTTP請求(基本信息設置好沒有OK哈,直接添加HTTP請求)

填寫HTTP請求相關的內容

之後還要添加監聽器,這裡選擇是圖形結果

再添加一個查看結果樹吧

在運行之前打開log Viewer

下麵開始運行:

執行成功,來感受一下結果:

點進去

查看結果樹

四、代碼模擬

這裡需要用到一個類,就是 CountDownLatch。CountDownLatch 是一個計數器閉鎖,通過它可以完成類似於阻塞當前線程的功能,即:一個線程或多個線程一直等待,直到其他線程執行的操作完成。

更多多線程教程可以參考:https://www.javastack.cn/categories/Java/

CountDownLatch 用一個給定的計數器來初始化,該計數器的操作是原子操作,即同時只能有一個線程去操作該計數器。調用該類await方法的線程會一直處於阻塞狀態,直到其他線程調用 countDown 方法使當前計數器的值變為零,每次調用 countDown 計數器的值減1。

當計數器值減至零時,所有因調用await()方法而處於等待狀態的線程就會繼續往下執行。這種現象只會出現一次,因為計數器不能被重置。下圖和它的方法可以體現出來:

CountDownLatch類只提供了一個構造器:

public CountDownLatch(int count) { };

然後下麵這 3 個方法是 CountDownLatch 類中最重要的方法(上圖能夠反映出來)

public void await() throws InterruptedException { };
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };
public void countDown() { };

下麵還需要看一個類 Semaphore

Semaphore 與 CountDownLatch 相似,不同的地方在於 Semaphore 的值被獲取到後是可以釋放的,並不像 CountDownLatch 那樣一直減到底。

它也被更多地用來限制流量,類似閥門的 功能。如果限定某些資源最多有N個線程可以訪問,那麼超過N個主不允許再有線程來訪問,同時當現有線程結束後,就會釋放,然後允許新的線程進來。有點類似於鎖的lock與 unlock過程。相對來說他也有兩個主要的方法:

用於獲取許可權的acquire(),其底層實現與CountDownLatch.countdown()類似;用於釋放許可權的release(),其底層實現與acquire()是一個互逆的過程。

通過這兩個類可以進行併發的模擬:

測試一下:

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;

@Slf4j
public class CuncurrencyTest {

    public static int clientTotal = 5000;
    public static int threadTotal = 200;
    public static int count = 0;
    public static void main(String[] args) throws InterruptedException {

        ExecutorService executorService = Executors.newCachedThreadPool();

        final Semaphore semaphore = new Semaphore(threadTotal);
        final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);

        for (int i = 0; i < clientTotal; i++) {
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                    add();
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    log.error("exception",e);
                }
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        executorService.shutdown();
        log.info("count:{}",count);

    }

    private static void  add() {
        count++;
    }
}

因為 count 不是線程安全的,且沒有作防護措施,結果是錯的

上面是對代碼的併發模擬的簡單形式,值得註意的是,這裡提到的兩個類不是專門做併發模擬,它們的用途很廣泛,等之後更新Java網路編程的東西的時候,還會詳細介紹它們。

版權聲明:本文為CSDN博主「沉曉」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_42322103/article/details/102736170

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、引言 • PL/SQL 程式可通過條件或迴圈結構來控制命令執行的流程。 • PL/SQL 提供了豐富的流程式控制制語句,與 Java 一樣也有三種控制結構: • 順序結構 • 選擇結構 • 迴圈結構 二、選擇結構 2.1、IF-THEN 1)IF-THEN 該結構先判斷一個條件是否為 TRUE,條件 ...
  • GPU 渲染機制:CPU計算好顯示內容提交到GPU,GPU渲染完成後將渲染結果放入幀緩衝區frame buffer,隨後視頻控制器會按照VSync信號逐行讀取幀緩衝區的數據,經過可能的數模轉換傳遞給顯示器顯示。 GPU 屏幕渲染有以下兩種方式: ● 1)On-Screen Rendering,意為當 ...
  • 非常感謝小趙同學給我反饋的這個 Bug
  • 前言 眾所周知,spring對於java程式員來說是一個及其重要的後端框架,幾乎所有的公司都會使用的框架,而且深受廣大面試官的青睞。所以本文就以常見的一個面試題"spring bean的生命周期"為切入點,從源碼的角度帶領大家來看一看 spring bean到底是如何創建的 。spring bean ...
  • springboot自動裝配原理探究 結論: SpringBoot啟動會載入大量的自動配置類 我們看我們需要的功能有沒有在SpringBoot預設寫好的自動配置類當中; 我們再來看這個自動配置類中到底配置了哪些組件;(只要我們要用的組件存在在其中,我們就不需要再手動配置了) 給容器中自動配置類添加組 ...
  • vscode 中配置Java環境 轉載說明:本篇文檔原作者[@火星動力猿],文檔出處來自嗶哩嗶哩-【教程】VScode中配置Java運行環境 轉載請在開頭或顯眼位置標註轉載信息。 1.下載VScode 官網地址:https://code.visualstudio.com/ (點鏈接時按下Ctrl,不 ...
  • SpringMVC 是基於 MVC 開發模式的框架,用來優化控制器,是 Spring 家族的一員,同時它也具備 IOC 和 AOP ...
  • 一、填空題 在種群增長預測問題中,若資源環境等因素是有限的,則應使用的微分方程模型為 Logistic模型 某種群分為 4 個年齡組, 各組的繁殖率分別為 0, 0.8, 1.8, 0.2, 存活率分別為 0.5, 0.7, 0.9, 0. 現各組的數量均為 100, 則該種群的的穩定分佈向量為 解 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...