別再寫代碼測(cè)試并發(fā)了,太 Low!模擬并發(fā)的 4 種方法,還有誰(shuí)不會(huì)??
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
一、Postman
Postman 是一個(gè)款 HTTP 請(qǐng)求模擬工具

首先演示一下 Postman 最基本的使用,創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,測(cè)試的代碼如下:
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~";
????}
}

為了便于操作,一般會(huì)將
http://127.0.0.1:8080 是經(jīng)常使用的地址+端口號(hào),可以設(shè)置為環(huán)境,點(diǎn)擊右上角的設(shè)置圖標(biāo)

選擇 global

輸入信息

以后再進(jìn)行測(cè)試就能這樣搞簡(jiǎn)寫了

知道基本使用之后,我們來(lái)看一下如何模擬并發(fā)測(cè)試,想成為架構(gòu)師,這份架構(gòu)師圖譜建議看看,少走彎路。

填寫基本信息后,創(chuàng)建:

這個(gè)時(shí)候會(huì)創(chuàng)建出Concurrency的文件夾,我們可以把剛才測(cè)試的demo的例子放進(jìn)這個(gè)文件夾下:


這個(gè)時(shí)候就可以在Concurrency下看到這個(gè)接口測(cè)試了

選擇并發(fā)測(cè)試:

這個(gè)時(shí)候彈出我們想要的框了

點(diǎn)擊 Run Concurrency
你可以立馬感覺(jué)到 CPU 在“燃燒”,因?yàn)橐涗洸⒋蛴∪罩荆@示的話是一條一條來(lái)的,其實(shí)測(cè)試的速度,要比你看到的打印的日志的速度快,綠色表示正常

二、Apache Bench(AB)
ApacheBench 是 Apache 服務(wù)器自帶的一個(gè)web壓力測(cè)試工具,簡(jiǎn)稱ab。
ab又是一個(gè)命令行工具,對(duì)發(fā)起負(fù)載的本機(jī)要求很低,根據(jù)ab命令可以創(chuàng)建很多的并發(fā)訪問(wèn)線程,模擬多個(gè)訪問(wèn)者同時(shí)對(duì)某一URL地址進(jìn)行訪問(wèn),因此可以用來(lái)測(cè)試目標(biāo)服務(wù)器的負(fù)載壓力??偟膩?lái)說(shuō)ab工具小巧簡(jiǎn)單,上手學(xué)習(xí)較快,可以提供需要的基本性能指標(biāo),但是沒(méi)有圖形化結(jié)果,不能監(jiān)控。
使用的話,首先需要安裝 Apache 服務(wù)器
網(wǎng)站:傳送門 http://httpd.apache.org/download.cgi
因?yàn)槲业牟僮飨到y(tǒng)是 windows10, 這里選擇 File for Microsoft Windows
最新面試題整理好了,大家可以在Java面試庫(kù)小程序在線刷題。
Linux下的安裝是非常簡(jiǎn)單的,這里不再演示

選擇 ApacheHaus

進(jìn)入下載頁(yè)面 選擇適合自己電腦的版本

文件解壓到本地文件夾下,如果不是解壓在c盤,需要設(shè)置參數(shù),注意文件路徑最好都是英文,關(guān)于需要設(shè)置參數(shù),conf->httpd.conf 使用文本編輯器打開,需要修改的有三個(gè)地方:


運(yùn)行根目錄,修改成自己解壓到本地的路徑
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

監(jiān)聽端口,默認(rèn)監(jiān)聽端口是80,如果已被使用會(huì)報(bào)錯(cuò)需要修改,如果80端口未被使用,可不修改;如果修改了監(jiān)聽端口,則需要把ServerName localhost也相應(yīng)改成同樣的端 口號(hào)


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

配置完成后,命令行cmd進(jìn)入 D:\softUtil\Apache24\bin 目錄下
httpd.exe?-k?install

啟動(dòng):
httpd.exe?-k?start
測(cè)試:
-n :請(qǐng)求數(shù) -c: 并發(fā)數(shù)

