使用jmeter对dubbo接口进行性能测试教程及常见问题处理
一、 测试脚本编写
脚本可参考git项目: https://github.com/aland-1415/dubbo-interface-test.git
1、 pom依赖
(注意添加的jmeter版本要与运行时使用的版本一致,这里使用的是3.1版本)
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.version>4.3.5.RELEASE</spring.version>
</properties> <dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>3.1</version>
<exclusions>
<exclusion>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
</exclusion>
<exclusion>
<groupId>commons-math3</groupId>
<artifactId>commons-math3</artifactId>
</exclusion>
<exclusion>
<groupId>commons-pool2</groupId>
<artifactId>commons-pool2</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>3.1</version>
<exclusions>
<exclusion>
<groupId>commons-math3</groupId>
<artifactId>commons-math3</artifactId>
</exclusion>
<exclusion>
<groupId>commons-pool2</groupId>
<artifactId>commons-pool2</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency> <!--添加业务的jar包依赖--> <!--压测接口所需要的包-->
<dependency>
<groupId>com.dmall</groupId>
<artifactId>rcs-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies> <build>
<plugins>
<!--复制jar包插件,将使用到的jar包,复制到target/lib中-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>target/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin> <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>add-resource</id>
<phase>generate-resources</phase>
<goals>
<goal>add-resource</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins> <resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
<!--设置自动替换-->
</resources> </build>
pom.xml
2、 dubbo服务配置(dubbo-config.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
"> <dubbo:application name="dmall-performance-test " owner="dmalltest" /> <!-- 线上环境 注册中心暴露发现服务地址 -->
<!--
<dubbo:registry address="zookeeper://192.168.90.148:2181?backup=192.168.90.149:2181,192.168.90.150:2181"/>
--> <!-- 测试环境 注册中心暴露发现服务地址,测试脚本使用 -->
<!--
<dubbo:registry address="zookeeper://testzk1.dmall.com:2181?backup=testzk2.dmall.com:2181,testzk3.dmall.com:2181,testzk4.dmall.com:2181,testzk5.dmall.com:2181"/>
--> <!-- dev环境 注册中心暴露发现服务地址,编写脚本调试使用 -->
<dubbo:registry address="zookeeper://devzk1.dmall.com:2181?backup=devzk2.dmall.com:2181,devzk3.dmall.com:2181"/> <!--<dubbo:registry address="${dubbo.zookeeper.address }"/> --> <!--erp系统接口接口压测-->
<dubbo:reference id="recServer" interface="com.dmall.rcs.api.RcsServer" timeout="10000" check="false"/> </beans>
dubbo-config.xml
3、 接口测试代码
public class RcsServerTest implements JavaSamplerClient {//也可继承 AbstractJavaSamplerClient
ApplicationContext context = new ClassPathXmlApplicationContext("dubbo-config.xml");
RcsServer recServer=(RcsServer) context.getBean("recServer");
long start = 0, end = 0;
//运行runTest方法前会调用此方法
@Override
public void setupTest(JavaSamplerContext argv0) {
start = System.currentTimeMillis();
}
//Jmeter界面手工输入的参数,可以在此方法中获取
@Override
public Arguments getDefaultParameters() {
Arguments args = new Arguments();
args.addArgument("primaryKey", "165987729026");
args.addArgument("useType", "post_order");
args.addArgument("businessDate", "2019-10-14 00:00:05");
args.addArgument("userId", "96322526");
args.addArgument("clientIp", "183.228.99.149");
return args;
}
//接口测试代码
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
String sys = arg0.getParameter("sys", "test");//arg0是运行jmeter时传的参数
String primaryKey = arg0.getParameter("primaryKey");
String useType = arg0.getParameter("useType");
String businessDateStr = arg0.getParameter("businessDate");
String userId = arg0.getParameter("userId");
String clientIp = arg0.getParameter("clientIp");
String exParameterStr = arg0.getParameter("exParameter");
RcsRequest rcsRequest = new RcsRequest(sys, primaryKey, useType, businessDate, userId, clientIp, exParameter);
SampleResult sr = new SampleResult();
sr.setSamplerData("系统RecServer测试");
//jmeter开始计响应时间标记
sr.sampleStart();
//调用被测试接口
RcsResponse response = recServer.discern(rcsRequest);
try {
sr.setSuccessful(true);
//jmeter最后显示的响应结果
sr.setResponseData("风险系数:" + response.getRiskScore());
sr.sampleEnd();
} catch (Exception e) {
sr.setSuccessful(false);
e.printStackTrace();
}
//结束计响应时间标记
sr.sampleEnd();
return sr;
}
//运行runTest方法后会调用此方法
@Override
public void teardownTest(JavaSamplerContext context) {
end = System.currentTimeMillis();
System.out.println("cost time: " + (end - start));
}
//用于开发时直接运行调试用
public static void main(String[] args){
RcsServerTest test = new RcsServerTest();
Arguments params = test.getDefaultParameters();
JavaSamplerContext arg0 = new JavaSamplerContext(params);
test.setupTest(arg0);
test.runTest(arg0);
}
}
注意:最终输出jar包时,要确保取样周期内,没有不相干的输出操作。否则,会影响【响应时间】统计数据的准确性
4、打包
(注意是打jar包,这个需要在pom文件里配置<packaging>jar</packaging>)
项目结构:

