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,避免乱码
路径 默认路径前缀 留空,由具体请求覆盖
HTTP请求默认值 — 参数继承机制 HTTP请求默认值 HTTP请求 1(登录) HTTP请求 2(查询) HTTP请求 3(下单) 继承规则 子请求未显式设置的字段,自动继承默认值;显式设置的字段覆盖默认值

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 取样器选择决策矩阵

取样器选择决策矩阵 HTTP请求 默认值 HTTP请求 业务请求 JDBC请求 数据库操作 Debug 调试验证 Java请求 自定义逻辑 决策条件:协议支持?性能要求?业务复杂度? 推荐使用场景 • HTTP请求默认值:所有HTTP压测脚本的全局配置 • HTTP请求:RESTful API、Web页面、文件上传下载 • JDBC请求:数据准备、数据验证、混合负载中的数据库操作 • Debug取样器:脚本调试阶段,验证变量和参数 • Java请求:自定义加密、协议扩展、高性能计算

3.7 巡检自动化中的取样器配置清单

在容量压测巡检自动化中,取样器配置需遵循以下规范,确保脚本可重复执行、结果可对比:

  1. HTTP请求默认值:统一配置协议、服务器地址、端口、编码、连接超时(5000ms)、响应超时(10000ms)
  2. HTTP请求:路径使用相对路径,参数全部从CSV数据文件或用户变量读取
  3. JDBC请求:使用Prepared Statement,参数化所有动态值,连接池最大连接数=线程数×1.2
  4. Debug取样器:仅在调试阶段启用,正式巡检脚本中禁用
  5. Java请求:封装为独立JAR包,通过Maven管理依赖,避免类加载冲突
巡检自动化检查点:每次巡检执行前,自动验证取样器配置是否与基线一致,包括超时时间、连接池大小、参数化文件路径等。配置变更需通过审批流程,确保压测结果的可比性。