<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 6970字,需瀏覽 14分鐘

           ·

          2021-12-18 12:53

          作者 | 沉?xí)?br style="max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;">

          來(lái)源 | https://chenxiao.blog.csdn.net/article/details/102736170

          一、Postman

          Postman是一個(gè)款http請(qǐng)求模擬工具

          首先演示一下postman最基本的使用

          創(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~";
              }
          }

          為了便于操作,一般會(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è)試


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

          如果您正在學(xué)習(xí)Spring Boot,那么推薦一個(gè)連載多年還在繼續(xù)更新的免費(fèi)教程:http://blog.didispace.com/spring-boot-learning-2x/

          這個(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。與優(yōu)秀的人在一起,自己也會(huì)優(yōu)秀起來(lái)!高質(zhì)量技術(shù)群等你加入!

          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

          Linux下的安裝是非常簡(jiǎn)單的,這里不再演示

          選擇 ApacheHaus

          進(jìn)入下載頁(yè)面 選擇適合自己電腦的版本(與優(yōu)秀的人在一起,自己也會(huì)優(yōu)秀起來(lái)!高質(zhì)量技術(shù)群等你加入!

          文件解壓到本地文件夾下,如果不是解壓在c盤,需要設(shè)置參數(shù),注意文件路徑最好都是英文

          關(guān)于需要設(shè)置參數(shù),conf->httpd.conf 使用文本編輯器打開(kāi),

          需要修改的有三個(gè)地方:

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

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

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

          配置完成后,命令行cmd進(jìn)入D:\softUtil\Apache24\bin目錄下

          httpd.exe  -k  install

          與優(yōu)秀的人在一起,自己也會(huì)優(yōu)秀起來(lái)!高質(zhì)量技術(shù)群等你加入!

          啟動(dòng):

          httpd.exe -k start

          測(cè)試:

          • -n :請(qǐng)求數(shù)
          • -c: 并發(fā)數(shù)

          如果您正在學(xué)習(xí)Spring Cloud,推薦一個(gè)經(jīng)典教程(含Spring Cloud Alibaba):https://blog.didispace.com/spring-cloud-learning

          三、并發(fā)模擬工具JMeter

          JMeter也是一款性能測(cè)試工具,是圖形化的。

          下載地址:傳送門 http://jmeter.apache.org/

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

          解壓到你覺(jué)得合適的目錄下(注意最好是英文路徑)

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

          使用很簡(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)聽(tīng)器,這里選擇是圖形結(jié)果

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

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

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

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

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

          查看結(jié)果樹(shù)

          四、代碼模擬

          這里需要用到一個(gè)類,就是CountDownLatch。

          CountDownLatch是一個(gè)計(jì)數(shù)器閉鎖,通過(guò)它可以完成類似于阻塞當(dāng)前線程的功能,即:一個(gè)線程或多個(gè)線程一直等待,直到其他線程執(zhí)行的操作完成。

          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。當(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) {  };  //參數(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

          下面還需要看一個(gè)類Semaphore

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

          它也被更多地用來(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ò)程。

          通過(guò)這兩個(gè)類可以進(jìn)行并發(fā)的模擬:

          測(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 < 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++;
              }
          }

          因?yàn)閏ount不是線程安全的,且沒(méi)有作防護(hù)措施,結(jié)果是錯(cuò)的

          上面是對(duì)代碼的并發(fā)模擬的簡(jiǎn)單形式,值得注意的是,這里提到的兩個(gè)類不是專門做并發(fā)模擬,它們的用途很廣泛,大家可以了解一下。

          往期推薦

          絕了!這個(gè)開(kāi)源驗(yàn)證碼項(xiàng)目,差點(diǎn)晚上癮...

          Log4j2再發(fā)新版本2.16.0,完全刪除Message Lookups的支持,加固漏洞防御!

          為什么有的公司會(huì)規(guī)定所有接口都用 POST請(qǐng)求?

          先上傳自己的果照,就能防止別人亂傳?總覺(jué)得哪里不對(duì)…...

          內(nèi)卷的真正原因:這篇華為內(nèi)部論壇的短文講透了!


          技術(shù)交流群
          最近有很多人問(wèn),有沒(méi)有讀者交流群,想知道怎么加入。加入方式很簡(jiǎn)單,有興趣的同學(xué),只需要點(diǎn)擊下方卡片,回復(fù)“加群,即可免費(fèi)加入我們的高質(zhì)量技術(shù)交流群!

          點(diǎn)擊閱讀原文,送你免費(fèi)Spring Boot教程!

          瀏覽 53
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操xxxx | 国产欧美黄色一级二级三级 | 日韩123级毛片视频中文 | 美女被曹91 | 欧美韩三级 |