dubbo.xsd 文件下载地址: https://github.com/alibaba/dubbo
方法一:mvn clean -Ptest install
将 “项目路径/target” 下生成的jar包拷贝到 “jmeter安装目录/lib/ext”
将 “项目路径/target/lib” 下所有的依赖jar包拷贝到 “jmeter安装目录/lib”
方法二:用Eclipse的export导出可执行的jar包文件


将生成的jar包及同名文件夹一起拷贝到 “jmeter安装目录/lib/ext”
二、 在jmeter上运行脚本
1、 编写jmeter脚本
(1) 添加线程组

(2) 添加java请求

(3) 选择测试接口

(4) 保存
2、 非GUI运行脚本命令
sudo sh jmeter安装目录/bin/jmeter.sh -n -t test.jmx -l result.jtl
test.jmx是jmeter脚本
result.jtl 是最后存放测试结果的文件
注:linux上测试时可使用dstat 命令,可实时监控服务器CPU、磁盘、网络等基本情况
三、 压测报告生成
./jmeter安装目录/bin/jmeter.sh -g result.jtl -e -o resultReport
最后生成的报告是html存放于resultReport文件中,打开index.html即可
也可以在运行测试命令时同时加报告生成命令:
sudo sh jmeter安装目录/bin/jmeter.sh -n -t test.jmx -l result.jtl -e -o resultReport
附:
#coding=utf-8 import os def mergeJTL(filedir):
filenames=os.listdir(filedir)
f=open('result.jtl','w',encoding='utf-8')
#文件计数器
num=0
for filename in filenames:
if filename=="result.jtl" or filename[-3:]!="jtl":
pass
else:
print("将要开始合并的文件是:"+filename)
filepath = filedir+'/'+filename
for line in open(filepath,encoding='utf-8'):
lineList=line.split(",")
#去除自第二个并入的文件开始的首行文字内容
if num!=0 and "timeStamp" in line:
pass
#去除数据不为16列或17列的
elif len(lineList)!=16 and len(lineList)!=17:
pass
#去除每行第一列不为13位时间戳的数据
elif num!=0 and len(lineList[0])!=13:
pass
else:
f.writelines(line)
num=num+1
f.close()
print(str(num)+"个文件合并成功!")
用于手动合并jtl文件脚本
四、 常见问题处理
1、 注意所有的路径不要包含中文;
2、 许多打开jmeter就报错可能是因为引用的jar包与jmeter已有的jar冲突了且版本不一致,可删除其中重复的jar包或者把两边jar包的版本号修改为相同的
3、 导出的jar包放到jmeter的lib/ext目录下,创建测试计划->创建线程组->创建java请求,找不到编写的方法;
问题原因:编写java脚本时,jdk的版本使用的是1.8,而本机jmeter使用的是1.7
解决办法:2边jdk版本修改一致
4、 从jmeter读取中文显示问号的问题
解决办法:脚本中对要输出的对象进行强制转换

