四种方式 模拟并发,你的API接口扛得住不?
来源: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
输入信息
以后再进行测试就能这样搞简写了
知道基本使用之后,我们来看一下如何模拟并发测试
填写基本信息后,创建
这个时候会创建出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不是线程安全的,且没有作防护措施,结果是错的
往期推荐前后端分离架构,超全面详解~
支付宝项目组使用的支付加密规则梳理,写的太好了!
Springboot+Redis+Interceptor+自定义annotation实现接口自动幂等
Docker 图形化工具:Portainer,推荐给你!
如何保障消息100%投递成功、消息幂等性?
SpringBoot2+Vue+Redis的企业级聚合支付系统,可二次开发接私活!
目前我见过最好的跨域解决方案!
12 个适合做外包项目的开源后台管理系统
Elasticsearch 快速检索的秘诀
回复【干货】获取精选干货视频教程回复【加群】加入疑难问题攻坚交流群
回复【mat】获取内存溢出问题分析详细文档教程
回复【赚钱】用java写一个能赚钱的微信机器人
回复【副业】获取程序员副业攻略一份好文请点赞+分享
四种方式 模拟并发,你的API接口扛得住不?相关推荐
- 【Java并发编程】并发模拟的四种方式
文章目录 并发模拟的四种方式 一.Postman 二.Apache Bench(AB) 三.并发模拟工具JMeter 四.代码模拟 并发模拟的四种方式 一.Postman Postman是一个款htt ...
- java并发编程基础系列(五): 创建线程的四种方式
线程的创建一共有四种方式: 继承于Thread类,重写run()方法: 实现Runable接口,实现里面的run()方法: 使用 FutureTask 实现有返回结果的线程 使用ExecutorSer ...
- 创建现成的四种方式 多线程与并发的基本概念:
多线程与并发的基本概念: 多线程 一:什么是线程? 进程:进行中应用程序 线程:是进程组成者,一个进程中可能包含多个线程 cpu执行程序的最小单位是线程,cpu在同一时间内只能执行一个线程,在多个线程 ...
- Java 并发 多线程:创建线程的四种方式
Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...
- Linux C++多线程同步的四种方式
目录 一.互斥锁 二.条件变量 三.读写锁 原文链接:Linux C++多线程同步的四种方式(非常详细)_Y先森0.0-CSDN博客 背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通 ...
- photon四种同步方式_【Linux】多线程同步的四种方式
背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include #include#include#include#include#include us ...
- 在 C# 中生成代码的四种方式——包括.NET 5中的Source Generators
Microsoft在最新的C#版本中引入了Source Generator.这是一项新功能,可以让我们在代码编译时生成源代码.在本文中,我将介绍四种C#中的代码生成方式,以简化我们的日常工作.然后,您 ...
- JDBC 连接数据库的四种方式
JDBC 连接数据库的四种方式 每博一文案 师傅说,人这一辈子总有许多遗憾,许多无可奈何. 其实有些事情不用太过执着,放下牵绊你的生活无畏执念,你会收获一个更为广阔的天地. 想开,看开,放开这六个字, ...
- Java 实现多线程的四种方式 超详细
Java 实现多线程的四种方式 文章目录 Java 实现多线程的四种方式 一.继承 Thread 类 二.实现 Runnable 接口 三.实现 Callable 接口 四.线程池 1,Executo ...
最新文章
- C#中用schema验证xml的合法性
- oracle创建函数语句,Oracle 创建函数与存储过程语句积累
- 小波变换工程实现原理总结
- 装 linux后 win7消失了,win7系统重装后ubuntu启动消失不见的解决方法
- MS_DOS头部 IMAGE_DOS_HEADER
- MyEclipse使用总结——MyEclipse文件查找技巧 ctrl+shift+R ctrl+H
- ideal2018提示内存不足_基于IDEA2018卡死不动的解决方式(好用)
- 计算机课计划,计算机教学计划汇总
- 我花了一年时间来学机器学习
- leetcode Add Digits
- 近期关于感知器MLP的最新研究
- Web开发:布局视口、视觉视口、理想视口
- 用安卓手机看epub小说,哪些阅读器APP更好用?
- 信息安全技术 实验3 木马及远程控制技术
- angular-6大主流前端框架(一)
- 南卫理公会大学计算机科学,南卫理公会大学计算机科学与工程硕士
- 用对这30种秘密武器, 你也能成为区块链高手!
- 可解释知识追踪(整理更新)
- 剑指offer-二叉树(python)
- Ae:形状图层的内容添加