并發(fā)模擬的四種方式 + 工具,超級(jí)實(shí)用!

來(lái)源:chenxiao.blog.csdn.net/article/details/102736170
一、Postman
Postman是一個(gè)款http請(qǐng)求模擬工具
創(chuàng)建一個(gè)Springboot項(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~";
????}
}
http://127.0.0.1:8080?是經(jīng)常使用的地址+端口號(hào),可以設(shè)置為環(huán)境
點(diǎn)擊右上角的設(shè)置圖標(biāo)
以后再進(jìn)行測(cè)試就能這樣搞簡(jiǎn)寫了,搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師回復(fù)“2T”,送你一份驚喜禮包。
知道基本使用之后,我們來(lái)看一下如何模擬并發(fā)測(cè)試
填寫基本信息后,創(chuàng)建
這個(gè)時(shí)候會(huì)創(chuàng)建出Concurrency的文件夾,我們可以把剛才測(cè)試的demo的例子放進(jìn)這個(gè)文件夾下
選擇并發(fā)測(cè)試:
這個(gè)時(shí)候彈出我們想要的框了
你可以立馬感覺(jué)到CPU在“燃燒”,因?yàn)橐涗洸⒋蛴∪罩?,顯示的話是一條一條來(lái)的,其實(shí)測(cè)試的速度,要比你看到的打印的日志的速度快,綠色表示正常
二、Apache Bench(AB)
選擇 ApacheHaus

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

文件解壓到本地文件夾下,如果不是解壓在c盤,需要設(shè)置參數(shù),注意文件路徑最好都是英文搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師回復(fù)“2T”,送你一份驚喜禮包。


運(yùn)行根目錄,修改成自己解壓到本地的路徑



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

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

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

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


進(jìn)入它的bin目錄下 啟動(dòng)jmeter.bat即可

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




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

之后還要添加監(jiān)聽(tīng)器,這里選擇是圖形結(jié)果,搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師回復(fù)“2T”,送你一份驚喜禮包。


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

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


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


四、代碼模擬

CountDownLatch類只提供了一個(gè)構(gòu)造器:
public?CountDownLatch(int?count)?{??};??//參數(shù)count為計(jì)數(shù)值
然后下面這3個(gè)方法是CountDownLatch類中最重要的方法(上圖能夠反映出來(lái))
public?void?await()?throws?InterruptedException?{?};???//調(diào)用await()方法的線程會(huì)被掛起,它會(huì)等待直到count值為0才繼續(xù)執(zhí)行
public?boolean?await(long?timeout,?TimeUnit?unit)?throws?InterruptedException?{?};??//和await()類似,只不過(guò)等待一定的時(shí)間后count值還沒(méi)變?yōu)?的話就會(huì)繼續(xù)執(zhí)行
public?void?countDown()?{?};??//將count值減1
它也被更多地用來(lái)限制流量,類似閥門的 功能。如果限定某些資源最多有N個(gè)線程可以訪問(wèn),那么超過(guò)N個(gè)主不允許再有線程來(lái)訪問(wèn),同時(shí)當(dāng)現(xiàn)有線程結(jié)束后,就會(huì)釋放,然后允許新的線程進(jìn)來(lái)。有點(diǎn)類似于鎖的lock與 unlock過(guò)程。相對(duì)來(lái)說(shuō)他也有兩個(gè)主要的方法:
用于獲取權(quán)限的acquire(),其底層實(shí)現(xiàn)與CountDownLatch.countdown()類似;
用于釋放權(quán)限的release(),其底層實(shí)現(xiàn)與acquire()是一個(gè)互逆的過(guò)程。
測(cè)試一下:
import?lombok.extern.slf4j.Slf4j;
import?java.util.concurrent.*;
@Slf4j
public?class?CuncurrencyTest?{
????//?請(qǐng)求總數(shù)
????public?static?int?clientTotal?=?5000;
????//?同時(shí)并發(fā)執(zhí)行的線程總數(shù)
????public?static?int?threadTotal?=?200;
????public?static?int?count?=?0;
????public?static?void?main(String[]?args)?throws?InterruptedException?{
????????//?定義線程池
????????ExecutorService?executorService?=?Executors.newCachedThreadPool();
????????//?定義信號(hào)量?最大的線程數(shù)量
????????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)閏ount不是線程安全的,且沒(méi)有作防護(hù)措施,結(jié)果是錯(cuò)的

全棧架構(gòu)社區(qū)交流群
?「全棧架構(gòu)社區(qū)」建立了讀者架構(gòu)師交流群,大家可以添加小編微信進(jìn)行加群。歡迎有想法、樂(lè)于分享的朋友們一起交流學(xué)習(xí)。
掃描添加好友邀你進(jìn)架構(gòu)師群,加我時(shí)注明【姓名+公司+職位】
全棧架構(gòu)社區(qū)交流群
?「全棧架構(gòu)社區(qū)」建立了讀者架構(gòu)師交流群,大家可以添加小編微信進(jìn)行加群。歡迎有想法、樂(lè)于分享的朋友們一起交流學(xué)習(xí)。
看完本文有收獲?請(qǐng)轉(zhuǎn)發(fā)分享給更多人
往期資源:
