前言
今天产品在会议上吐槽说我们的服务接口连一点点压力都扛不住,用户稍微用下翻译功能,就报错 429。我一听 429 就觉得不对劲,明明4xx 的错误码应该找前端才对的,怎么能找我这个前端后端运维测试工程师呢?
如果是产品经理有意见,其实我们是可以单独解决的,麻烦就麻烦在当时老板在会上。不用多久我就会降职减薪,辞去码农,不写代码,喜提大礼包,走向人生低谷。血液中尚存的打工人因子立即觉醒了起来,我明白我不能坐以待毙。所以我只能祭出程序员的秘密武器 -- 压测。
俗话说,压测至尊,负载屠龙,号令服务,莫敢不从,压力不出,谁与争锋!所以我们今天得来看看压测是怎么个事?
压测需要什么?
首当其冲的问题是用什么来压测?
那必定是 JMeter
,有同学说 Apache bench
和 Apipost
这些也行啊。我只能说:啊,对对对,你说的对,那你用吧。
然后是压测什么?
压测产品经理(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,当然你要倒反天罡也随你:
- zip包:https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.zip
- tgz包:https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.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 接口
- 先创建测试计划
- 创建线程组
线程组简单理解就是【线程】【组合】起来,说白了就是多个线程。因为 JMeter 是 Java 实现的,Java 要实现并发就是用的线程。
- 配置线程组参数
这个配置的意思很明显了,1s内30个人一起搞一个接口,搞3轮。如果把 Infinite
勾上,就是一直搞,直到接口顶不住。(这个叫接口的人真的太惨了)
- 添加HTTP接口配置
添加一个HTTP 请求
写上接口参数
如果需要添加请求头右键然后选这里再选这里最后选那里就可以了
- 查看结果
View Results Tree 是看每一次请求信息的
Summary Report 是看总体请求信息的,一般压测也是看这个
两个监听器都添加上
- 开始压测
我们要讲武德,上10个试试看
看起来打10个少了。我们不讲武德了,直接上100个
100个只是蹭了一下,接口还是生龙活虎的,我们彻底不讲武德了,上10000个
10000 太猛了,给接口干爆了。看吞吐量差不多可以处理880个,武林要以和为贵。
- 导出压测报告
先配置上中间结果存储的位置,配置好了之后再次运行,结果会被写入到文件中(不用打开看了,里面是一堆看不懂的记录,接着往下,把这些记录可视化)
最后把这份报告甩到群里。然后狗叫一声:我的接口支持高可用,高并发下接口表现优异,具体可查看压测报告。有了你这个报告,连老板都舍不得给你发大礼包了。