前言
本篇 介绍 2 种方式 使用jmeter 测试dubbo接口
粟子: 目标 服务 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
<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.0modelVersion>
<groupId>com.hankgroupId>
<artifactId>dubboartifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>dubboartifactId>
<version>2.6.2version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-frameworkartifactId>
<version>2.9.1version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-clientartifactId>
<version>2.9.1version>
dependency>
<dependency>
<groupId>org.apache.zookeepergroupId>
<artifactId>zookeeperartifactId>
<version>3.4.6version>
dependency>
<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
<version>0.10version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.1.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>5.1.5.RELEASEversion>
dependency>
<dependency>
<groupId>com.user.test.servicegroupId>
<artifactId>TestServiceartifactId>
dependency>
dependencies>
project>
消费者 consumer.xml 配置内容,可直接参考 对应服务 TestService 的 消费者配置文件
(可从测试环境 对应服务的 部署路径下查找对应的 消费者配置文件 如:dubbo_client.xml)
<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>
<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 存放路径 在默认当前工程 out/artifats/下
1.File -> Project Structure -> Artifats -> add Library file
2.Build -> Build Artifats -> Builds
以上 是 通过 jmeter 二次开发的方式(jar)方式调用
// 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格式数据。