作者 | 沉晓

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

一、Postman

Postman是一个款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~";}
}

为了便于操作,一般会将

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

点击右上角的设置图标

选择global

输入信息

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

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

填写基本信息后,创建

如果您正在学习Spring Boot,那么推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/

这个时候会创建出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: 并发数

如果您正在学习Spring Cloud,推荐一个经典教程(含Spring Cloud Alibaba):https://blog.didispace.com/spring-cloud-learning

三、并发模拟工具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不是线程安全的,且没有作防护措施,结果是错的

上面是对代码的并发模拟的简单形式,值得注意的是,这里提到的两个类不是专门做并发模拟,它们的用途很广泛,大家可以了解一下。

往期推荐

绝了!这个开源验证码项目,差点晚上瘾...

Log4j2再发新版本2.16.0,完全删除Message Lookups的支持,加固漏洞防御!

为什么有的公司会规定所有接口都用 POST请求?

先上传自己的果照,就能防止别人乱传?总觉得哪里不对…...

内卷的真正原因:这篇华为内部论坛的短文讲透了!

技术交流群

最近有很多人问,有没有读者交流群,想知道怎么加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群“,即可免费加入我们的高质量技术交流群!

点击阅读原文,送你免费Spring Boot教程!

并发模拟的四种方式 + 工具,超级实用!相关推荐

  1. 并发模拟的四种方式+工具,超级实用!

    今日推荐 这 9 个 Java 开源项目 yyds,你知道几个?阿里技术专家推荐的20本书,免费送!K8S 部署 SpringBoot 项目(一篇够用)妙用Java 8中的 Function接口 消灭 ...

  2. 【Java并发编程】并发模拟的四种方式

    文章目录 并发模拟的四种方式 一.Postman 二.Apache Bench(AB) 三.并发模拟工具JMeter 四.代码模拟 并发模拟的四种方式 一.Postman Postman是一个款htt ...

  3. php生成二维码的几种方式,超级实用

    前期准备: 1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/ 2.PHP环境必须开启支持GD2扩展库支持(一般情况下都 ...

  4. linux添加磁盘的四种方式,以及工具的使用

    实验准备,我这里使用四块硬盘分别对四种方式做实验,大小随机 一,用fdisk工具分区 注意: 此工具只能分MBR分区,需要分GPT格式的应该使用gdisk或者parted这两个工具 使用fdisk对/ ...

  5. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  6. 访问数据库的四种方式

    IRIS 中支持的四种方式: SQL.Objects.REST 和 GraphQL   卡济米尔·马列维奇,<运动员>(1932) > > "你当然无法理解! 习惯了 ...

  7. 线程池(实现线程的第四种方式)

    线程池(实现线程的第四种方式) 1. 线程是什么 线程池其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作.无需反复创建线程而消耗过多的资源 2.使用线程池的优点 * ...

  8. java并发编程基础系列(五): 创建线程的四种方式

    线程的创建一共有四种方式: 继承于Thread类,重写run()方法: 实现Runable接口,实现里面的run()方法: 使用 FutureTask 实现有返回结果的线程 使用ExecutorSer ...

  9. Copy ArrayList的四种方式

    文章目录 简介 使用构造函数 使用addAll方法 使用Collections.copy 使用stream 总结 Copy ArrayList的四种方式 简介 ArrayList是我们经常会用到的集合 ...

最新文章

  1. pythongui界面小程序_python界面小程序
  2. linux内核启动过程5:启动用户空间
  3. linux下的chromedriver驱动器配置实例(含代码)
  4. 2020 CTF暑假夏令营培训Day2 密码学Crypto 部分笔记
  5. Oracle function注释
  6. C#中使用MongoDb
  7. 02. 不要试图编写独立于容器类型的代码
  8. html5 拖放游戏,HTML5拖放API实现拖放排序的实例代码
  9. 计算机导论dos实验报告,计算机导论实验报告-DOS常用命令的使用.doc
  10. 如何用html放音乐播放器,如何用html+js实现音乐歌词同步播放器
  11. plc secs通讯协议_一种SECSGEM通讯协议转换的方法与流程
  12. 转载——visio密钥
  13. 12306模拟登陆-超级鹰
  14. Matlab中(),[],与{}的用法区别
  15. esxi改mac地址_ESXI克隆CentOS修改MAC地址
  16. 人工智能与深度神经网络,人工智能深度神经网络
  17. [iOS]-Masonry的使用
  18. [matlab]matlab cftool点了没反应
  19. Scala入门系列(7)-Scala之函数式编程
  20. 时间过的好快呀,中国云计算,一转眼也十年啦

热门文章

  1. 关于redo(二)插入更新数据时的效率比较
  2. 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
  3. mysql memcached plugin插件
  4. TCP服务端收到syn但是不回复syn ack问题分析
  5. python3 eval安全替代函数ast.literal_eval
  6. linux gcc 显示/禁用 所有警告
  7. 通过 SHGetSpecialFolderLocation、SHGetPathFromIDList 函数获取常用路径
  8. Linux中的信号处理原理
  9. TCP/IP详解--学习笔记(13)-TCP坚持定时器,TCP保活定时器
  10. tarjan详解(转)