别再写代码测试并发了,太 Low!模拟并发的 4 种方法,还有谁不会??

点击关注公众号,Java干货及时送达8fbf3be42394bb10d8d71da663ff4ea0.png

一、Postman

Postman 是一个款 HTTP 请求模拟工具

2ad2987931be58938638e4a4a658e9fe.png

首先演示一下 Postman 最基本的使用,创建一个 Spring Boot 项目,测试的代码如下:

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~";
    }
}
6dd10969b8b157bdeb7556f4478862d8.png

为了便于操作,一般会将

http://127.0.0.1:8080 是经常使用的地址+端口号,可以设置为环境,点击右上角的设置图标

0927fcbc35b8d3efd69405ce6a4501a5.png

选择 global

ff91b18b8889d7a1f57535911f7a0657.png

输入信息

0590b3ae3a07c18cb7b6afeed1de0fe3.png

以后再进行测试就能这样搞简写了

862b1500fbadfc0e980cf6579fb3a036.png

知道基本使用之后,我们来看一下如何模拟并发测试,想成为架构师,这份架构师图谱建议看看,少走弯路。

40d770cb48920aa20bc533fb78d1dc73.png

填写基本信息后,创建:

e6f4b9b0493f94c10ce055b7cd227ea2.png

这个时候会创建出Concurrency的文件夹,我们可以把刚才测试的demo的例子放进这个文件夹下:

ede5a44f62505ac3d02a46bcc6c14bb0.png dfe6edbadd5582ab3227e8046a30c13c.png

这个时候就可以在Concurrency下看到这个接口测试了

4a4574a29fac7710d146be6c797c77bd.png

选择并发测试:

fab0af95acb44d63bf9d34430478c474.png

这个时候弹出我们想要的框了

11c226d02af6129dddc9051130ec7a3f.png

点击 Run Concurrency

你可以立马感觉到 CPU 在“燃烧”,因为要记录并打印日志,显示的话是一条一条来的,其实测试的速度,要比你看到的打印的日志的速度快,绿色表示正常

e04b5d2a88249ca1b909b301ea3fed05.png

二、Apache Bench(AB)

ApacheBench 是 Apache 服务器自带的一个web压力测试工具,简称ab。

ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。总的来说ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。

使用的话,首先需要安装 Apache 服务器

网站:传送门 http://httpd.apache.org/download.cgi

因为我的操作系统是 windows10, 这里选择 File for Microsoft Windows

最新面试题整理好了,大家可以在Java面试库小程序在线刷题。

Linux下的安装是非常简单的,这里不再演示

5e71f6f3bf4e580276feac0d5f92ae0a.png

选择 ApacheHaus

f085829544b323db0e73265df792b832.png

进入下载页面 选择适合自己电脑的版本

ede46628bad1d1b9078d0d82d9f97e99.png

文件解压到本地文件夹下,如果不是解压在c盘,需要设置参数,注意文件路径最好都是英文,关于需要设置参数,conf->httpd.conf 使用文本编辑器打开,需要修改的有三个地方:

1cb1162cc32733c8a3428b6b8ec78940.png 50882e7b152c59ac59ff2d70033943ea.png

运行根目录,修改成自己解压到本地的路径

点击关注公众号,Java干货及时送达97d1f7130db4237e2b747ec67c6a6198.png

9eaaa41a14ea9b8362ec60ddcc81c2be.png

监听端口,默认监听端口是80,如果已被使用会报错需要修改,如果80端口未被使用,可不修改;如果修改了监听端口,则需要把ServerName localhost也相应改成同样的端 口号

7098b2cb08901181e24ae7f16e1cf207.png dbc224c888cc7b2c92768f83869fceed.png

DocumentRoot 测试文件存放地,且该目录必须存在

9cc24b16820fe71281168af7dcac743b.png

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

httpd.exe -k install
15926b6a959a2a4dea7cd789e6731049.png

启动:

httpd.exe -k start

测试:

-n :请求数 -c: 并发数

68e7be0e2c5d53ac77cb66b5156d8fc8.png

三、并发模拟工具JMeter

JMeter也是一款性能测试工具,是图形化的。下载地址:传送门 http://jmeter.apache.org/

bc62e8a1102e80ee07377c936abc4812.png

需要 Java8+ 的环境

daf2b790a941db940c113dc58b613d98.png

