一、环境准备
安装 Java
JMeter 依赖 Java 环境,确保已安装 JDK 8+。
验证安装:终端输入
java -version
,显示版本信息即可。
下载 JMeter
官网下载最新版:Apache JMeter
解压到任意目录(如
/opt/jmeter
)。
安装插件管理器
下载
jmeter-plugins-manager-1.10.jar
,放入JMETER_HOME/lib/ext
目录。重启 JMeter,菜单栏 Options → Plugins Manager 可见。
安装 WebSocket 插件
打开插件管理器,搜索 WebSocket,安装以下插件:
WebSocket Samplers by Peter Doornbosch
Custom Thread Groups(可选,用于复杂压测模型)
Protocol Buffers (proto) 支持
下载
protobuf-java-x.x.x.jar
(版本需与服务器匹配),放入JMETER_HOME/lib
。在测试计划中通过
JSR223 Sampler
或 BeanShell 调用 proto 序列化/反序列化。
二、压测实例:WebSocket + Proto 协议
场景描述
模拟 100 用户并发连接 WebSocket 服务器(
ws://your-server:8080/chat
)。每个用户发送 proto 编码的消息(如
ChatMessage.proto
),并接收响应。
步骤 1:定义 Proto 文件
// ChatMessage.proto
syntax = "proto3";
message ChatMessage {
string user_id = 1;
string content = 2;
int64 timestamp = 3;
}
步骤 2:生成 Java 类
protoc --java_out=./src ChatMessage.proto
将生成的
ChatMessage.java
编译为.class
文件,打包成chat-message.jar
,放入JMETER_HOME/lib
。
步骤 3:配置 JMeter 测试计划
创建线程组
右键 Test Plan → Add → Threads (Users) → Thread Group
参数:
Number of Threads (Users): 100
Ramp-Up Period: 10 (秒内启动全部用户)
Loop Count: Forever(持续压测)
添加 WebSocket 连接控制器
右键 Thread Group → Add → Config Element → WebSocket Connection Configuration
参数:
Server URL:
ws://your-server:8080/chat
Protocol:
ws
Connection Timeout: 5000 (ms)
添加 WebSocket 请求采样器
右键 Thread Group → Add → Sampler → WebSocket Open Connection
Name: Open Connection
Implementation:
RFC6455 (WebSocket v13)
发送 Proto 编码消息
添加 JSR223 Sampler(使用 Groovy 脚本处理 proto):
import com.example.ChatMessage; // 创建 proto 对象 def message = ChatMessage.newBuilder() .setUserId("user_${ctx.getThreadNum()}") .setContent("Hello from JMeter") .setTimestamp(System.currentTimeMillis()) .build(); // 序列化为字节流 byte[] payload = message.toByteArray(); vars.put("protoPayload", payload); // 存储到变量
发送二进制消息
添加 WebSocket Send Sampler:
Message Type:
Binary
Payload:
${protoPayload}
(引用脚本生成的变量)
接收响应并断言
添加 WebSocket Read Sampler:
Timeout: 2000 ms
Expect Close: No
添加 JSR223 Assertion 解析 proto:
import com.example.ChatMessage; byte[] response = prev.getResponseData(); ChatMessage parsed = ChatMessage.parseFrom(response); if (!parsed.getContent().contains("ACK")) { AssertionResult.setFailure(true); AssertionResult.setFailureMessage("Invalid response: " + parsed.getContent()); }
添加监听器
View Results Tree(调试用,压测时禁用)
Summary Report / Aggregate Report
Response Time Graph
三、执行压测
保存测试计划为
websocket-proto.jmx
。命令行运行(避免 GUI 资源消耗):
jmeter -n -t websocket-proto.jmx -l result.jtl
使用 JMeter Plugins 生成报告:
JMETER_HOME/bin/jmeter -g result.jtl -o report/
四、常见问题
Proto 类未找到:确认
chat-message.jar
在lib
目录。WebSocket 连接失败:检查防火墙、服务器是否支持
ws
(非wss
)。高并发下连接拒绝:调整服务器最大连接数,或使用分布式压测。
通过以上步骤,即可完成基于 ws+proto
协议的 WebSocket 压测。根据实际业务调整消息内容、并发模型及断言逻辑。