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

        共 6970字,需瀏覽 14分鐘

         ·

        2021-12-18 12:53

        作者 | 沉曉

        來源 | https://chenxiao.blog.csdn.net/article/details/102736170

        一、Postman

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

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

        創(chuàng)建一個Springboot項目,測試的代碼如下:

        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)常使用的地址+端口號,可以設(shè)置為環(huán)境

        點擊右上角的設(shè)置圖標

        選擇global

        輸入信息

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

        知道基本使用之后,我們來看一下如何模擬并發(fā)測試


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

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

        這個時候會創(chuàng)建出Concurrency的文件夾,我們可以把剛才測試的demo的例子放進這個文件夾下

        這個時候就可以在Concurrency下看到這個接口測試了

        選擇并發(fā)測試:

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

        點擊Run Concurrency

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

        二、Apache Bench(AB)

        ApacheBench 是 Apache 服務(wù)器自帶的一個web壓力測試工具,簡稱ab。與優(yōu)秀的人在一起,自己也會優(yōu)秀起來!高質(zhì)量技術(shù)群等你加入!

        ab又是一個命令行工具,對發(fā)起負載的本機要求很低,根據(jù)ab命令可以創(chuàng)建很多的并發(fā)訪問線程,模擬多個訪問者同時對某一URL地址進行訪問,因此可以用來測試目標服務(wù)器的負載壓力??偟膩碚fab工具小巧簡單,上手學習較快,可以提供需要的基本性能指標,但是沒有圖形化結(jié)果,不能監(jiān)控。

        使用的話,首先需要安裝Apache服務(wù)器

        網(wǎng)站:傳送門 http://httpd.apache.org/download.cgi

        因為我的操作系統(tǒng)是windows10, 這里選擇File for Microsoft Windows

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

        選擇 ApacheHaus

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

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

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

        需要修改的有三個地方:

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

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

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

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

        httpd.exe  -k  install

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

        啟動:

        httpd.exe -k start

        測試:

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

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

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

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

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

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

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

        進入它的bin目錄下 啟動jmeter.bat即可

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

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

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

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

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

        在運行之前打開log Viewer

        下面開始運行:

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

        點進去

        查看結(jié)果樹

        四、代碼模擬

        這里需要用到一個類,就是CountDownLatch。

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

        CountDownLatch用一個給定的計數(shù)器來初始化,該計數(shù)器的操作是原子操作,即同時只能有一個線程去操作該計數(shù)器。調(diào)用該類await方法的線程會一直處于阻塞狀態(tài),直到其他線程調(diào)用countDown方法使當前計數(shù)器的值變?yōu)榱?,每次調(diào)用countDown計數(shù)器的值減1。當計數(shù)器值減至零時,所有因調(diào)用await()方法而處于等待狀態(tài)的線程就會繼續(xù)往下執(zhí)行。這種現(xiàn)象只會出現(xiàn)一次,因為計數(shù)器不能被重置。

        下圖和它的方法可以體現(xiàn)出來:

        CountDownLatch類只提供了一個構(gòu)造器:

        public CountDownLatch(int count) {  };  //參數(shù)count為計數(shù)值

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

        public void await() throws InterruptedException { };   //調(diào)用await()方法的線程會被掛起,它會等待直到count值為0才繼續(xù)執(zhí)行
        public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()類似,只不過等待一定的時間后count值還沒變?yōu)?的話就會繼續(xù)執(zhí)行
        public void countDown() { };  //將count值減1

        下面還需要看一個類Semaphore

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

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

        • 用于獲取權(quán)限的acquire(),其底層實現(xiàn)與CountDownLatch.countdown()類似;
        • 用于釋放權(quán)限的release(),其底層實現(xiàn)與acquire()是一個互逆的過程。

        通過這兩個類可以進行并發(fā)的模擬:

        測試一下:

        import lombok.extern.slf4j.Slf4j;

        import java.util.concurrent.*;

        @Slf4j
        public class CuncurrencyTest {

            // 請求總數(shù)
            public static int clientTotal = 5000;

            // 同時并發(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();
                // 定義信號量 最大的線程數(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++;
            }
        }

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

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

        往期推薦

        絕了!這個開源驗證碼項目,差點晚上癮...

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

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

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

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


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

        點擊閱讀原文,送你免費Spring Boot教程!

        瀏覽 53
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 成人毛片免费40分钟视频 | 日本艳情片 | 国产色色网 | 午夜成人性 | 丰满人妻一区二区 |