模拟并发请求的几种方式

一、Postman

Postman是一个款http请求模拟工具。

图片

http请求模拟工具

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

创建一个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~";
    }
}

图片

postman最基本的使用

为了便于操作,一般会将http://127.0.0.1:8080是经常使用的地址+端口号,可以设置为环境。点击右上角的设置图标:

图片

postman配置

选择global

图片

在这里插入图片描述

图片

在这里插入图片描述

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

图片

在这里插入图片描述

知道基本使用之后,我们来看一下如何模拟并发测试。

图片

在这里插入图片描述

图片

在这里插入图片描述

填写基本信息后,创建。

图片

在这里插入图片描述

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

图片

在这里插入图片描述

图片

在这里插入图片描述

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

图片

在这里插入图片描述

选择并发测试:

图片

在这里插入图片描述

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

图片

在这里插入图片描述

点击Run Concurrency。

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

图片

在这里插入图片描述

二、Apache Bench(AB)

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

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

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

网站:http://httpd.apache.org/download.cgi

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

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

图片

在这里插入图片描述

选择 ApacheHaus

图片

在这里插入图片描述

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

图片

在这里插入图片描述

文件解压到本地文件夹下,如果不是解压在c盘,需要设置参数,注意文件路径最好都是英文

关于需要设置参数,conf->httpd.conf 使用文本编辑器打开,

需要修改的有三个地方:

图片

在这里插入图片描述

图片

在这里插入图片描述

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

图片

在这里插入图片描述

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

图片

在这里插入图片描述

图片

在这里插入图片描述

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

图片

在这里插入图片描述

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

httpd.exe  -k  install

图片

在这里插入图片描述

启动:

httpd.exe -k start

测试:

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

图片

在这里插入图片描述

三、并发模拟工具JMeter

JMeter也是一款性能测试工具,是图形化的。

下载地址:http://jmeter.apache.org

图片

在这里插入图片描述

需要Java8+的环境

图片

在这里插入图片描述

解压到你觉得合适的目录下(注意最好是英文路径)

进入它的bin目录下 启动jmeter.bat即可

图片

在这里插入图片描述

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

图片

在这里插入图片描述

图片

在这里插入图片描述

图片

在这里插入图片描述

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

图片

在这里插入图片描述

填写HTTP请求相关的内容

图片

在这里插入图片描述

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

图片

在这里插入图片描述

再添加一个查看结果树吧

图片

在这里插入图片描述

在运行之前打开log Viewer

图片

在这里插入图片描述

下面开始运行:

图片

在这里插入图片描述

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

图片

在这里插入图片描述

点进去

图片

在这里插入图片描述

查看结果树

图片

在这里插入图片描述

四、代码模拟

这里需要用到一个类,就是CountDownLatch。

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

CountDownLatch用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会一直处于阻塞状态,直到其他线程调用countDown方法使当前计数器的值变为零,每次调用countDown计数器的值减1。当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就会继续往下执行。这种现象只会出现一次,因为计数器不能被重置。

下图和它的方法可以体现出来:

图片

在这里插入图片描述

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

public CountDownLatch(int count) {  };  //参数count为计数值

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

public void await() throws InterruptedException { };   
//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  
//和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public void countDown() { };  
//将count值减1

下面还需要看一个类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不是线程安全的,且没有作防护措施,结果是错的

图片

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值