【别再只会 HTTP 了,JMeter 压测 WebSocket 才够硬核】
课程:B站大学
记录使用jmeter完成websocket压测或者python压测websocket
jmeter之websocket压测实战
为什么需要 WebSocket?
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。
举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。
注意点:http是单向的,过去工程师都是用轮询的方式解决消息的连接,但是非常浪费资源(因为要不断的发起http请求,tcp连接数会变高)
WebSocket 协议
特点:它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话
协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
ws://example.com:80/some/path
如何发起websocket连接呢?
1、需要GET请求方式u的http请求
2、请求体需要携带upgrade:websocket请求头
示例:
WebSocket 服务端:
import asyncio
import websockets
async def echo(websocket):
async for message in websocket:
print(f"收到消息: {message}")
await websocket.send(f"你发的是: {message}")
async def main():
async with websockets.serve(echo, "localhost", 8765):
print("WebSocket 服务已启动 ws://localhost:8765")
await asyncio.Future() # 永久运行
asyncio.run(main())
WebSocket 客户端:
import asyncio
import websockets
async def client():
async with websockets.connect("ws://localhost:8765") as ws:
await ws.send("你好 WebSocket")
msg = await ws.recv()
print(f"服务端回复: {msg}")
asyncio.run(client())
显然用代码的方式也可以完成压测,但是代码本身是不能开多个,会有限制,用jmx文件压测数据更清晰,并且不会受限制
注意点:为什么必须先启动服务端?
服务端是被动方(等待连接)
客户端是主动方(发起连接)
主动方必须等被动方准备好才能成功
为什么需要心跳机制?
websocket是一种稳定的长连接:
为了保持 WebSocket 稳定的长连接,在连接建立之后,服务器和客户端之间通过心跳包来保持连接状态,以防止连接因为长时间没有数据传输而被切断。‘
一种特殊的数据包(ping和pong)ping发起请求,pong回应请求(server和client均可以发起ping或者pong)
不包含任何实际数据,仅用来维持连接状态
一个空数据帧
定期发送,确保链接仍然有效,避免长时间没有数据传输而被中断
websocket的缺点
不提供加密功能
如果有安全上的需求,需采用其他方式来确保安全性,如:SSL 协议,设置黑白名单
不支持古老的浏览器
不支持 IE10 以前的版本。需要使用 AJAX 或者其他方式来进行替代(已被验证)
实战:启动py服务端的websocket文件,然后本地编写个jmx文件
jmeter本身不支持websocket协议,需要安装websocket的插件
1、安装:jmeter-plugins-manager-1.12.jar到jmeter的lib/ext目录下
2、安装:jmeter-websocket-samplers-1.3.2.jar到jmeter的lib/ext目录下

jmeter中的websocket元件:
WebSocket Open Connection 建立连接:用于初始化与 WebSocket 服务器的连接(类似打电话拨号)。
WebSocket request-response Sampler 请求-响应:发送一条消息并等待服务器返回一条消息(类似收发短信,一问一答)。
WebSocket Single Write Sampler 单向发送:只发送消息,不等待服务器回复(类似发广播,说完就走)。
WebSocket Single Read Sampler 单向接收:只接收服务器发来的消息,不发数据(类似只听不说)。
WebSocket Ping/Pong 心跳检测:发送 Ping 帧保持连接活跃,或测试连接是否断开(类似心跳监测)。
WebSocket Close 关闭连接:主动断开与服务器的 WebSocket 连接(类似挂电话)。
连接地址要配置正确,然后就可以编排发送或者接受消息的取样器
最终服务端websocket启动,jmx是模拟用户端发送消息或者接收服务端消息
企业级:jmeter之websocket压测实战:

企业级:python之websocket压测实战:

websocket压测在企业项目–性能测试中非常常见且高频,加油
实践是检验真理的唯一标准
更多推荐


所有评论(0)