Jmeter测试Dubbo接口
前言
本篇 介绍 2 种方式 使用jmeter 测试dubbo接口
- 通过 jmeter 二次开发的方式(jar)方式调用 (推荐,对编码能力有要求)
- 通过 插件 jmeter-plugins-dubbo 调用
通过 jmeter 二次开发的方式(jar)方式调用
粟子: 目标 服务 TestService addEdit()方法
资源配置
// 工程 lib 文件下,引入相关资源
1.测试 服务TestService 需要的依赖资源:TestService.jar
2.Jmeter相关依赖jar: jorphan.jar、ApacheJMeter_java.jar、ApacheJMeter_core.jar
3.dubbo资源:dubbo.xsd
// 资源路径
// 1.jorphan.jar (jmeter/lib 用于main调试执行)
// 2.ApacheJMeter_java.jar、ApacheJMeter_core.jar (jmeter/lib/ext/)
// 3.dubbo.xsd 可直接通过 pom下载 dubbo资源,从Maven 仓库对应的 dubbo中复制一份 dubbo.xsd
- 新建 maven工程,在pom.xml配置 添加以下依赖:Dubbo、Spring、
- 还需要添加 对应 测试服务的依赖 test service
<!--pom.xml配置-->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hank</groupId>
<artifactId>dubbo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- spring test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- Test Service -->
<dependency>
<groupId>com.user.test.service</groupId>
<artifactId>TestService</artifactId>
<!--<version>2.0.0</version>-->
</dependency>
</dependencies>
</project>
- Dubbo 服务消费者的spring 配置:resources目录下创建 consumer.xml 配置(消费者 )
消费者 consumer.xml 配置内容,可直接参考 对应服务 TestService 的 消费者配置文件
(可从测试环境 对应服务的 部署路径下查找对应的 消费者配置文件 如:dubbo_client.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">
<description>Dubbo Consumer 配置</description>
<!-- id为接口的名字在程序种应用时可以通过@Resource注解实例化。
interface为引用的接口的类的全路径。
registry 为仓库的地址的id
check 为spring初始化时是否检查服务是否可用
-->
<dubbo:application name="Test-service" owner="hank"/>
<dubbo:consumer timeout="5000" check="false" lazy="true" retries="0"/>
<dubbo:registry id="regTest" address="zookeeper://192.168.1.60:2020"/>
<dubbo:reference id="TestService" interface="com.user.test.service.TestService" registry="regTest" check="false" version="2.0.0"/>
</beans>
- 测试类编写
package com.hank.api;
import com.test.TestServicePlayCriteria;
import com.test.service.TestService;
import com.test.params.Empty;
import com.test.params.Result;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Description
*
* @Author Hank
* @Date Created in 2019-12-30 15:53
* Jmeter 统计时间需添加,否则从jmeter调用时,无法统计不对应请求的响应时间
*/
public class ApiDubbo extends AbstractJavaSamplerClient{
private static ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-dubbo-consumer.xml");
private static TestService testService;
private static long start = 0;
private static long end = 0;
public void setupTest(JavaSamplerContext arg0){
testService=(TestService)context.getBean("testService");
start = System.currentTimeMillis();
}
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult sr = new SampleResult();
sr.setSamplerData("Dubbo Api 测试");
sr.sampleStart();// jmeter 开始统计响应时间标记
long userId = 505009;
TestServicePlayCriteria testServicePlayCriteria = new TestServicePlayCriteria();
testServicePlayCriteria.setDrugName("test_dubbo");
testServicePlayCriteria.setDosage("50");
testServicePlayCriteria.setEffect("test");
testServicePlayCriteria.setUserId(userId);
Result<Empty> result = testService.addOrEdit(TestServicePlayCriteria);
if(result.getCode().equals("00000")){ // 接口调用结果判断
sr.setDataType(SampleResult.TEXT);
sr.setSuccessful(true); //设置 jmeter 返回状态 成功:true
}else{
sr.setSuccessful(false); //设置 jmeter 返回状态 失败:false
}
sr.setSamplerData(result.getCode()); // 设置 jmeter 请求返回 显示内容
sr.sampleEnd();
return sr;
}
public void teardownTest(JavaSamplerContext arg0) {
end = System.currentTimeMillis();
// 总体耗时
System.err.println("cost time:" + (end - start) + "毫秒");
}
}
- 本地调试
package com.hank.api;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
/**
* Description
*
* @Author Hank
* @Date Created in 2019-12-31 17:18
*/
public class TestMain {
private static JavaSamplerContext ar = new JavaSamplerContext(new Arguments());
public static void main(String args[]){
testApiDubbo();
}
public static void testApiDubbo(){
ApiDubbo apiDubbo = new ApiDubbo();
apiDubbo.setupTest(ar);
apiDubbo.runTest(ar);
}
}
- 本地调试结果

- 打包jar(本地调试 ok 后,打jar,放到 jmeter/lib/ext/)
//打包流程
// jar 存放路径 在默认当前工程 out/artifats/下
1.File -> Project Structure -> Artifats -> add Library file
2.Build -> Build Artifats -> Builds


- Jmeter 添加 之前打的jar包,然后重启 jmeter

- 调用结果

以上 是 通过 jmeter 二次开发的方式(jar)方式调用
通过 插件 jmeter-plugins-dubbo 方式调用
// Jmeter 本身是不支持 Dubbo接口调用的,需要下载第三方 插件来支持
// 下载 jmeter-plugins-dubbo-1.3.8-jar-with-dependencies.jar 放置 jmeter/lib/ext/ 重启jmeter
// 需添加其它的依赖资源:
dubbo-2.5.3.jar
javassist-3.15.0-GA.jar
zookeeper-3.4.6.jar
zkclient-0.1.jar
jline-0.9.94.jar
netty-3.7.0-Final.jar
slf4j-api-1.7.5.jar
log4j-over-slf4j-1.7.5.jar
// 注意事项
1.当使用zk,address填入zk地址(集群地址使用","分隔),使用dubbo直连,address填写直连地址和服务端口
2.timeout:服务方法调用超时时间(毫秒)
3.version:服务版本,与服务提供者的版本一致
4.retries:远程服务调用重试次数,不包括第一次调用,不需要重试请设为0
5.cluster:集群方式,可选:failover/failfast/failsafe/failback/forking
6.group: 服务分组,当一个接口有多个实现,可以用分组区分,必需和服务提供方一致
7.接口需要填写类型完全名称,含包名
8.参数支持任何类型,包装类直接使用java.lang下的包装类,小类型使用:int、float、shot、double、long、byte、boolean、char,自定义类使用类完全名称。
9.参数值,基础包装类和基础小类型直接使用值,例如:int为1,boolean为true等,自定义类与List或者Map等使用json格式数据。
- Jmerter操作界面
