美文网首页
非常规协议服务的性能测试

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

作者: 丁小晶的晶小丁 | 来源:发表于2016-06-17 10:29 被阅读404次

        依照市面上目前自动化的测试工具和产品,我们发现它们对常规协议: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));

    }

    相关文章

      网友评论

          本文标题:非常规协议服务的性能测试

          本文链接:https://www.haomeiwen.com/subject/bfpzlttx.html