四种方式 模拟并发,你的API接口扛得住不?

4151aec79ebdbf874abbd1c77346dbf2.png

来源:chenxiao.blog.csdn.net/article/details/102736170

一、Postman

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

eb75c5b9a625e77bd86c90d48683bf43.png

首先演示一下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~";
    }
}
ae88b9c2f61215479fdad6521b1e5890.png

为了便于操作,一般会将

http://127.0.0.1:8080 是经常使用的地址+端口号,可以设置为环境

点击右上角的设置图标

f7b3a0464c9456a3ca9a33e6eaeeda62.png

选择global

c94b94c69f93059d2febf52ddf55cca8.png

输入信息

273d645a862a2862012d4090e1f3dd1f.png

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

f4675bccfb731a07a932855f32fe73cb.png

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

727ca2801e77e1f940890fe960ce2256.png e383292ea2a5607aa9c93b3a930ad87b.png

填写基本信息后,创建

2698bebd29d55d4750d21dd1432a2758.png

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

1c5f087b64100df5edca5ed0e1b1fbb6.png b0d43d1fd0ad564c6e2167ccff732ca1.png

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

13d03136450ebfe51b74a93ac917d9c0.png

选择并发测试:

88c37c71ae4d76cb4ea498dc0867087f.png

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

dcc570f7964bc2ac56a31caa7f674032.png

点击Run Concurrency

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

224df5e9844f55106503eee11b900a61.png

二、Apache Bench(AB)

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

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

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

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

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

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

1f16e1ba97099c32c5c97517619fa820.png

选择 ApacheHaus

3819672fdbadc5e216b874c571153db6.png

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

27682f90529a2dd3b1cd08be297d7874.png

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

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

需要修改的有三个地方:

06d3c64778c526441594711bcf7ba35c.png 2942510bef18bd0e4e73c8d26bec4c53.png

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

c4afb0041b23c9a3122bb15a4a8cdcee.png

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

57ecc492ab432f8f81b10d13cf6fa590.png e348bdbcc8398f9b09000b0573cfb4cc.png

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

b186c41bd284457ef5363b586557564c.png

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

httpd.exe  -k  install
1f50c0a903ea6e5c45fc4b2f8ec8d61b.png

启动:

httpd.exe -k start

测试:

  • -n :请求数

  • -c: 并发数

fc6b65d584c96647c70549461fa0a87f.png

三、并发模拟工具JMeter

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

下载地址:传送门 http://jmeter.apache.org/

86470b2faf5393fb364dc4e078be2554.png

需要Java8+的环境

23ff223b768d3c94b93284b2e3efe540.png

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

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

263b5035f9bc4fd2c5c447a32af8e2d0.png

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

c78b70893f3106447f5fb4459d83cf74.png 46fe885373aeac4d435f534e8800d5ce.png c20c1200a04adf9dd83de5399f5f8deb.png

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

4cdc2ab7171566dbae5214273d763a7f.png

填写HTTP请求相关的内容

a1a162a41f87da0cdef090c0eca336ad.png

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

74d556d3998dea7b335eabd238b518e5.png

再添加一个查看结果树吧

782aebbaf9abf4ad03021b6fcae6ed05.png

在运行之前打开log Viewer

440dcb690cafc872ad633da020a61273.png

下面开始运行:

c6b5303b5141cfd371c9119e303968fd.png

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

cf053168c619f534ac642a96a7975cde.png

点进去

206622c9719503d3b7318dd0d1eb9c3c.png

查看结果树

10c61df14ec44408e1ecbc873ba7d222.png

四、代码模拟

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

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

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

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

a278d9605297f732e0bf78a8a17d514a.png

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不是线程安全的,且没有作防护措施,结果是错的

c8ee6271fe3cd15109c0ad669d03cb80.png
往期推荐


前后端分离架构,超全面详解~
支付宝项目组使用的支付加密规则梳理,写的太好了!
Springboot+Redis+Interceptor+自定义annotation实现接口自动幂等
Docker 图形化工具:Portainer,推荐给你!
如何保障消息100%投递成功、消息幂等性?
SpringBoot2+Vue+Redis的企业级聚合支付系统,可二次开发接私活!
目前我见过最好的跨域解决方案!
12 个适合做外包项目的开源后台管理系统
Elasticsearch 快速检索的秘诀
回复【干货】获取精选干货视频教程

回复【加群】加入疑难问题攻坚交流群
回复【mat】获取内存溢出问题分析详细文档教程
回复【赚钱】用java写一个能赚钱的微信机器人
回复【副业】获取程序员副业攻略一份




好文请点赞+分享
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值