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);
    }

}
  • 本地调试结果



java怎么获取dubbo的methodName java调用dubbo接口测试_java


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



java怎么获取dubbo的methodName java调用dubbo接口测试_zookeeper_02



java怎么获取dubbo的methodName java调用dubbo接口测试_分布式_03


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


java怎么获取dubbo的methodName java调用dubbo接口测试_分布式_04


  • 调用结果


java怎么获取dubbo的methodName java调用dubbo接口测试_java_05


以上 是 通过 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操作界面


java怎么获取dubbo的methodName java调用dubbo接口测试_java_06