文章目录
- 1.背景
- 1.1 什么是SSE接口
- 2. **解决思路-尝试方法⬇️:**
- 2.1 🏳️🌈 **postman-sse请求结果**
- 2.2 **⚡ jmeter报错**
- 2.3 ☀️**封装此SSE接口**
- 2.3.1 ❌httpclient
- 2.3.2 ❌HttpURLConnection
- 2.3.3 ✔️okhttp3
- 3. jmeter-beanshell实现
- 3.1 jmeter结构
- 3.2 beanshell说明
- 3.2.1 jar包
- 3.2.2 脚本
- 3.2.3 结果正确性查看
1.背景
1️⃣ 我要压测一个SSE接口✔️
2️⃣ 我压测的接口,用jmeter普通请求,它成功不了 ❗
1.1 什么是SSE接口
SSE是HTML5新增的功能,全称为Server-Sent Events。它可以允许服务推送数据到客户端。SSE在本质上就与之前的长轮询、短轮询不同,虽然都是基于http协议的,但是轮询需要客户端先发送请求。而SSE最大的特点就是不需要客户端发送请求,可以实现只要服务器端数据有更新,就可以马上发送到客户端。
---------------以上为摘抄
实不相瞒,我不知道原理。但我要搞定进行压测!!
其实我管它是啥啊,我作为一个普通打工仔,我只知道我的需求是什么,我的目标是什么,我能完成任务就好啦!
2. 解决思路-尝试方法⬇️:
1️⃣ jmeter ❌
2️⃣ postman
3️⃣ loadrunner ❌
4️⃣ apifox❌
5️⃣ HttpURLConnection❌
6️⃣ httpclient❌
7️⃣ okhttp3
不管三七二十一,办法总比困难多
2.1 🏳️🌈 postman-sse请求结果
从下图⬇️结果可以看出,它与普通的链接请求返回结果有差异😀,国内很多工具都是抄了postman
,不点名了,同样的东西本土化后,有个最大的特点:繁杂,你也可以说它功能细节做了很多吧😅。
2.2 ⚡ jmeter报错
最开始,我尝试使用jmeter
,添加http请求采样
进行测试,结果调试不成功,以下报错信息:
org.apache.http.ConnectionClosedException: Premature end of chunk coded message body: closing chunk expected
网上找了很多方法,最靠谱的应该就是:建议我换个工具做SSE链接压测,虽然没告诉我用什么工具可以,但至少告诉我jmeter不行🤣。
2.3 ☀️封装此SSE接口
这一点被我纳入解决方案中,是因为这个接口,只是希望有并发,想要大量数据涌入,看服务器稳定情况 😃
如果说封装一次,有网络消耗,影响性能的,大可不必有此担心
2.3.1 ❌httpclient
不行
2.3.2 ❌HttpURLConnection
不行
2.3.3 ✔️okhttp3
行
代码演示:
👉 pom.xml
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.2</version>
</dependency>
👉 java
public int doget(String url,String header1,String header2,String header3){
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url(url)
.get()
.addHeader("Content-Type", header1)
.addHeader("x-token", header2)
.addHeader("uid", header3)
.build();
Response response =null;
try {
response = client.newCall(request).execute();
}catch (Exception e){
e.printStackTrace();
}
System.out.println(response.code());
return response.code();
}
👉 controller
@RestController
public class ChatController {
@Autowired
GetRequest getRequest;
@PostMapping("/createsse")
public String createsse(String geturl, String posturl,String param,String contentType,String token,String uid){
getRequest.doget(geturl,contentType,token,uid);
String response = getRequest.dopost(posturl,param,contentType,token,uid);
return response;
}
}
👉 任一压力测试工具进行压测,例如jmeter
👉 任一压力测试工具进行压测,例如loadrunner
Action()
{
web_submit_data("create",//事务名
"Action=http://localhost:8006/createsse", //请求域名
"Method=POST", //请求类型为post
"RecContentType=application/json", //返回格式为json
"Referer=",
"Snapshot=t4.inf",
"Mode=HTML",
ITEMDATA, //下面编辑post请求的数据
"Name=geturl", "Value=https://cc.pc.com.cn/api/createSse", ENDITEM, //数据的name、value及结束符
"Name=posturl", "Value=https://xx.pc.com.cn/api/chat", ENDITEM, //第二条数据的name、value及结束符
"Name=param", "Value=When is it okay to have ",ENDITEM,
"Name=contentType", "Value=application/json", ENDITEM,
"Name=token", "Value=xxxxxxxxxxxxxxxxxxx==", ENDITEM,
"Name=uid", "Value=qqqqqqqqqqqqqqqqqqqqq", ENDITEM,
LAST);
return 0;
}
这种方法应付需求倒还是可以,但真的太麻烦了,其它同事不会springboot
,想封装个接口出来,难啊!更多测试人员不懂Java
,更难理解😃
jmeter里不是可以写Java吗,为什么不直接使用beanshell实现呢?
3. jmeter-beanshell实现
3.1 jmeter结构
3.2 beanshell说明
前置beanshell、 后置beanshell 、采样beanshell 、 JSR223 beanshell 都行,只要可以使用beanshell就行,用JSR223 报错信息会更明确一些
3.2.1 jar包
需要把以下几个依赖包加入到jmeter\lib\ext
目录下
fastjson-1.2.55.jar
httpclient-4.5.13.jar
httpcore5-5.1.2.jar
okhttp-3.14.2.jar
okio-1.14.0.jar
3.2.2 脚本
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
OkHttpClient client = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "");
String url = vars.get("geturl");
String token = vars.get("x-token");
String uid = vars.get("uid");
log.info("url+token+uid==="+url+token+uid);
Request request = new Request.Builder().url(url).get().addHeader("Content-Type", "application/json").addHeader("x-token", token).addHeader("uid", uid).build();
Response response =null;
try {
response = client.newCall(request).execute();
}catch (Exception e){
e.printStackTrace();
}
log.info("createSse-code============="+response.code());
3.2.3 结果正确性查看
我更喜欢加打印