使用jmeter对dubbo接口进行性能测试教程及常见问题处理的更多相关文章
- jmeter测试dubbo接口
本文讲解jmeter测试dubbo接口的实现方式,文章以一个dubbo的接口为例子进行讲解,该dubbo接口实现的功能为: 一:首先我们看服务端代码 代码架构为: 1:新建一个maven工程,pom文 ...
- 使用Jmeter测试Dubbo接口(参数设置篇)
WebSocket接口需要下载dubbo插件才能使用 本次下载的版本为jmeter-plugins-dubbo-1.3.6,下载完成后jar文件放到\lib\ext目录下 由于工作需要,最近需要对du ...
- 『动善时』JMeter基础 — 52、使用JMeter测试Dubbo接口
目录 1.Dubbo介绍 2.准备测试Dubbo接口的环境 3.Dubbo Sample界面详解 4.Dubbo Sample组件的使用 (1)测试计划内包含的元件 (2)使用zookeeper协议请 ...
- JMeter测试dubbo接口总结
Jmeter 测试dubbo 接口 1. 安装JMeter 安装到/usr/local下 2. github上下载 jmeter-plugins-dubbo-x.x.x-jar-with-depend ...
- 通过Jmeter对Dubbo接口进行接口及性能测试
dubbo接口/性能测试 dubbo简介 zookeeper简介.安装及配置 dubbo服务端demo dubbo客户端调用 jmeter工程改造及接口调用 读取jmeter参数用于dubbo性能测试 ...
- Jmeter实现dubbo接口压测案例
当前项目中重构了消息服务,需要对消息服务接口做性能压测,评估消息服务的性能情况 通过和开发对接,目前消息服务是通过dubbo接口对内提供服务,所以才有了这边文章的记录 最初的压测这个dubbo接口有三 ...
- Jmeter测试dubbo接口填坑
通过jmeter测试dubbo的方法网上有很多帖子,需要的自己度娘去就可以. 使用的时候有个问题需要提示一下,因为我碰到了,还耽误了一些时间,不说中间的过程.直接说处理方式: 问题是这样的: 将dub ...
- jmeter5.1测试dubbo接口
dubbo接口功能介绍 客户端输入uncleyong(当然,也可以是其他字符串),服务端返回hello uncleyong 开发dubbo服务jmeter客户端 idea中创建模块dubbo_jmet ...
- 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试
建立JAVA项目 建立maven项目,加入Jmeter所需要的JAR包依赖. POM.xml 加入如下: <dependency> <groupId>org.apache.j ...
随机推荐
- vmware ubuntu16 启动蓝屏屏幕闪
vmware ubuntu16 启动蓝屏屏幕闪 虚拟机安装了ubuntu16 desktop,没有关闭自动更新: 结果关机虚拟机时出现等5秒更新,类似win10关机更新: 再开机发现就蓝屏了,多次重启 ...
- KMS服务器激活
https://blog.csdn.net/weixin_42588262/article/details/81120403 http://kms.cangshui.net/ https://kms. ...
- hue创建的hdfs数据在hdfs无法删除的问题。
在linux时删除时出现: rmr: Permission denied: user=root, access=ALL, inode="/user/root/.Trash/191128080 ...
- 阿里云OSS设置跨域访问 H5的时候
OSS 提供 HTML5 协议中的跨域资源共享 CORS 设置,帮助您实现跨域访问.当 OSS 收到一个跨域请求(或者 OPTIONS 请求)时,会读取存储空间对应的 CORS 规则,然后进行相应的权 ...
- Java基础 awt Font 四种字体样式
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- Spring使用多个 <context:property-placeholder/>
Spring中报"Could not resolve placeholder"的解决方案(引入多个properties文件) 解决方案: (1) 在Spring 3.0中,可以写: ...
- Sword CRC算法原理
CRC校验原理 CRC校验其根本思想a.发送端和接收端约定一个整数 bb.发送端在原始数据帧后面附加一个数 k ,产生一个新的数据帧c.接收端接收到数据帧后,对接收的数据帧和整数 b 进行位异或操作, ...
- C语言 按位异或实现加法
/* C语言 按位异或实现加法 */ #include <stdio.h> #include <stdlib.h> #include <string.h> void ...
- docker 运行 sqlserver
docker 运行 sqlserver docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=sa123456' -e 'MSSQL_PID=Deve ...
- Egret自定义位图文字(自定义+BitmapLabel)
一 自定位图文字 因为egret的位图文字是texturemerger做的,需要多张单图片导入tm,然后导出两个文件来使用,过程比较麻烦. 而Laya的位图文字则是一张整图数字图片,使用FontCli ...