性能测试Jmeter压测ZooKeeper-自定义java请求
要想通过自定义java请求来压测ZooKeeper,那么我们就需要做两件事情,第一我们需要知道java如何操作ZooKeeper,第二就是怎么能将我们写的jar包让jmeter识别,首先我们先来干第一件事。
一、java操作ZooKeeper
以下的代码是网上百度找到的,经过了一点点修改(对于测试其它的可以找其它的测试代码)
package com.comtop.ZookApi; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper; /**
* Zookeeper base学习笔记
*/
public class ZookeeperBase { /** zookeeper地址 */
static final String CONNECT_ADDR = "10.10.3.136:32372";
/** session超时时间 */
static final int SESSION_OUTTIME = 2000;// ms
/** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */
static final CountDownLatch connectedSemaphore = new CountDownLatch(1); public static void main(String[] args) throws Exception { ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME,
new Watcher() {
public void process(WatchedEvent event) {
// 获取事件的状态
KeeperState keeperState = event.getState();
EventType eventType = event.getType();
// 如果是建立连接
if (KeeperState.SyncConnected == keeperState) {
if (EventType.None == eventType) {
// 如果建立连接成功,则发送信号量,让后续阻塞程序向下执行
System.out.println("zk 建立连接");
connectedSemaphore.countDown();
}
}
}
}); // 进行阻塞
connectedSemaphore.await(); System.out.println("..");
// 创建父节点
// zk.create("/testRoot", "testRoot".getBytes(), Ids.OPEN_ACL_UNSAFE,
// CreateMode.PERSISTENT); // 创建子节点
// zk.create("/testRoot/children", "children data".getBytes(),
// Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 获取节点洗信息
// byte[] data = zk.getData("/testRoot/children", false, null);
// System.out.println(new String(data));
// System.out.println(zk.getChildren("/testRoot", false));
// 修改节点的值
// zk.setData("/testRoot/children", "modify data root".getBytes(), -1);
// byte[] data = zk.getData("/testRoot/children", false, null);
// System.out.println(new String(data));
// 如果存在节点则删除节点
if (null != zk.exists("/testRoot/children", false)) {
// 删除节点
zk.delete("/testRoot/children", -1);
System.out.println(zk.exists("/testRoot/children", false));
}
zk.close(); } }
二、自定义java请求
package com.comtop.ZkApiJM; import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection; import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult; import java.util.concurrent.CountDownLatch; import javax.management.RuntimeErrorException; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper.States;
import org.apache.zookeeper.ZooKeeper; //public Arguments getDefaultParameters();设置可用参数及的默认值;
//public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
//public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;
//public void teardownTest(JavaSamplerContext arg0):测试结束时调用; public class ZkjavaRequest extends AbstractJavaSamplerClient implements Serializable { /** zookeeper地址 */
private String conn_addr; //存储用户输入的zk地址
// 测试用的数据
// private static String conn_addr1;
// private static String session_timeout1;
// private static String zk_father1;
// private static String zk_children1;
// private static String zk_context1;
// private static String resultData1; private static final String ConnAddrName="conn_addr" ; //设置GUI页面显示的变量名称
//设置GUI页面默认显示的变量值,默认值为空
private static final String ConnAddrValueDefault="10.10.3.136:32372"; /** session超时时间 */
private String session_timeout; //存储用户输入的session超时时间(单位ms) private static final String SessTimeName="session_timeout" ; //设置GUI页面显示的变量名称
//设置GUI页面默认显示的变量值,默认值为空
private static final String SessTimeValueDefault="5000"; //zk父节点
private String zk_father = "test"; //存储用户输入的zk父节点
private static final String ZkFatherName="zk_father" ; //设置GUI页面显示的变量名称
//设置GUI页面默认显示的变量值,默认值为空
private static final String ZkFatherValueDefault="/test"; /** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */
static final CountDownLatch connectedSemaphore = new CountDownLatch(1); //zk连接对象
private ZooKeeper zk; // resultData变量用来存储响应的数据,目的是显示到查看结果树中。
private String resultData; // 测试代码
// public static void main(String[] args) {
// haha();
// }
//
// public static void haha(){
// conn_addr1 = "10.10.3.136:32372";
// session_timeout1 = "2000";
// zk_father1 = "/test1";
// zk_children1 = "/test2";
// zk_context1 = "test2";
// try {
// ZooKeeper zk = new ZooKeeper(conn_addr1, Integer.valueOf(session_timeout1),
// new Watcher() {
// public void process(WatchedEvent event) {
// // 获取事件的状态
// KeeperState keeperState = event.getState();
// EventType eventType = event.getType();
// // 如果是建立连接
// if (KeeperState.SyncConnected == keeperState) {
// if (EventType.None == eventType) {
// // 如果建立连接成功,则发送信号量,让后续阻塞程序向下执行
// System.out.println("zk 建立连接");
// connectedSemaphore.countDown();
// }
// }
// }
// });
// connectedSemaphore.await();
// // 如果存在父节点则不创建父节点
// if (null == zk.exists(zk_father1, false)) {
// // 创建父节点
// zk.create(zk_father1, zk_father1.getBytes(), Ids.OPEN_ACL_UNSAFE,
// CreateMode.PERSISTENT);
// }
// // 创建子节点
// zk.create(zk_father1+zk_children1, zk_context1.getBytes(),
// Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// // 获取节点洗信息
// byte[] data = zk.getData(zk_father1+zk_children1, false, null);
// resultData1 = new String(data);
// System.out.println(new String(data));
// System.out.println(zk.getChildren("/testRoot", false));
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
//
//} /*
* 这个方法用来控制显示在GUI页面的属性,由用户来进行设置。
* 此方法不用调用,是一个与生命周期相关的方法,类加载则运行。
* (non-Javadoc)
* @see org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient#getDefaultParameters()
*/ @Override
public Arguments getDefaultParameters() {
System.out.println("读取属性值");
Arguments params = new Arguments();
params.addArgument("conn_addr",String.valueOf(ConnAddrValueDefault));
params.addArgument("session_timeout", String.valueOf(SessTimeValueDefault));
params.addArgument("zk_father", String.valueOf(ZkFatherValueDefault));
params.addArgument("zk_children","");
params.addArgument("zk_context","");
return params;
} /**
* 初始化方法,初始化性能测试时的每个线程
* 实际运行时每个线程仅执行一次,在测试方法运行前执行,类似于LoadRunner中的init方法
*/ @Override
public void setupTest(JavaSamplerContext jsc) {
conn_addr = jsc.getParameter(ConnAddrName, ConnAddrValueDefault);
session_timeout = jsc.getParameter(SessTimeName, SessTimeValueDefault);
zk_father = jsc.getParameter(ZkFatherName, ZkFatherValueDefault);
try {
zk = new ZooKeeper(conn_addr, Integer.valueOf(session_timeout),
new Watcher() {
public void process(WatchedEvent event) {
// 获取事件的状态
KeeperState keeperState = event.getState();
EventType eventType = event.getType();
// 如果是建立连接
if (KeeperState.SyncConnected == keeperState) {
if (EventType.None == eventType) {
// 如果建立连接成功,则发送信号量,让后续阻塞程序向下执行
System.out.println("zk 建立连接");
connectedSemaphore.countDown();
}
}
}
});
if (States.CONNECTING == zk.getState()) {
connectedSemaphore.await();
}
// 如果存在父节点则不创建父节点
if (null == zk.exists(zk_father, false)) {
// 创建父节点
zk.create(zk_father, zk_father.getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
}
} catch (Exception e) {
// TODO Auto-generated catch block
// e.printStackTrace();
throw new RuntimeException(e);
}
// 进行阻塞
// System.out.println(".."); } @Override
public SampleResult runTest(JavaSamplerContext arg0) {
String zk_children = arg0.getParameter("zk_children"); //获取zk_children
String zk_context = arg0.getParameter("zk_context"); //获取zk_context
// System.out.println(zk_context+" "+zk_children);
/*
* SampleResult这个类是用来将测试结果输出到查看结果树中的。
* 并且也是用来控制事务的开始和结束的。
*/ SampleResult results = new SampleResult();
results.setSampleLabel("zk节点测试:"+zk_father); try{
// 事务开始标记
results.sampleStart();
// 创建子节点
zk.create(zk_father+zk_children, zk_context.getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// 获取节点洗信息
byte[] data = zk.getData(zk_father+zk_children, false, null);
// System.out.println(new String(data));
resultData = new String(data);
if(null == resultData){
results.setSuccessful(false);
results.setResponseData("zk result is null",null);
results.setDataType(SampleResult.TEXT);
}
results.setSuccessful(true);
}catch(Exception e){
results.setSuccessful(false);
results.setResponseData(e.toString(),null);
results.setDataType(SampleResult.TEXT);
e.printStackTrace();
return results;
}finally{
//标记事务结束
results.sampleEnd();
}
// System.out.println("写入成功");
// results.setSuccessful(true);
results.setResponseData(resultData,null);//将数据打印到查看结果树当中
results.setDataType(SampleResult.TEXT);
return results;
} /**
* 测试结束方法,结束测试中的每个线程
* 实际运行时,每个线程仅执行一次,在测试方法运行结束后执行,类似于Loadrunner中的End方法
*/ public void teardownTest(JavaSamplerContext arg0) {
try {
zk.close();
System.out.println("关闭");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
代码及依赖包如下:
性能测试Jmeter压测ZooKeeper-自定义java请求的更多相关文章
- jmeter压测过程中报java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
由于在java中添加了第三方安全策略文件,具体请看https://www.cnblogs.com/mrjade/p/10886378.html,导致在用jmeter压测过程中会遇到以下错误 解决办法: ...
- 【Java分享客栈】未来迈向高级工程师绕不过的技能:JMeter压测
前言 因为工作需要,久违的从自己的有道云笔记中去寻找压测相关的内容,翻开之后发现还不错,温故一遍后顺便整理出来分享给大家. 题外话,工作8年多,有道云笔记不知不觉都6G多了,扫一眼下来尽是云烟过往,竟 ...
- JMeter压测“java.net.BindException: Address already in use: connect”解决方法
之前在windows机上用JMeter压测,50并发下出现大量接口报“java.net.BindException: Address already in use: connect”错误. 从字面的意 ...
- windows下Jmeter压测端口占用问题(亲测有效)
windows下Jmeter压测端口占用问题 1 报错信息描述 压测的初期,在设置了 150qps/s 的并发数下压测几分钟后 Jmeter 就出现了如下报错. JAVA.NET.BINDEXCEPT ...
- windows下Jmeter压测端口占用问题
https://blog.csdn.net/weixin_43757847/article/details/88188091 1 前情提要人脸识别项目中,云平台新增了人脸识别的校验接口.考虑到存在大量 ...
- Jmeter性能测试之如何写Java请求测试用例类
一. 引言: 最近工作中的一个项目要求做性能测试,该项目由提供服务的几个应用组成,选用的框架是阿里巴巴公司开源的服务框架Dubbo.关于Dubbo的介绍,网上也有很多资料,本人只是做了粗略的了解,没有 ...
- jmeter 压测duobbo接口,施压客户端自己把自己压死了
jmeter 压测duobbo接口,jmeter代码不合理,导致每执行一次请求,会调用一次消耗内存的实例化.导致越压越慢,请求发不出去.这个时候需要考虑修改代码了. 截图中,tps越来越少. 原来初始 ...
- jmeter压测学习1-window环境准备与案例
前言 最近用jmeter做一些接口的压力测试,记录下使用过程中遇到的一些问题. 在使用window机器做并发压测的时候,发现并发数设置100的时候,会出现报错:java.net.SocketExcep ...
- 一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本
接上篇,一键转化将接口测试平台测试用例转化成Jmeter压测脚本思路,这里我首先在java 上面做了一个简单的实验,看看 转化的中间遇到的问题,这里呢,我只是给了一个简单的demo 版本, ...
随机推荐
- vue—data中变量和字符串拼接
#变量和字符串的拼接# 写项目中,遇到了这样的一个问题:怎样在一个div里面显示两个data中的数据?我的问题描述清楚了吗?... 看图吧: 这是用户最初的需求~ 这是用户后来的需求,嗯……就是 ...
- JavaScript权威指南--数组Array
什么是数组 数组是值的有序集合.每一个值叫做元素,每一个元素在数组中有一个位置,用数字表示,称为索引.js数组是无类型的.动态的,也可能是稀疏的.每个数组都有length属性.数组最大能容纳42949 ...
- 再谈Retina下1px的解决方案
https://www.w3cplus.com/css/fix-1px-for-retina.html
- HDU 2176:取(m堆)石子游戏(Nim博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 7th week blog
DOM:Document Object Model(文档对象模型) Document Object Model的历史可以追溯至1990年代后期微软与Netscape的“浏览器大战”,双方为了在Java ...
- ODS ,EDW,DM
ODS: 操作数据存储ODS(Operational Data Store),操作型数据仓库,最早的数据仓库模型,是数据仓库体系结构中的一个可选部分,ODS具备数据仓库的部分特征和OLTP系统的部分特 ...
- Mybatis根据List批量查询List结果
https://blog.csdn.net/qq_36688928/article/details/82783392
- windows 下的 Apache SSL证书配置
一.获取证书 1.从腾讯云获取 (1)登录腾讯云后,在“产品”中搜索[ssl]然后会得到 "SSL证书“,进入后点“立即选购” 这样就完成了证书的申请,等待一个工作日的审核. 审核通过后,进 ...
- 第二次作业-分布式版本控制系统Git的安装与使用
本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103 我的github远程仓库的地址:https://github ...
- 插入排序-C#实现
插入排序包括:直接插入排序和希尔排序. 具体代码如下: 直接插入排序: /// <summary> /// 直接插入排序 /// 适用于少量元素的排序 /// 稳定性:稳定 /// 时间复 ...