3. 取样器详解:HTTP请求默认值、HTTP请求、JDBC请求、Debug取样器、Java请求
取样器(Sampler)是JMeter脚本的核心执行单元,负责向目标系统发送请求并收集响应。本章深入剖析五种最常用的取样器:HTTP请求默认值、HTTP请求、JDBC请求、Debug取样器和Java请求,涵盖配置要点、参数化策略及性能影响。
3.1 HTTP请求默认值
HTTP请求默认值(HTTP Request Defaults)是一个配置元件,用于为同一线程组内的所有HTTP请求取样器提供共享的默认参数。它极大减少了重复配置,提升脚本可维护性。
最佳实践:在容量压测中,始终将协议、服务器地址、端口、编码等全局参数放在HTTP请求默认值中,单个HTTP请求只保留路径和业务参数。
核心配置字段
| 字段 | 说明 | 压测建议 |
|---|---|---|
| 协议 | http 或 https | 固定值,不参数化 |
| 服务器名称或IP | 目标主机地址 | 使用变量 ${target_host} 实现环境切换 |
| 端口号 | 服务端口 | 80/443 可省略,非标端口必须填写 |
| 内容编码 | UTF-8 等 | 统一设置为 UTF-8,避免乱码 |
| 路径 | 默认路径前缀 | 留空,由具体请求覆盖 |
3.2 HTTP请求
HTTP请求取样器是压测中最核心的元件,支持GET/POST/PUT/DELETE等所有HTTP方法。在容量压测中,其配置直接影响TPS和资源消耗。
关键配置项与性能影响
| 配置项 | 压测场景建议 | 性能影响 |
|---|---|---|
| 方法 | 按业务接口选择 | GET 比 POST 略快(无请求体解析) |
| 参数/消息体数据 | 使用CSV数据文件参数化 | 大请求体增加网络传输时间 |
| 文件上传 | 避免在压测中使用大文件 | 显著增加内存和带宽消耗 |
| 重定向跟随 | 关闭(设为false) | 减少额外请求,避免TPS虚高 |
| Keep-Alive | 保持默认true | 复用连接,大幅提升吞吐量 |
注意:在巡检自动化中,HTTP请求的超时设置(Connect Timeout / Response Timeout)必须显式配置,防止线程因等待而永久阻塞,导致压测中断。
参数化示例
// 使用CSV数据文件中的变量
路径:/api/user/${user_id}
参数:name=${user_name}&age=${user_age}
消息体(JSON):{"id":"${user_id}", "action":"${action_type}"}
3.3 JDBC请求
JDBC请求取样器用于直接对数据库执行SQL语句,在容量压测中常用于数据准备、数据验证和混合负载场景。它需要配合JDBC连接配置元件使用。
SQL语句类型
| 类型 | 说明 | 返回值 |
|---|---|---|
| Select Statement | 单条查询 | ResultSet |
| Update Statement | INSERT/UPDATE/DELETE | 影响行数 |
| Callable Statement | 存储过程调用 | 根据存储过程定义 |
| Prepared Select/Update | 预编译SQL,防SQL注入 | 同上,支持参数化 |
巡检自动化要点:JDBC请求的连接池配置(最大连接数、超时时间)必须与线程数匹配。例如,100个并发线程,连接池最大连接数建议设置为100~150,避免连接等待导致线程阻塞。
参数化SQL示例
-- Prepared Select 示例
SELECT * FROM orders WHERE user_id = ? AND status = ?
-- 参数值:${user_id}, ${order_status}
-- Update 示例
UPDATE inventory SET stock = stock - ? WHERE product_id = ?
-- 参数值:${quantity}, ${product_id}
3.4 Debug取样器
Debug取样器是调试阶段的利器,用于输出JMeter变量、属性、系统环境等信息到查看结果树。它不产生实际负载,仅用于验证脚本逻辑。
输出选项
- JMeter Properties:输出JMeter系统属性
- JMeter Variables:输出当前线程的所有用户变量
- System Properties:输出Java系统属性
使用技巧:在脚本调试阶段,将Debug取样器放在关键节点(如登录后、参数提取后),快速验证变量值是否正确。正式压测前务必禁用或删除Debug取样器,避免产生大量日志影响性能。
典型输出示例
JMeterVariables:
user_id=10086
=eyJhbGciOiJIUzI1NiJ9...
order_count=5
random_phone=13800138000
JMeterProperties:
jmeter.version=5.6.3
file.encoding=UTF-8
3.5 Java请求
Java请求取样器允许用户通过自定义Java类实现复杂的业务逻辑,适用于协议不支持或需要高性能计算的场景。它要求实现org.apache.jmeter.protocol.java.sampler.JavaSamplerClient接口。
核心接口方法
| 方法 | 作用 | 调用时机 |
|---|---|---|
| setupTest | 初始化资源(如连接池) | 测试开始前,每个线程执行一次 |
| runTest | 执行核心业务逻辑 | 每次迭代执行 |
| teardownTest | 释放资源 | 测试结束后,每个线程执行一次 |
| getDefaultParameters | 定义可在JMeter界面配置的参数 | 初始化时 |
自定义Java请求示例
public class CustomSampler extends AbstractJavaSamplerClient {
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("api_url", "http://default-api.com");
params.addArgument("timeout", "5000");
return params;
}
@Override
public SampleResult runTest(JavaSamplerContext context) {
SampleResult result = new SampleResult();
result.sampleStart();
try {
String url = context.getParameter("api_url");
int timeout = Integer.parseInt(context.getParameter("timeout"));
// 自定义业务逻辑
String response = callExternalService(url, timeout);
result.setSuccessful(true);
result.setResponseData(response, "UTF-8");
} catch (Exception e) {
result.setSuccessful(false);
result.setResponseMessage(e.getMessage());
} finally {
result.sampleEnd();
}
return result;
}
}
性能警告:Java请求中的业务逻辑应尽量轻量,避免在
runTest中执行耗时操作(如大量IO、复杂计算)。如果必须执行,考虑使用异步非阻塞模式,防止线程阻塞影响整体TPS。
3.6 取样器选择决策矩阵
3.7 巡检自动化中的取样器配置清单
在容量压测巡检自动化中,取样器配置需遵循以下规范,确保脚本可重复执行、结果可对比:
- HTTP请求默认值:统一配置协议、服务器地址、端口、编码、连接超时(5000ms)、响应超时(10000ms)
- HTTP请求:路径使用相对路径,参数全部从CSV数据文件或用户变量读取
- JDBC请求:使用Prepared Statement,参数化所有动态值,连接池最大连接数=线程数×1.2
- Debug取样器:仅在调试阶段启用,正式巡检脚本中禁用
- Java请求:封装为独立JAR包,通过Maven管理依赖,避免类加载冲突
巡检自动化检查点:每次巡检执行前,自动验证取样器配置是否与基线一致,包括超时时间、连接池大小、参数化文件路径等。配置变更需通过审批流程,确保压测结果的可比性。