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. 导出压测报告

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

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

相关推荐
ZoeLandia2 小时前
WebSocket | 背景 概念 原理 使用 优缺点及适用场景
网络·websocket·网络协议
Crossoads6 小时前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
诸葛悠闲6 小时前
SOME/IP 协议详解——信息格式
网络协议
gywl9 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
某柚啊9 小时前
Windows开启IIS后依然出现http error 503.the service is unavailable
windows·http
_oP_i10 小时前
HTTP 请求Media typetext/plain application/json text/json区别
网络协议·http·json
yang_shengy10 小时前
【JavaEE】网络(6)
服务器·网络·http·https
OkeyProxy11 小时前
HTTP、HTTPS和SOCKS5代理協議
网络协议·https·云计算·代理服务器·海外ip代理
zquwei11 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
群联云防护小杜12 小时前
如何给负载均衡平台做好安全防御
运维·服务器·网络·网络协议·安全·负载均衡