JMeter WebSocket 压测详细步骤(支持 ws+proto 协议)

一、环境准备

  1. 安装 Java

    • JMeter 依赖 Java 环境,确保已安装 JDK 8+。

    • 验证安装:终端输入 java -version,显示版本信息即可。

  2. 下载 JMeter

    • 官网下载最新版:Apache JMeter

    • 解压到任意目录(如 /opt/jmeter)。

  3. 安装插件管理器

    • 下载 jmeter-plugins-manager-1.10.jar,放入 JMETER_HOME/lib/ext 目录。

    • 重启 JMeter,菜单栏 Options → Plugins Manager 可见。

  4. 安装 WebSocket 插件

    • 打开插件管理器,搜索 WebSocket,安装以下插件:

      • WebSocket Samplers by Peter Doornbosch

      • Custom Thread Groups(可选,用于复杂压测模型)

  5. 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 测试计划
  1. 创建线程组

    • 右键 Test Plan → Add → Threads (Users) → Thread Group

    • 参数:

      • Number of Threads (Users): 100

      • Ramp-Up Period: 10 (秒内启动全部用户)

      • Loop Count: Forever(持续压测)

  2. 添加 WebSocket 连接控制器

    • 右键 Thread Group → Add → Config Element → WebSocket Connection Configuration

    • 参数:

      • Server URL: ws://your-server:8080/chat

      • Protocol: ws

      • Connection Timeout: 5000 (ms)

  3. 添加 WebSocket 请求采样器

    • 右键 Thread Group → Add → Sampler → WebSocket Open Connection

    • Name: Open Connection

    • Implementation: RFC6455 (WebSocket v13)

  4. 发送 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); // 存储到变量

    复制代码
  5. 发送二进制消息

    • 添加 WebSocket Send Sampler

      • Message Type: Binary

      • Payload: ${protoPayload}(引用脚本生成的变量)

  6. 接收响应并断言

    • 添加 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());
      }

    复制代码
  7. 添加监听器

    • View Results Tree(调试用,压测时禁用)

    • Summary Report / Aggregate Report

    • Response Time Graph


三、执行压测
  1. 保存测试计划为 websocket-proto.jmx

  2. 命令行运行(避免 GUI 资源消耗):

    复制代码
    jmeter -n -t websocket-proto.jmx -l result.jtl
    复制代码
  3. 使用 JMeter Plugins 生成报告:

    复制代码
    JMETER_HOME/bin/jmeter -g result.jtl -o report/
    复制代码

四、常见问题
  • Proto 类未找到 :确认 chat-message.jarlib 目录。

  • WebSocket 连接失败 :检查防火墙、服务器是否支持 ws(非 wss)。

  • 高并发下连接拒绝:调整服务器最大连接数,或使用分布式压测。


通过以上步骤,即可完成基于 ws+proto 协议的 WebSocket 压测。根据实际业务调整消息内容、并发模型及断言逻辑。

相关推荐
无限的鲜花2 小时前
反射(原创推荐)
java·开发语言
hhzz3 小时前
基于监控视频的水位尺自动识别技术方案与实现
python·opencv·yolo·图像识别·cv
yongche_shi3 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
一路向北he3 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
国强_dev3 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
weixin_408099674 小时前
OCR批量识别图片方案:从手动处理到自动化API系统(Python/Java/PHP实战)
图像处理·python·ocr·文字识别·api调用·批量识别·石榴智能
AI行业学习4 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
大圣编程5 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
云烟成雨TD5 小时前
LangFlow 1.x 系列【5】可视化编辑页面功能说明
人工智能·python·agent
upgrador5 小时前
基础知识:C++ STL构造函数的左闭右开惯例及其实现原理
开发语言·c++