电商平台在促销活动前必须对核心接口进行充分压测,尤其是秒杀这类高并发场景。以黑马点评项目为例,我们需要模拟1000个真实用户同时抢购限量100件商品的极端情况。传统手动造数据的方式效率低下,而直接使用重复Token会导致测试失真。
我推荐的技术组合方案是:
这套方案的优点在于:
首先确保数据库中有足够测试用户,推荐使用批量插入SQL:
sql复制INSERT INTO tb_user (phone, password)
VALUES
('13800000001', 'e10adc3949ba59abbe56e057f20f883e'),
('13800000002', 'e10adc3949ba59abbe56e057f20f883e')
-- 继续补充直到1000条...
密码字段存储的是MD5加密后的"123456",方便统一测试。实际项目中建议使用更复杂的密码策略。
核心代码结构如下:
java复制@SpringBootTest
public class TokenGenerator {
@Autowired
private IUserService userService;
@Test
void generateTokens() throws Exception {
List<User> users = userService.list();
BufferedWriter writer = new BufferedWriter(new FileWriter("tokens.txt"));
for(User user : users) {
String token = loginAndGetToken(user.getPhone());
writer.write(token);
writer.newLine();
}
writer.close();
}
private String loginAndGetToken(String phone) {
// 构建JSON请求体
JSONObject json = new JSONObject();
json.put("phone", phone);
// 发送HTTP请求
HttpPost post = new HttpPost("http://localhost:8080/api/user/login");
post.setEntity(new StringEntity(json.toString(), ContentType.APPLICATION_JSON));
// 处理响应
HttpResponse response = httpClient.execute(post);
String responseBody = EntityUtils.toString(response.getEntity());
return new JSONObject(responseBody).getString("data");
}
}
注意几个关键点:
Content-Type: application/json在实际项目中,我遇到过这些坑:
优化后的核心代码片段:
java复制// 使用连接池
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(200); // 最大连接数
cm.setDefaultMaxPerRoute(20); // 每个路由最大连接数
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
// 带重试的请求执行
HttpResponse response = Retry.execute(3, () -> httpClient.execute(post));
创建线程组:
添加CSV Data Set Config:
秒杀接口的关键配置:
plaintext复制HTTP Request:
- Method: POST
- Path: /api/seckill/order
- Body Data: {"goodsId": 1} # 测试商品ID
HTTP Header Manager:
- Authorization: ${token}
- Content-Type: application/json
必备监听器:
建议的响应断言设置:
典型聚合报告包含:
健康系统的表现:
根据我的经验,这些问题最常见:
推荐添加的监控项:
当单机JMeter无法满足压力时:
properties复制# Slave节点配置
server.rmi.ssl.disable=true
server_port=1099
# Master节点配置
remote_hosts=192.168.1.101:1099,192.168.1.102:1099
更真实的压测需要:
实现示例:
plaintext复制JMeter变量表达式:
- ${__Random(1,100)} # 随机商品ID
- ${__RandomString(10)} # 随机字符串
- ${__timeShift(yyyy-MM-dd HH:mm:ss,,,)} # 时间戳
将压测纳入CI/CD流程:
典型Jenkinsfile片段:
groovy复制stage('Performance Test') {
steps {
bat 'jmeter -n -t test.jmx -l result.jtl'
perfReport sourceDataFiles: 'result.jtl'
}
}
在实际项目中使用这套方案后,我们成功将秒杀接口的吞吐量从500TPS提升到3000TPS。关键点在于持续优化数据库索引和引入Redis集群分担压力。建议每次压测后保留完整测试报告,方便后续做对比分析。