非常规协议服务的性能测试

    依照市面上目前自动化的测试工具和产品,我们发现它们对常规协议:http、https等协议支持较好,可是对于非常规协议,如:dubbo、rmp等协议或者公司内部协议的支持不太好,基本上是完全不支持的。我们在本文来探讨一下如何支持非常规协议的自动化测试。

   很多人会想到将非常规协议转变为常规协议后再做压测,这种方法的适用性不高,我们来举个例子:

   我们想对某个dubbo协议的服务进行压测,dubbo协议的另一侧是企业的总线接入服务。这种场景下我们如果将dubbo协议包装一层成为http协议,那么http服务器有可能成为压测的瓶颈,因为企业总线的性能是很强劲的,因此需要使用复杂的http服务集群才能摆脱http服务器的瓶颈。小编就被这种方案害苦过,曾有一次压测集团的总线服务,因为现成的工具不支持dubbo协议,故将dubbo协议转换成http协议使用jmeter集群进行压测,发现性能普遍较低,和预想的性能有十倍之差,而问题还不只出现在http服务器,而是出在http调用dubbo时服务器对连接的承载数目,这种协议转换的方案慎用。

   那么我们要使用哪种方法去进行这些非常规协议的自动化测试呢?

   jmeter提供了一种java调用,可以直接调用java的类,如果我们将要封装的协议放在java类中,直接调用java类的话,其开销并不大,其一是因为java类的运行在压测机,使用压测机集群可以几乎无限制的消灭掉这种瓶颈,其二是java类的系统开销较低,几乎不会对压测造成影响。下面我们将对其实现方式进行详细的介绍。

我们将首先介绍通用的方法:

一.启动JMeter

下载:

http://jmeter.apache.org/download_jmeter.cgi

启动:

Linux环境下运行 $安装目录/bin/jmeter.sh

Windows下运行 $安装目录/bin/jmeter.bat

二.编写用例

针对"Java请求"类型的测试,需要基于JMeter测试框架编写用例。

1、新建一个普通的Java工程;

2、将 $JMeter安装目录/lib/ 目录引入工程;

3、新建Java Class,如下的"PerformanceTest ",并继承"AbstractJavaSamplerClient";

代码示例:

Java代码

/**

*

*/

packagetest;

importorg.apache.jmeter.config.Arguments;

importorg.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;

importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;

importorg.apache.jmeter.samplers.SampleResult;

/**

* @author dingjingjing

*

*/

publicclassPerformanceTestextendsAbstractJavaSamplerClient {

/**

*

*/

privatestaticlongstart =0;

privatestaticlongend =0;

/**

* 执行runTest()方法前会调用此方法,可放一些初始化代码

*/

publicvoidsetupTest(JavaSamplerContext arg0) {

// 开始时间

start = System.currentTimeMillis();

}

/**

* 执行runTest()方法后会调用此方法.

*/

publicvoidteardownTest(JavaSamplerContext arg0) {

// 结束时间

end = System.currentTimeMillis();

// 总体耗时

System.err.println("cost time:"+ (end - start) /1000);

}

/**

* JMeter界面中可手工输入参数,代码里面通过此方法获取

*/

publicArguments getDefaultParameters() {

Arguments args =newArguments();

returnargs;

}

/**

* JMeter测试用例入口

*/

@Override

publicSampleResult runTest(JavaSamplerContext arg0) {

SampleResult sr =newSampleResult();

try{

// Start

sr.sampleStart();

/**

* Start~End内的代码会被JMeter

* 纳入计算吞吐量的范围内,为了使

* 性能结果合理,无关代码不必放此

*/

// TODO

/**

* True/False可按测试逻辑传值

* JMeter会对失败次数做出统计

*/

sr.setSuccessful(true);

// End

sr.sampleEnd();

}catch(Exception e) {

e.printStackTrace();

}

returnsr;

}

}

4、导出成Jar并置于 $JMeter安装目录/lib/ext/ 下,若有依赖Jar也置于 $JMeter安装目录/lib/ 下;

5、启动或重启JMeter。

三、运行用例

1、主界面左侧“测试计划”,右键菜单->添加->Threads(Users)->线程组;

2、再选中刚才新增的"线程组",右键菜单->添加->Sampler->Java请求;

3、再选中刚才新增的"Java请求",右键菜单->添加->监视器->聚合报告;

4、选择想测试的类名,并在"线程组"选项中输入循环次数及并发线程数;

5、点击菜单栏上"运行"->启动后便开始运行,在"聚合报告"查看结果数据。

Tips:

1.若在"Java请求"选项中未找到测试用例类名: 则请先确认用例是否继承了JMeter框架的基类; 其次保证用例Jar文件在 $安装目录/lib/ext/ 下; 尝试重启JMeter。

