4、压测环境搭建:压测工具选型与目标服务部署
性能压测的结论是否可信,很大程度上取决于环境搭建的规范性与工具选型的匹配度。本章聚焦压测工具选型对比与基于 Spring Boot 的模拟服务部署,为后续 QPS 拐点探测与资源开销分析奠定可复现的实验基础。
4.1 压测工具选型对比
业界主流的压测工具包括 wrk、JMeter 与 Locust,三者在协议支持、并发模型、脚本灵活性与资源开销上存在显著差异。下表从关键维度进行横向对比:
| 对比维度 | wrk | JMeter | Locust |
|---|---|---|---|
| 并发模型 | 基于 epoll/kqueue 事件驱动 + 多线程 | 基于 Java 线程池,每个虚拟用户一个线程 | 基于 gevent 协程 + 多进程 Worker |
| 协议支持 | HTTP/HTTPS 为主,支持 Lua 脚本扩展 | HTTP、JDBC、JMS、FTP、gRPC 等丰富协议 | HTTP/HTTPS 为主,支持 Python 自定义客户端 |
| 脚本语言 | Lua(配置式) | GUI 配置 + BeanShell/JSR223 | Python(纯代码) |
| 单机最大 QPS | 极高(10 万+) | 中等(1~3 万,受线程数限制) | 较高(3~8 万,受协程调度影响) |
| 资源开销 | 极低(CPU 密集,内存占用小) | 较高(每个线程占用栈空间) | 中等(协程切换开销低,但 Python GIL 受限) |
| 分布式支持 | 需自行编排 | 原生支持 Master-Slave | 原生支持 Master-Worker |
| 学习曲线 | 低(命令行 + Lua 脚本) | 中(GUI 操作 + 组件概念) | 中(需 Python 基础) |
选型建议:本课程压测场景以 HTTP 接口为主,重点关注 QPS 拐点与资源开销。推荐以 wrk 作为主压测工具(低开销、高 QPS 上限),以 JMeter 作为辅助验证工具(丰富断言与分布式能力)。Locust 适合需要复杂用户行为模拟的场景,但 Python GIL 可能成为高并发瓶颈。
4.2 压测工具部署与基础用法
4.2.1 wrk 安装与快速验证
wrk 是轻量级 HTTP 压测工具,基于 C 语言开发,依赖 OpenSSL 与 LuaJIT。在 Linux 环境下编译安装:
# 安装依赖(Ubuntu/Debian)
sudo apt-get install build-essential libssl-dev
# 克隆源码并编译
git clone https://github.com/wg/wrk.git
cd wrk
make
# 将 wrk 加入 PATH
sudo cp wrk /usr/local/bin/
# 验证安装
wrk --version
基础压测命令示例:
# 对目标服务进行 30 秒压测,使用 8 个线程、64 个连接
wrk -t8 -c64 -d30s http://localhost:8080/api/demo
4.2.2 JMeter 安装与基础配置
JMeter 基于 Java,需先安装 JDK 11+。下载二进制包后解压即可使用:
# 下载 JMeter 5.6.3
wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.tgz
tar -xzf apache-jmeter-5.6.3.tgz
cd apache-jmeter-5.6.3/bin
# 启动 GUI 模式(用于创建测试计划)
./jmeter
# 启动非 GUI 模式(用于执行压测)
./jmeter -n -t test-plan.jmx -l results.jtl
注意:JMeter 默认使用 Java 线程模拟用户,当并发数超过 500 时建议启用分布式模式,否则线程调度开销会严重拉低 QPS 上限,导致压测结果失真。
4.2.3 Locust 安装与基础用法
Locust 基于 Python,通过 pip 安装:
pip install locust
# 编写压测脚本 locustfile.py
# 启动 Web UI 模式(默认 http://localhost:8089)
locust -f locustfile.py --host=http://localhost:8080
一个简单的 Locust 压测脚本示例:
from locust import HttpUser, task, between
class DemoUser(HttpUser):
wait_time = between(0.5, 1.5)
@task
def demo_endpoint(self):
self.client.get("/api/demo")
4.3 目标服务部署:基于 Spring Boot 的模拟服务
为了精确测量熔断器与限流器的 QPS 拐点,需要构建一个可控制延迟、可注入故障的模拟服务。本课程使用 Spring Boot 3.x + Resilience4j 实现。
4.3.1 项目结构与核心依赖
使用 Maven 构建,核心依赖如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot3</artifactId>
<version>2.2.0</version>
</dependency>
</dependencies>
4.3.2 模拟服务核心接口
提供三个关键端点,分别对应无限制、限流、熔断场景:
@RestController
@RequestMapping("/api")
public class DemoController {
// 无限制端点:用于基线压测
@GetMapping("/baseline")
public String baseline() {
return "OK";
}
// 模拟延迟端点:用于探测延迟对 QPS 拐点的影响
@GetMapping("/delay")
public String delay(@RequestParam(defaultValue = "10") int ms) throws InterruptedException {
Thread.sleep(ms);
return "OK";
}
// 带限流器的端点:用于限流拐点测试
@GetMapping("/rate-limited")
public String rateLimited() {
return "OK";
}
}
4.3.3 限流器配置(Resilience4j RateLimiter)
在 application.yml 中配置限流参数,便于压测时动态调整:
resilience4j.ratelimiter:
instances:
demoRateLimiter:
limit-for-period: 100 # 每周期允许的请求数
limit-refresh-period: 1s # 周期时长
timeout-duration: 0ms # 等待超时,0 表示直接拒绝
4.3.4 服务启动与验证
# 打包并启动
mvn clean package -DskipTests
java -jar target/demo-service-0.0.1-SNAPSHOT.jar
# 验证服务健康状态
curl http://localhost:8080/actuator/health
4.4 压测环境架构总览
下图展示了压测环境的核心组件与数据流关系:
4.5 环境验证清单
在正式压测前,请逐项确认以下环境就绪状态:
- 目标服务可访问:
curl http://localhost:8080/api/baseline返回OK - Actuator 端点开放:
curl http://localhost:8080/actuator/health返回{"status":"UP"} - wrk 可执行:
wrk --version输出版本号 - JMeter 非 GUI 模式可用:
jmeter -v无报错 - Locust 可启动:
locust --version输出版本号 - 限流器配置生效:使用 wrk 以 200 QPS 压测
/api/rate-limited,观察是否有 429 响应
关键指标基线记录:在无任何限流/熔断干预时,使用 wrk 对
/api/baseline 进行 30 秒压测(8 线程、64 连接),记录基线 QPS 与 P99 延迟。该基线将作为后续所有拐点分析的参考零点。