JUC高并发编程(三)之模拟接口压力测试
1.背景
接口压力测试是产品上线前很重要的一项测试,我们可以使用很多开源工具测试,
当然我们也可以简单的写一个多线程并发测试案例
2.代码
controller接口
/**
* 查询订单
*
* @return
*/
@RequestMapping("/api/order")
public Object product(Integer id) {
// 为了便于分析,设置一个线程号
Thread.currentThread().setName("thread-" + id);
log.info("查询订单-" + id);
// 模拟随机耗时
ThreadUtil.sleepRandom();
return "订单编号-" + id;
}
3.测试
测试代码
package com.ldp.jucproject.controller; import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.ldp.jucproject.utils.ThreadUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test; import java.util.concurrent.CountDownLatch; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 11/06 10:18
* @description
*/
@Slf4j
class OrderControllerTest {
/**
* 简单测试
*/
@Test
void product01() {
Integer id = 1;
String url = "http://localhost:8001/api/order?id=" + id;
HttpRequest request = HttpUtil.createGet(url);
String response = request.execute().body();
System.out.println("response=" + response);
} /**
* 模拟多个请求
*/
@Test
void product02() {
for (int i = 1; i <= 100; i++) {
Integer id = i;
String url = "http://localhost:8001/api/order?id=" + id;
HttpRequest request = HttpUtil.createGet(url);
String response = request.execute().body();
System.out.println("response=" + response);
}
} /**
* 模拟多线程请求
*/
@Test
void product03() throws InterruptedException {
for (int i = 1; i <= 100; i++) {
ThreadUtil.sleepRandom();
Integer id = i;
new Thread(() -> {
String url = "http://localhost:8001/api/order?id=" + id;
System.out.println("待查询订单号=" + id);
HttpRequest request = HttpUtil.createGet(url);
String response = request.execute().body();
System.out.println("response=" + response);
}).start();
}
// 避免线程终止
Thread.sleep(20 * 1000);
} /**
* 模拟多线程并发请求
*/
@Test
void product04() throws Exception {
// 并发请求数
int num = 100;
CountDownLatch countDownLatch = new CountDownLatch(num);
for (int i = 1; i <= num; i++) {
ThreadUtil.sleepRandom();
// 计数器减一
countDownLatch.countDown();
Integer id = i;
new Thread(() -> {
try {
String url = "http://localhost:8001/api/order?id=" + id;
// 等待计数器归零,归零前都是处于阻塞状态
System.out.println("待查询订单号=" + id);
countDownLatch.await();
HttpRequest request = HttpUtil.createGet(url);
String response = request.execute().body();
System.out.println("response=" + response);
} catch (Exception e) {
log.error("模拟并发出错:{}", e);
}
}).start();
}
// 避免线程终止
Thread.sleep(60 * 1000);
}
}
4.完美!
JUC高并发编程(三)之模拟接口压力测试的更多相关文章
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- java线程高并发编程
java线程具体解释及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了.看看百度百科对他的评价,一点也不为过: 假设IT的历史 ...
- 聊聊高并发(三十四)Java内存模型那些事(二)理解CPU快速缓存的工作原理
在上一篇聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了Java内存模型是一个语言级别的内存模型抽象.它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的 ...
- 多线程高并发编程(3) -- ReentrantLock源码分析AQS
背景: AbstractQueuedSynchronizer(AQS) public abstract class AbstractQueuedSynchronizer extends Abstrac ...
- 关于Java高并发编程你需要知道的“升段攻略”
关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows ...
- Java高并发编程基础三大利器之CountDownLatch
引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...
- 《深入理解高并发编程:JDK核心技术》-冰河新书上市
大家好,我是冰河~~ 废话说多了没用,并发编程技术一直是初级程序员进阶高级工程师的前提条件,也是成为大厂程序员的必备技能,更是突破自身技术瓶颈的必经之路. 2022年6月我出版了"冰河技术丛 ...
- Java并发编程三个性质:原子性、可见性、有序性
并发编程 并发程序要正确地执行,必须要保证其具备原子性.可见性以及有序性:只要有一个没有被保证,就有可能会导致程序运行不正确 线程不安全在编译.测试甚至上线使用时,并不一定能发现,因为受到当时的 ...
- java高并发编程(一)
读马士兵java高并发编程,引用他的代码,做个记录. 一.分析下面程序输出: /** * 分析一下这个程序的输出 * @author mashibing */ package yxxy.c_005; ...
随机推荐
- rust程序设计(6)枚举与模式匹配
rust中的枚举有什么用?枚举可以嵌入类型的好处是什么 你可以在同一个枚举中既有单个值,也有元组或结构体. 枚举的每个变体可以拥有不同数量和类型的关联数据. 这增加了类型的灵活性和表达力,使你能够更精 ...
- MySql 增、删、改、查数据库
前言 之前几天写了MySql 的GROUP BY 语句和 JOIN 语句,今天补一下创建数据库.表的语句.首先假设已经暗转好MySQL 数据库,然后创建数据库.表. 创建数据库 create data ...
- mysql 8.0 客户端
1.mysql 8.0 command line client 2.mysql workbench
- Docker PHP如何启用MySQL扩展
我下载的镜像是PHP7版本:docker pull php:7.4.30-fpm,容器起名为php7 PHP镜像官方提供了帮助文档,其中提到了相关的命令,这里推荐一篇博客,该博客对于扩展的几个相关命令 ...
- FinalReference 如何使 GC 过程变得拖拖拉拉
本文基于 OpenJDK17 进行讨论,垃圾回收器为 ZGC. 提示: 为了方便大家索引,特将在上篇文章 <以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的> 中讨 ...
- 同时开启firewall和iptables
使用向导 With the iptables service, every single change means flushing all the old rules and reading all ...
- 上交大开源镜像站下架 Docker Hub 镜像
在现代软件开发中,Docker镜像已经成为不可或缺的工具.然而,最近频频出现的Docker镜像下架事件让许多开发者措手不及.突然失去依赖的镜像,不仅打乱了项目进程,还引发了许多不便.那么,面对Do ...
- Coap 协议学习:具体协议介绍具体
协议框架 CoAP默认运行在UDP上,但它也支持运行在SMS,TCP等数据传输层上.本文主要是基于UDP上的CoAP协议介绍 1.消息模型 Messages COAP协议通信是通过在UDP上传输消息类 ...
- 【ClickHouse】0:clickhouse学习2之数据类型
一 :如何查看clickhouse具体支持哪些数据类型? 1:查看官方文档:https://clickhouse.tech/docs/en/sql-reference/data-types/ 2:查看 ...
- 使用VS Code 学习算法(第四版)
最近在学习算法(第四版),书中一直在使用命令行来执行Java程序,而使用Eclipse时,很难使用命令行,或者说我根本就不会用,于是就想研究一下使用VS Code来编写代码,使用命令行来执行程序.看了 ...