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 压测环境架构总览

下图展示了压测环境的核心组件与数据流关系:

压测环境架构图 压测环境架构总览 wrk(主压测工具) JMeter(辅助验证) Locust(行为模拟) Spring Boot 模拟服务 端口 8080 | Actuator 监控 | Resilience4j 限流/熔断 Prometheus + Grafana JMH 微基准测试 日志采集 (ELK) 说明:压测工具并发请求 → Spring Boot 服务 → 监控系统采集 QPS、延迟、CPU/内存指标

4.5 环境验证清单

在正式压测前,请逐项确认以下环境就绪状态:

  1. 目标服务可访问:curl http://localhost:8080/api/baseline 返回 OK
  2. Actuator 端点开放:curl http://localhost:8080/actuator/health 返回 {"status":"UP"}
  3. wrk 可执行:wrk --version 输出版本号
  4. JMeter 非 GUI 模式可用:jmeter -v 无报错
  5. Locust 可启动:locust --version 输出版本号
  6. 限流器配置生效:使用 wrk 以 200 QPS 压测 /api/rate-limited,观察是否有 429 响应
关键指标基线记录:在无任何限流/熔断干预时,使用 wrk 对 /api/baseline 进行 30 秒压测(8 线程、64 连接),记录基线 QPS 与 P99 延迟。该基线将作为后续所有拐点分析的参考零点。