JMeter 压测Http接口

前言

今天产品在会议上吐槽说我们的服务接口连一点点压力都扛不住,用户稍微用下翻译功能,就报错 429。我一听 429 就觉得不对劲,明明4xx 的错误码应该找前端才对的,怎么能找我这个前端后端运维测试工程师呢?

如果是产品经理有意见,其实我们是可以单独解决的,麻烦就麻烦在当时老板在会上。不用多久我就会降职减薪,辞去码农,不写代码,喜提大礼包,走向人生低谷。血液中尚存的打工人因子立即觉醒了起来,我明白我不能坐以待毙。所以我只能祭出程序员的秘密武器 -- 压测。

俗话说,压测至尊,负载屠龙,号令服务,莫敢不从,压力不出,谁与争锋!所以我们今天得来看看压测是怎么个事?

压测需要什么?

首当其冲的问题是用什么来压测?

那必定是 JMeter,有同学说 Apache benchApipost 这些也行啊。我只能说:啊,对对对,你说的对,那你用吧。

然后是压测什么?

压测产品经理(bushi),应该是压测产品经理说的那个 HTTP 接口。虽然我挺赞成解决不了问题就解决提出问题的人。但先别急,我们得先让老板看看我们的工作能力。到时候压测报告一甩,再狗叫一些高并发,高可用。总之狗叫权归我之时。就是我升级加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰的时候了。

最后最重要的是什么?

当然是压测配置啊,压测时候你怼个1c1g的机器。压出来报告一甩,你还没狗叫完,老板就立即杀狗了。

这个程序员不行啊,搞个接口 qps 才到 200,这怎么支撑我的宏图大业?我将来可是要和苹果掰掰手腕的,指不定到时候还要收购他呢?这程序员水平不够啊,我们的同事都是国际一线的水平才能和苹果干呀,还好产品及时发现了。你最好主动离职,公司不追究你的责任。

所以压测最重要的是什么不用我说了吧?

安装JMeter

安装JMeter前需要先安装JDK,JDK 安装完成的标准就是运行这条命令能打印出Java版本号出来

powershell 复制代码
PS C:\Users\Administrator> java --version
openjdk 21.0.4 2024-07-16 LTS
OpenJDK Runtime Environment Temurin-21.0.4+7 (build 21.0.4+7-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.4+7 (build 21.0.4+7-LTS, mixed mode,sharing)

到这个下载页面 Apache JMeter - Download Apache JMeter 选个包下下来,一般window就选择zip,其他系统选择tgz,当然你要倒反天罡也随你:

下载完之后解压,执行 jmeter.bat,它会打开命令行和一个图形应用

提供一个HTTP接口用于压测

这是个demo,如果你想直接对线上进行压测。我是十分鼓励的,不止能得到真实的数据,还能测试服务宕机后还能不能高可用。

java 复制代码
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestMethod;  
import org.springframework.web.bind.annotation.RestController;  
  
import java.util.concurrent.atomic.AtomicInteger;  
  
@RestController  
public class IndexController {  
  
    private final AtomicInteger counter = new AtomicInteger(0);  
    private long lastResetTime = System.currentTimeMillis();  
    private static final int LIMIT = 10;  
    private static final long ONE_SECOND = 1000;  
  
    @RequestMapping(value = "/test", method = RequestMethod.GET)  
    public String test() {  
        // 计数器,看不懂就算了。冤有头债有主你应该找GPT
        long currentTime = System.currentTimeMillis();  
        if (currentTime - lastResetTime >= ONE_SECOND) {  
            counter.set(0);  
            lastResetTime = currentTime;  
        }  
        int currentCount = counter.incrementAndGet();  
  
        String response = currentCount <= LIMIT 
        ? "我是接口,我要打"+LIMIT+"个" 
        : "你这个小伙子,不讲武德,给我蹭了一下";  
        
        System.out.println(currentCount + " " + response);  
        return response;  
    }  
}

curl 测试一下子,出现 我是接口,我要打10个 就是接口O了

shell 复制代码
$ curl localhost:8080/test
我是接口,我要打10个

接下来我们来压一下

配置 JMeter 压测 HTTP 接口

  1. 先创建测试计划
  1. 创建线程组
    线程组简单理解就是【线程】【组合】起来,说白了就是多个线程。因为 JMeter 是 Java 实现的,Java 要实现并发就是用的线程。
  1. 配置线程组参数

这个配置的意思很明显了,1s内30个人一起搞一个接口,搞3轮。如果把 Infinite 勾上,就是一直搞,直到接口顶不住。(这个叫接口的人真的太惨了)

  1. 添加HTTP接口配置

添加一个HTTP 请求

写上接口参数

如果需要添加请求头右键然后选这里再选这里最后选那里就可以了

  1. 查看结果

View Results Tree 是看每一次请求信息的

Summary Report 是看总体请求信息的,一般压测也是看这个

两个监听器都添加上

  1. 开始压测

我们要讲武德,上10个试试看

看起来打10个少了。我们不讲武德了,直接上100个

100个只是蹭了一下,接口还是生龙活虎的,我们彻底不讲武德了,上10000个

10000 太猛了,给接口干爆了。看吞吐量差不多可以处理880个,武林要以和为贵。

  1. 导出压测报告

先配置上中间结果存储的位置,配置好了之后再次运行,结果会被写入到文件中(不用打开看了,里面是一堆看不懂的记录,接着往下,把这些记录可视化)

最后把这份报告甩到群里。然后狗叫一声:我的接口支持高可用,高并发下接口表现优异,具体可查看压测报告。有了你这个报告,连老板都舍不得给你发大礼包了。

相关推荐
邪恶的贝利亚6 小时前
实现p2p的webrtc-srs版本
网络协议·webrtc·p2p
Lightning-py7 小时前
Linux命令cat /proc/net/snmp查看网络协议层面统计信息
网络·网络协议·tcp/ip
2501_915106327 小时前
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
websocket·网络协议·tcp/ip·http·网络安全·https·udp
还是鼠鼠11 小时前
HTTP 请求协议简单介绍
java·开发语言·网络·网络协议·http
糯米导航11 小时前
ava多线程实现HTTP断点续传:原理、设计与代码实现
windows·http·iphone
一杯凉白开13 小时前
硬件工程师口中的取低八位,中八位,高八位是什么意思?
android·网络协议
轨迹H14 小时前
【春秋云镜】CVE-2023-2130漏洞复现exp
网络协议·网络安全·渗透测试·ctf·cve
chxii15 小时前
1.6 http模块nodejs 对比 go
http·node.js
等风来不如迎风去15 小时前
【samba】umount:**** target is busy. ubuntu24.04 卸载挂载点
网络协议·远程桌面·nomachine
菜鸟康17 小时前
C++实现分布式网络通信框架RPC(2)——rpc发布端
分布式·网络协议·rpc