解压到你觉得合适的目录下(注意最好是英文路径),进入它的 bin 目录下 启动 jmeter.bat 即可。想成为架构师,这份架构师图谱建议看看,少走弯路。

b8fa8d8df9ce1a364b84a3326d890be1.png

使用很简单,首先在测试计划部分新建一个线程组

565815533cb7e8e6fdc4c3bf464ad877.png 16ba31fe1888147ffbf0f088aa7b384d.png aaed24bd123d7c45ed49cfa4cfb36cff.png

设置好基础信息后添加HTTP请求(基本信息设置好没有OK哈,直接添加HTTP请求)

ec87d884cd1f4e3e19d96e56dd2fb143.png

填写HTTP请求相关的内容

9d441b878bcdd96704c403c03c6a3c48.png

之后还要添加监听器,这里选择是图形结果

3afdd38581e1c6c806b9071218dfa196.png

再添加一个查看结果树吧

c525553d8b3b3a93426b590c71543700.png

在运行之前打开log Viewer

04fc560ba2683204d2d2b97dbbc450b3.png

下面开始运行:

7f96e218b841df123cbba333c2283ea7.png

执行成功,来感受一下结果:

d2951454d0f0919dfcaeecaceaf87cff.png

点进去

ef3ce25ceb948bdcad2fa4a321f17f34.png

查看结果树

8e7edffc5d15b3841d253604c5f9bcde.png

四、代码模拟

这里需要用到一个类,就是 CountDownLatch。CountDownLatch 是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。

更多多线程教程可以参考:https://www.javastack.cn/categories/Java/

CountDownLatch 用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会一直处于阻塞状态,直到其他线程调用 countDown 方法使当前计数器的值变为零,每次调用 countDown 计数器的值减1。最新面试题整理好了,大家可以在Java面试库小程序在线刷题。

当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就会继续往下执行。这种现象只会出现一次,因为计数器不能被重置。下图和它的方法可以体现出来:

8da0587db8cf65648a238c976aa2c5d8.png

CountDownLatch类只提供了一个构造器:

public CountDownLatch(int count) { };

然后下面这 3 个方法是 CountDownLatch 类中最重要的方法(上图能够反映出来)

public void await() throws InterruptedException { };
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };
public void countDown() { };

下面还需要看一个类 Semaphore

Semaphore 与 CountDownLatch 相似,不同的地方在于 Semaphore 的值被获取到后是可以释放的,并不像 CountDownLatch 那样一直减到底。

它也被更多地用来限制流量,类似阀门的 功能。如果限定某些资源最多有N个线程可以访问,那么超过N个主不允许再有线程来访问,同时当现有线程结束后,就会释放,然后允许新的线程进来。有点类似于锁的lock与 unlock过程。相对来说他也有两个主要的方法:

用于获取权限的acquire(),其底层实现与CountDownLatch.countdown()类似;用于释放权限的release(),其底层实现与acquire()是一个互逆的过程。

通过这两个类可以进行并发的模拟:

测试一下:

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

因为 count 不是线程安全的,且没有作防护措施,结果是错的

9150588bd410564896510fc3a5dfa37b.png上面是对代码的并发模拟的简单形式,值得注意的是,这里提到的两个类不是专门做并发模拟,它们的用途很广泛,等之后更新Java网络编程的东西的时候,还会详细介绍它们。

版权声明:本文为CSDN博主「沉晓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 

原文链接:https://blog.csdn.net/qq_42322103/article/details/102736170

480d385b4f592f042c1faf77ac11b52c.gif

6c03fa79ac189d8ba8002d7078c84b93.png

Spring Boot 定时任务开启后,怎么自动停止?

工作 3 年的同事不知道如何回滚代码

23 种设计模式实战(很全)

Spring Boot 保护敏感配置的 4 种方法!

再见单身狗!Java 创建对象的 6 种方式

阿里为什么推荐使用 LongAdder?

新来一个技术总监:禁止戴耳机写代码。。

重磅!Spring Boot 2.7 正式发布

Java 18 正式发布,finalize 被弃用。

Spring Boot Admin 横空出世!

Spring Boot 学习笔记,这个太全了!

关注Java技术栈看更多干货

b364fc66e89546b09be5ef2e8664525e.png

20d89649282ee8b321b027fc717993b4.gif

获取 Spring Boot 实战笔记!

猜你喜欢

转载自blog.csdn.net/youanyyou/article/details/125075887
今日推荐