jmeter请求Sse长链接接口

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 结果正确性查看

我更喜欢加打印
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值