2.如果对于java请求的读取仍然存在各种各样的问题,很大可能是java版本不一致造成的,jmeter编译时java版本大多为1.6,所以可以尝试将编译java类java版本保持和jmeter编译java版本的一致,或者拿到jmeter源码,在本地再次编译jmeter。


在这里贴上jmeter调用dubbo协议的代码:

package com.pingan;

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

import org.apache.jmeter.config.Arguments;

importorg.apache.jmeter.protocol.java.sampler.JavaSamplerClient;

importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;

importorg.apache.jmeter.samplers.SampleResult;

importcom.alibaba.dubbo.config.ApplicationConfig;

importcom.alibaba.dubbo.config.ReferenceConfig;

import com.alibaba.dubbo.config.RegistryConfig;

importcom.alibaba.dubbo.rpc.service.GenericService;

import com.paic.pafa.ac.dubbo.GenericParam;

importcom.paic.pafa.ac.dubbo.GenericResult;

public class DubboClient implementsJavaSamplerClient {

publicstatic int j = 0;

publicstatic int j1 = 0;

publicstatic int p= 0;

GenericServicegenericService = null;

//publicDubboClient() {

//System.out.println("gouzao");

//run();

//System.out.println("finish");

//

//}

publicSampleResult runTest(JavaSamplerContext jsc) {

SampleResultsampleResult = new SampleResult();

GenericParamparam = new GenericParam();

param.setParams(getParams());

try{

sampleResult.sampleStart();

GenericResultresult = (GenericResult) genericService.$invoke("anymethod",

newString[] { "com.paic.pafa.ac.dubbo.GenericParam" }, new Object[] {param });

System.out.println(result.getResult());

sampleResult.setResponseCodeOK();

sampleResult.setResponseMessageOK();

sampleResult.setSuccessful(true);

sampleResult.setResponseData(result.getResult().toString(),"UTF-8");}

catch(Exceptione){

sampleResult.setResponseCode("error");

sampleResult.setResponseMessage("error");

sampleResult.setSuccessful(false);

sampleResult.setResponseData("帅哥,貌似是你的网不通,或者服务挂了", "UTF-8");

j1++;

}

finally{

sampleResult.sampleEnd();

}

returnsampleResult;

}

publicstatic void main(String[] args) {

DubboClientclient = new DubboClient();

client.setupTest(null);

client.runTest(null);

}

publicString run() {

//DubboClientclient = new DubboClient();

setupTest(null);

returnrunTest(null).toString();

}

publicstatic void main1(String[] args) {

intcount=90;

inti=0;

for(;i

newThread(new Runnable() {

publicvoid run() { //新启动一个线程,避免时间的浪费

for(;;){

DubboClientclient = new DubboClient();

client.setupTest(null);

client.runTest(null);

client.j++;

System.out.println(j+"error"+j1);

}

}

}).start();}

}

publicArguments getDefaultParameters() {

//TODO Auto-generated method stub

returnnull;

}

publicvoid setupTest(JavaSamplerContext arg0) {

try{

ReferenceConfigreference = new ReferenceConfig();

reference.setUrl("dubbo://10.21.99.79:20882/esb-proxy.service.B10013_000000");

reference.setInterface("esb-proxy.service.B10013_000000");

reference.setGeneric(true);

reference.setApplication(newApplicationConfig("ff-test"));

reference.setTimeout(10000);

reference.setRegistry(newRegistryConfig("zookeeper://10.21.66.48:2181"));

genericService = reference.get();}

catch(Exceptione){

System.out.print("error\n\n\n");

}

}

publicvoid teardownTest(JavaSamplerContext arg0) {

//TODO Auto-generated method stub

}

publicMap getParams() {

Map params = new HashMap();

Map esbRequest = new HashMap();

Map header = new HashMap();

Map content = new HashMap();

esbRequest.put("content",content);

esbRequest.put("header",header);

StringsendSerialNo = this.getSeqNo();

esbRequest.put("sendSerialNo",sendSerialNo);

esbRequest.put("idType","1");

esbRequest.put("idNo","1");

params.put("esbRequest",esbRequest);

params.put("timeOutMs","30000");

params.put("systemId","958537");

params.put("requestNo",sendSerialNo);

returnparams;

}

publicString getSeqNo() {

returnString.valueOf(System.currentTimeMillis() + System.nanoTime() + newRandom().nextInt(2));

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,561评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,531评论 18 399
  • 0 准备 安装注册中心:Zookeeper、Dubbox自带的dubbo-registry-simple;安装Du...
    七寸知架构阅读 13,955评论 0 88
  • 关键词:全局把控、细节到位、加强行动力 工作内容: 1、蔓之研许昌新田360店--效果图绘制 2、哈尔滨鲨鱼咬吐司...
    不一样的Jing阅读 455评论 0 0
  • 对于绘画,我真的可以说从没想过,有一天,能弱弱地拿起笔来画一个称之为东西的东西。小时候存在的记忆仅限于画过一只两条...
    想和小鱼一起游阅读 1,357评论 0 2