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

标签: dev | 发表时间:2022-12-05 00:00 | 作者:
出处:https://itindex.net/relian

长按 关注 此公众号,技术干货,及时送达!


一、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 是经常使用的地址+端口号,可以设置为环境

推荐下自己做的 Spring Boot 的实战项目:

https://gitee.com/yoodb/jing-xuan

点击右上角的设置图标

选择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是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。

推荐下自己做的 Spring Cloud 的实战项目:

https://gitee.com/yoodb/jingxuan-springcloud

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那样一直减到底。另外,推荐公众  号Java精选,回复java面试,获取面试资料,支持在线刷题。

它也被更多地用来限制流量,类似阀门的 功能。如果限定某些资源最多有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不是线程安全的,且没有做防护措施,结果是错的

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

来源:blog.csdn.net/qq_42322103/article/details/102736170
版权声明:此内容来源网络,版权归原作者所有。我们转载的内容,都会注明来源,除非无法确认。若有侵权,烦请告知,我们会立即删除并表示歉意。谢谢!
PS:文章若对您有用,请帮助 点赞、在看、转发吧!- END -点击卡片关注我们,更多技术干货,及时为您送达!

往期推荐



Spring Framework 6.0 正式GA,新一代框架的开始
网关系统就该这么设计(万能通用),稳的一批!
被裁员!从无赔偿拿到N+1的故事
如何设计一个短链接系统?



相关 [并发 模拟 工具] 推荐:

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

- - IT瘾-dev
长按 关注 此公众号,技术干货,及时送达. Postman是一个款http请求模拟工具. 首先演示一下postman最基本的使用. 创建一个Springboot项目,测试的代码如下:. 为了便于操作,一般会将. http://127.0.0.1:8080 是经常使用的地址+端口号,可以设置为环境. 推荐下自己做的 Spring Boot 的实战项目:.

Java并发工具类CyclicBarrier

- - CSDN博客编程语言推荐文章
CyclicBarrier同步屏障. java并发工具类中有一个叫做CyclicBarrier的类,与CountDownLatch类似,都可以实现线程间的同步,但是差别是CyclicBarrier是可重置的同步屏障. 想象一个场景,有N个人不同时间走到一扇门,因为门需要N个人合力才能推开,所以人不足N个时,只能阻塞在此,等到N个人都到了之后,可以推开门,继续进行之前的工作.

如何模拟超过 5 万用户的并发访问?

- -
来源:http://t.cn/ES7KBkW. 本文将从负载测试的角度,描述了做一次流畅的5万用户并发测试需要做的事情.. 你可以在本文的结尾部分看到讨论的记录.. 使用JMeter进行本地测试. BlazeMeter沙箱测试. 使用一个控制台和一个引擎设置Users-per-Engine的数量. 设置并测试你的集合 (1个控制台和10-14 引擎).

XMPP、HTTP 模拟压力测试工具 Tsung 教程

- - CSDN博客推荐文章
由于需要erlang支持,那么下载erlang-R14B04. 使用该脚本测试的时候,要禁用XMPP服务器的auth验证模块,不然账号密码不对,登陆不进去. 单个IP的端口65535的问题导致单个机器模拟的连接数有限,这个问题我没解决,只能通过使用很多机器都开这个服务来解决. 作者:smm11230704 发表于2012-4-17 3:21:36 原文链接.

Java:线程并发工具类

- - CSDN博客编程语言推荐文章
一、CountDownLatch . 在实际多线程并发开发过程中,我们会碰见很多等待子线程完毕后在继续执行的情况,(如多个子线程下载文件,所有子线程执行完毕后再重命名为文件名). CountDownLatch的构造函数接受一个int类型的参数作为计数器,调用countDwon()方法,计数器减1,await()方法阻塞当前线程,直到计数器变为0;、 .

Aura – 自然音效模拟软件 | 小众软件 > 媒体工具

- yuan - 小众软件
Aura 是一款自然音效模拟软件,让你在自然的声音中工作、学习、打游戏 @Appinn. 感谢 realnabarl 的再次推荐. Aura 大概就是场景,氛围的意思. Aura 来自俄罗斯,不过人气不高,俄罗斯本土知道的人也不算多. Aura 用来模拟自然界中森林的声效,分为两套,一套上白昼时的,一套是夜晚的.

[原]Java模拟新浪和腾迅自动登录并发送微博(2013年3月更新可用)

- - 上善若水 厚德载物
  只是登录无需申请新浪和腾迅的开发者账号,如果需要发送微博功能,需要申请一个新浪和腾迅的开发者账号,并添加一个测试应用.  过程请参考官方帮助文档,申请地址:新浪:http://open.weibo.com    腾迅:http://dev.t.qq.com/. 我们需要的是App Key和App Secre及redirect_URI,源代码中已经包含了我申请的测试key,但由于限制直接用我的key你们的账号是无法登录成功的.

Workor(蜗壳)推出轻量级在线视频沟通工具,想为远程工作团队模拟真实办公环境并提高沟通效率

- - 36氪 | 关注互联网创业
对远程办公团队而言,沟通和协作不像是直接走到桌边开聊那样方便,对于沟通和协作工具的要求可能是越快唤起越好. 最近上线的 Workor(蜗壳)就是一款轻量级的在线视频沟通协作工具,想为远程工作团队模拟真实办公环境并提高沟通效率. Workor是免安装的在线视频工具,目前视频通话仅支持Chrome浏览器.

JavaScript PC 模拟器

- kira - LinuxTOY
很难想象竟然用了这么久,Linux 才可以运行在浏览器的 JavaScript 引擎里面,要知道2008 年就可以在土豆上运行了~. 作者 Fabrice Bellard 使用 JavaScript 编写了一个简单的 PC 模拟器,包含32位 x86 兼容 CPU、8259 可编程中断控制器、8254 可编程中断计时器.

JavaScript Gameboy Color模拟器

- ashuai - Solidot
程序员Grant Galitz发布了一个用HTML5/JavaScript编写的GameBoy Color模拟器(源代码),可以运行储存在本地的ROM镜像,游戏运行速度正常. 也有其他开发者用JavaScript编写出了启动Linux的X86模拟器.