1. 并發(fā)模擬的四種方式

        共 6212字,需瀏覽 13分鐘

         ·

        2022-07-13 02:23

        程序員的成長之路
        互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
        關(guān)注


        閱讀本文大概需要 4.5 分鐘。

        來自:網(wǎng)絡(luò)

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

        首先演示一下 Postman 最基本的使用,創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,測試的代碼如下:
        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)行測試就能這樣搞簡寫了

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

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

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

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

        選擇并發(fā)測試:

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

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

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

        選擇 ApacheHaus


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

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

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

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

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

        配置完成后,命令行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也是一款性能測試工具,是圖形化的。下載地址:傳送門 http://jmeter.apache.org/

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

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

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

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

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

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

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

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

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

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

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

        查看結(jié)果樹

        四、代碼模擬
        這里需要用到一個(gè)類,就是 CountDownLatch。CountDownLatch 是一個(gè)計(jì)數(shù)器閉鎖,通過它可以完成類似于阻塞當(dāng)前線程的功能,即:一個(gè)線程或多個(gè)線程一直等待,直到其他線程執(zhí)行的操作完成。
        CountDownLatch 用一個(gè)給定的計(jì)數(shù)器來初始化,該計(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)出來:

        CountDownLatch類只提供了一個(gè)構(gòu)造器:
        public CountDownLatch(int count) { };
        然后下面這 3 個(gè)方法是 CountDownLatch 類中最重要的方法(上圖能夠反映出來)
        public void await() throws InterruptedException { };
        public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };
        public void countDown() { };
        下面還需要看一個(gè)類 Semaphore
        Semaphore 與 CountDownLatch 相似,不同的地方在于 Semaphore 的值被獲取到后是可以釋放的,并不像 CountDownLatch 那樣一直減到底。
        它也被更多地用來限制流量,類似閥門的 功能。如果限定某些資源最多有N個(gè)線程可以訪問,那么超過N個(gè)主不允許再有線程來訪問,同時(shí)當(dāng)現(xiàn)有線程結(jié)束后,就會(huì)釋放,然后允許新的線程進(jìn)來。有點(diǎn)類似于鎖的lock與 unlock過程。相對(duì)來說他也有兩個(gè)主要的方法:
        用于獲取權(quán)限的acquire(),其底層實(shí)現(xiàn)與CountDownLatch.countdown()類似;用于釋放權(quán)限的release(),其底層實(shí)現(xiàn)與acquire()是一個(gè)互逆的過程。
        通過這兩個(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 < 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)?count 不是線程安全的,且沒有作防護(hù)措施,結(jié)果是錯(cuò)的

        上面是對(duì)代碼的并發(fā)模擬的簡單形式,值得注意的是,這里提到的兩個(gè)類不是專門做并發(fā)模擬,它們的用途很廣泛,等之后更新Java網(wǎng)絡(luò)編程的東西的時(shí)候,還會(huì)詳細(xì)介紹它們。
        <END>

        推薦閱讀:

        我在代碼里面故意留個(gè)漏洞,違法嗎?

        香蕉為什么能做隨機(jī)數(shù)生成器?因?yàn)椋撬绲摹拜椛渲酢?/a>

        互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G)

        內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!

        ?戳閱讀原文領(lǐng)??!                                  朕已閱 

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 亚洲五月天丁香 | 国产日本亚洲香蕉视频 | 激情三级视频 | 真人一级女婬片 | 国产精品久久久春嫩 |