三、并發(fā)模擬工具JMeter
JMeter也是一款性能測(cè)試工具,是圖形化的。下載地址:傳送門 http://jmeter.apache.org/

需要 Java8+ 的環(huán)境

解壓到你覺(jué)得合適的目錄下(注意最好是英文路徑),進(jìn)入它的 bin 目錄下 啟動(dòng) jmeter.bat 即可。想成為架構(gòu)師,這份架構(gòu)師圖譜建議看看,少走彎路。

使用很簡(jiǎn)單,首先在測(cè)試計(jì)劃部分新建一個(gè)線程組



設(shè)置好基礎(chǔ)信息后添加HTTP請(qǐng)求(基本信息設(shè)置好沒(méi)有OK哈,直接添加HTTP請(qǐng)求)

填寫HTTP請(qǐng)求相關(guān)的內(nèi)容

之后還要添加監(jiān)聽器,這里選擇是圖形結(jié)果

再添加一個(gè)查看結(jié)果樹吧

在運(yùn)行之前打開log Viewer

下面開始運(yùn)行:

執(zhí)行成功,來(lái)感受一下結(jié)果:

點(diǎn)進(jìn)去

查看結(jié)果樹

四、代碼模擬
這里需要用到一個(gè)類,就是 CountDownLatch。CountDownLatch 是一個(gè)計(jì)數(shù)器閉鎖,通過(guò)它可以完成類似于阻塞當(dāng)前線程的功能,即:一個(gè)線程或多個(gè)線程一直等待,直到其他線程執(zhí)行的操作完成。
更多多線程教程可以參考:https://www.javastack.cn/categories/Java/
CountDownLatch 用一個(gè)給定的計(jì)數(shù)器來(lái)初始化,該計(jì)數(shù)器的操作是原子操作,即同時(shí)只能有一個(gè)線程去操作該計(jì)數(shù)器。調(diào)用該類await方法的線程會(huì)一直處于阻塞狀態(tài),直到其他線程調(diào)用 countDown 方法使當(dāng)前計(jì)數(shù)器的值變?yōu)榱悖看握{(diào)用 countDown 計(jì)數(shù)器的值減1。最新面試題整理好了,大家可以在Java面試庫(kù)小程序在線刷題。
當(dāng)計(jì)數(shù)器值減至零時(shí),所有因調(diào)用await()方法而處于等待狀態(tài)的線程就會(huì)繼續(xù)往下執(zhí)行。這種現(xiàn)象只會(huì)出現(xiàn)一次,因?yàn)橛?jì)數(shù)器不能被重置。下圖和它的方法可以體現(xiàn)出來(lái):

CountDownLatch類只提供了一個(gè)構(gòu)造器:
public?CountDownLatch(int?count)?{?};
然后下面這 3 個(gè)方法是 CountDownLatch 類中最重要的方法(上圖能夠反映出來(lái))
public?void?await()?throws?InterruptedException?{?};
public?boolean?await(long?timeout,?TimeUnit?unit)?throws?InterruptedException?{?};
public?void?countDown()?{?};
Semaphore 與 CountDownLatch 相似,不同的地方在于 Semaphore 的值被獲取到后是可以釋放的,并不像 CountDownLatch 那樣一直減到底。
通過(guò)這兩個(gè)類可以進(jìn)行并發(fā)的模擬:
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?????????????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++;
????}
}
因?yàn)?count 不是線程安全的,且沒(méi)有作防護(hù)措施,結(jié)果是錯(cuò)的
上面是對(duì)代碼的并發(fā)模擬的簡(jiǎn)單形式,值得注意的是,這里提到的兩個(gè)類不是專門做并發(fā)模擬,它們的用途很廣泛,等之后更新Java網(wǎng)絡(luò)編程的東西的時(shí)候,還會(huì)詳細(xì)介紹它們。
版權(quán)聲明:本文為CSDN博主「沉?xí)浴沟脑瓌?chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。?
原文鏈接:https://blog.csdn.net/qq_42322103/article/details/102736170

關(guān)注Java技術(shù)??锤喔韶?/strong>


