性能测试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 版本, ...
随机推荐
- HDU - 6127: Hard challenge(扫描线,atan)
pro:给定N个二维平面的关键点,保证两点连线不经过原点.现在让你安排一条经过原点,但是不经过关键点的直线,使得两边的和的乘积最大. sol:由于连线不经过原点,所以我们极角排序即可. 具体:因为我们 ...
- 浅析URL(接口测试必备知识)
笔者最近在开始接触接口测试的工作,接口测试必须了解http协议,但前提是必须要了解URL URL的定义 url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标 ...
- memcache 杂记
它是一个一个高性能的分布式内存对象缓存系统. 端口号 11211 目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的. 需要频繁访问数据库的网站访问速度提升效果十分显著 根据一个sql取出的 ...
- mybatis:Parameter 'ids' not found.
https://www.cnblogs.com/baby-lijun/p/5908088.html ps:根本原因就是他们根本就没有理解foreach里面的collection应该放什么东西,错误的理 ...
- 真tm郁闷
昨天这时还是信心满满,今天这时就已经彻底颓了. 感觉这次是最接近的了,4个题目都做出来了,怎么还会fail,那边也不说为什么,到底是哪里不足,尽说些没用的. 前后都当了4次炮灰了,以后也不会再冲动了, ...
- 常用的HTML模板(转载)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C++——智能指针unique_ptr的实现
起初,我最直观的设计想法,直接设计一个类:包含全部要素(对象,指针计数).然后提供出去. class CPoint { public: CPoint(, ) : x(xVal), y(yVal) {} ...
- Elasticsearch(单节点)
1 Elasticsearch搭建 1.1 通过Wget下载ElasticSearch安装包wget https://artifacts.elastic.co/downloads/elasticsea ...
- HashMap与LinkedHashMap的区别
/** * remark: * HashMap与LinkedHashMap的区别 * 这里必须使用LinkedHashMap: * 原因 ...
- JavaScript 集合对象
1. 集合对象 1.1 Object 关于Object类型的创建和底层存储原理我在另一篇文章有说明: JavaScript 对象属性底层原理 我们知道了大多数情况下Object底层都是Hash结构,我 ...