使用Jmeter进行RPC压力测试

为了支持相关部门进行RPC协议的压测,初步了解了Jmeter如何使用java请求进行压测。

一、 下载Jmeter,进行解压即可使用,适用于windows和linux。用的版本为apache-jmeter-3.2
二、需要创建可用的java工程。

使用Java sample进行压测,需要创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写:

  1. public Arguments getDefaultParameters():设置可用参数的默认值;
  2. public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
  3. public SampleResult runTest(JavaSamplerContext
    arg0):开始测试,从arg0参数可以获得参数值;
  4. public void teardownTest(JavaSamplerContext arg0):测试结束时调用;

接口压测的主要测试代码如下所示,main函数是方便调试代码。motan的配置放在了setupTest中。 为了使用Jmeter进行测试在工程中添加本地依赖,依赖JMeter的lib目录下的jar文件ApacheJMeter_core.jar,ApacheJMeter_java.jar和jorphan.jar

public class PerformenceTest extends Abstract JavaSamplerClient {
    private static AlgFeedServiceMotan algFeedServiceMotan=null;
    private Logger log = getLogger();

// 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行
    @Override
    public void setupTest(JavaSamplerContext arg0){
    ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] { "classpath:my.xml" });
    algFeedServiceMotan = (AlgFeedServiceMotan) ctx.getBean("algFeedServiceRefer");
    log.info("---- 启动线程 ----");
    }
// 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行     
    @Override
    public void teardownTest(JavaSamplerContext arg0){
     log.info("---- 结束线程 ----");;
    }
// 设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter的参数列表中
    @Override
    public Arguments getDefaultParameters() {
        Arguments args = new Arguments();
        return args;
    }
// 测试执行的循环体,根据线程数和循环次数的不同可执行多次

    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
    String ruids="xxxxx";
    next = random.nextInt(22);
    String[] uids={"yyyyy"};
    SampleResult sampleResult = new SampleResult();
    boolean success = true;
    try {
            sampleResult.sampleStart();
            String str_uids = javaSamplerContext.getParameter("ruids");
            String str_fids = javaSamplerContext.getParameter("uids");
            RankedWeibo rankedWeibo = algFeedServiceMotan.rank(0,"fenzuxxx",ruids,uids);
            if(rankedWeibo != null && rankedWeibo.getData() != null && 0 == rankedWeibo.getCode()){
                success = true;
            }else {
                success = false;
            }
        } catch (Throwable e) {
            success = false;
            e.printStackTrace();
            log.info(e.getMessage());
        } finally {
            sampleResult.sampleEnd();  // jmeter 结束统计响应时间标记
            sampleResult.setSuccessful(success);
        }
        return sampleResult;
    }

//Jmeter不执行main函数。
    public static void main(String[] args) {
        Arguments params = new Arguments();
        params.addArgument("ruids", "xxxxx");//设置参数,并赋予默认值 
        params.addArgument("uids", "xxxx,xxx,xx");//设置参数,并赋予默认值
        JavaSamplerContext arg0 = new JavaSamplerContext(params);
        PerformenceTest test = new PerformenceTest();
        test.setupTest(arg0);
        test.runTest(arg0);
        test.teardownTest(arg0);
        System.exit(0);
    }}

二、工程建好后。需要打成jar包供Jmeter调用
一般情况可以将工程直接打包为可执行文件,再将jar包放在Jemter文件的JMETER_HOME\lib\ext目录即可。方法如下

  1. 直接Export为Runnable Jar File(eclipse和InteliJ IDEA方法各异)
  2. 在pom文件中使用插件打包
    a.使用maven-assembly-plugin打包成独立可执行的jar包。可以将java工程及其全部依赖jar进行打包
    工程一般依赖了很多的jar包,而被依赖的jar又会依赖其他的jar包,这样,当工程中依赖到不同的版本的spring时,在使用assembly进行打包时,
    只能将某一个版本jar包下的spring.schemas文件放入最终打出的jar包里,这就有可能遗漏了一些版本的xsd的本地映射,导致报错。
    b.使用maven-shade-plugin可以解决这个问题,它能够将所有jar里的spring.schemas文件 进行合并,在最终生成的单一jar包里,spring.schemas包含了所有出现过的版本的集合。
    那些资源要单独打此类配置文件,需要和开发沟通。
    c.由于打成可执行jar包,配置motan服务时总有冲突出现。压测时也可以采用maven-jar-plugin将工程打包(工程依赖的jar包不会一起打入)
    采用maven-dependency-plugin进行依赖。maven-jar-plugin会将工程依赖的所有jar包放在target/lib 文件中。
    打包完成后,将jar包和lib文件一起放入JMETER_HOME\lib\ext目录即可。
另外在打包时需要将外部包ApacheJMeter_core.jar,ApacheJMeter_java.jar和jorphan.jar加入,打包时才不会报错。

a.这里我采用手动mvn install到本地仓库,然后进行引用。版本名称如下,并在pom中引入

<dependency>
<groupId>org.ApacheJmeterCore</groupId>
<artifactId>ApacheJmeterCore</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.ApacheJmeterJava</groupId>
<artifactId>ApacheJmeterJava</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.jorphan</groupId>
<artifactId>jorphan</artifactId>
<version>1.0</version>
</dependency>

b.在工程中新建文件夹lib,放入外部引用的这三个jar包。依赖本地

<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/ApacheJMeter_java.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/ApacheJMeter_core.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>jorphan</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/logkit-2.0.jar</systemPath>
</dependency>

三、在Jmeter文件夹bin文件夹下打开Jmeter
创建线程组、Java Request、结果树,进行测试;
在线程组中右键选择Sampler->java 请求,类名称中出现自己写的类,即打包成功可进行调用压测。

GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