• 4
  • 4
分享

用Jmeter实现dubbo接口测试的文章,网上可以找到很多,但是只看不练假把式。废话不多说,直接上干货。写这篇文章的过程也是自己不断学习的过程。

一、准备

(1)自行下载安装zookeeper-3.4.6(这里的版本是我用的,可以自行下载自己喜好的版本)

(2)自行下载apache-jmeter-3.1,这是免安装的,解压后\Jmeter\apache-jmeter-3.1\bin目录下执行jmeter.bat即可启动。

(3)开发环境STS(即Spring Tool Suite)

(4)dubbo-admin-2.4.1(这个是非必须的,主要是为了查看Dubbo的服务提供者和消费者)


 二、编写我们的测试工程

先明确下我们编写工程的过程,dubbo主要是通过实现一个接口,将服务暴露出去。所以我们创建工程的时候,最好分开创建。可以分为:


 

下面我们分别来看:

1.接口工程

通过STS创建一个Spring Project。命名为Interface-service。在这个工程里面只新建一个接口,命名为DubboService.java。其代码如下:

package com.dubbo.provider.Interface_service;

public interface DubboService {
    public abstract void print();
}

其工程目录结构为:


此工程的其他内容都默认即可,不用做任何处理。


2.服务提供者dubbo-provider01的创建

通过STS创建一个Spring Project。命名为dubbo-provider01。其目录结构如下:


(1)通过pom.xml文件引入Interface-service的jar、dubbo服务的jar、zkclient的jar。这三个jar是必须要在pom文件中进行引用的,如果不引用后面会报错。引用代码为:

<dependency>
<groupId>com.dubbo.provider</groupId>
<artifactId>Interface-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>

 其中我们看Interface-service的引用,它的版本号哪里来的,我们在引用前,必须先对Interface-service这个工程进行maven install,生成其jar,其jar包在target目录下,如下图所示:


此时我们获取到Interface-service-0.01-SNAPSHOT.jar,在dubbo-provider01中可以引用了。

(2)编写dubbo-provider.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">
<!-- <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:aop="http://www.springframework.org/schema/aop" 
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"
default-lazy-init="true">
-->
<!-- 具体实现的bean -->
<bean id="dubboservice" class="com.dubbo.provider.demo.DubboServiceImpl" /> 
<!-- 定义应用名称 --> 
<dubbo:application name="dubbo-provider01"/> 

<!--zk注册中心的地址--> 
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> 

<!-- 用dubbo协议在21000端口暴露服务 --> 
<dubbo:protocol name="dubbo" port="21000" /> 

<!-- 配置服务接口 --> 
<dubbo:service interface="com.dubbo.provider.Interface_service.DubboService" ref="dubboservice" /> 

</beans>

 其中在编写xml文件前,必须先在windows->>preferences->>XML Catalog中add,详见我的博客。

(3)配置log4j.properties文件,文件内容为:

log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

(4)在src/main/java下新建包com.dubbo.provider.demo,再在包com.dubbo.provider.dem下新建接口DubboService.java的实现类DubboServiceImpl.java。其源码为:

package com.dubbo.provider.demo;
import org.springframework.stereotype.Service;
import com.dubbo.provider.Interface_service.DubboService;
@Service("dubboservice")
public class DubboServiceImpl implements DubboService{
public void print() {
System.out.println("欢迎您的操作");
}
}

 (5)在src/test/java下新建包com.dubbo.provider.test,再在包com.dubbo.provider.test下新建启动服务的测试类TestProvider.java。其源码为:

package com.dubbo.provider.test;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.alibaba.dubbo.common.URL;

public class TestProvider {
    private static final Log log = LogFactory.getLog(TestProvider.class);  
    public static void main(String[] args) {
         try {  
             ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:dubbo-provider.xml");  
             context.start();  
         } catch (Exception e) {  
             log.error("== DubboProvider context start error:",e);  
         }  
         synchronized (TestProvider.class) {  
             while (true) {  
                 try {  
                     TestProvider.class.wait();  
                 } catch (InterruptedException e) {  
                     log.error("== synchronized error:",e);  
                 } 

             }  
         }  
    }
}

(6)首先启动ZK、再次启动estProvider.java,在启动Tomcat。最后查看其服务注册情况:


可以看到我们的服务提供者已经创建成功了。(怎样使用dubbo-admin查看dubbo服务可以参考我的博文:)


 3.消费者dubbo-consumer的创建

通过STS创建一个Spring Project,其目录结构如下图所示:


(1)pom.xml文件的引用,此时我们需要注意一个问题,作为消费者要调用服务提供者,所以必须要引入服务提供者的jar包,请注意我们引用的还应该是Interface-service的jar而并非是dubbo-provider01的jar。代码如下:

<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>org.springframework.samples</groupId>
  <artifactId>dubbo-consumer</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <properties>

        <!-- Generic properties -->
        <java.version>1.6</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <!-- Spring -->
        <spring-framework.version>3.2.3.RELEASE</spring-framework.version>

        <!-- Hibernate / JPA -->
        <hibernate.version>4.2.1.Final</hibernate.version>

        <!-- Logging -->
        <logback.version>1.0.13</logback.version>
        <slf4j.version>1.7.5</slf4j.version>

        <!-- Test -->
        <junit.version>4.11</junit.version>

    </properties>
    
    <dependencies>
        <!-- Spring and Transactions -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
        <groupId>com.dubbo.provider</groupId>
        <artifactId>Interface-service</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.5.3</version>
        </dependency>
        <dependency>
        <groupId>com.github.sgroschupf</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>

        <!-- Logging with SLF4J & LogBack -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
            <scope>runtime</scope>
        </dependency>

        <!-- Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>

        
        <!-- Test Artifacts -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring-framework.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>    
</project>

(2)编写dubbo-consumer.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="dubbo-consumer" />  
       
    <!-- 填写zk注册中心的地址 -->  
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />  
      
    <!-- 引用服务提供接口的路径 -->  
    <dubbo:reference interface="com.dubbo.provider.Interface_service.DubboService" id="dubboservice" />  
  
</beans>    

(3)编写log4j.properties文件,内容与服务提供者的一致即可,不在赘述。

(4)在src/test/java下新建包com.dubbo.consumer.demo,再在包com.dubbo.consumer.demo下新建测试类TestConsumer.java,启动消费者,其源码如下:

package com.dubbo.consumer.demo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dubbo.provider.Interface_service.DubboService;

public class TestConsumer {
    private static final Log log = LogFactory.getLog(TestConsumer.class);  
    
    public static void main(String[] args) throws InterruptedException {  
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:dubbo-consumer.xml");  
        context.start();  
        DubboService demoService = (DubboService)context.getBean("dubboservice");   
        demoService.print();
       // log.info("打印"+demoService.print());            
        Thread.sleep(100000);    
    }  
}

(5)确保服务提供者正常启用的情况下,运行TestConsumer.java,运行结果如下:


(6)此时在查看dubbo服务:


我们可以看到dubbo-consumer这个dubbo服务业注册成功了,从此这个工程就搭建完毕了。


三、Jmeter来测试这个工程

(1)导出dubbo-consumer工程依赖的所有jar包:导出方法cmd到工程所在路径下执行mvn dependency:copy-dependencies命令即可:此时会在工程的target目录下新增一个

dependency目录


(2)将dependency目录中的jar全部复制粘贴到:Jmeter的lib目录下,如果有重复的jar包,则保留Jmeter的jar包。

(3)Run as工程dubbo-consumer,选择maven install。生成dubbo-consumer-0.0.1-SNAPSHOT.jar。

将dubbo-consumer-0.0.1-SNAPSHOT.jar放到Jmeter的\Jmeter\apache-jmeter-3.1\lib\ext路径下。

(4)以管理员身份打开Jmeter。新建一个线程组,新建一个java请求,增加查看结果树;此时运行java请求:


剩下的事情就是如何写测试脚本了,这个我们以后慢慢说~~~~~

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 最近参加了公司内部的一个24小时编程比赛,组了个四人的小团队,设计了一个拍卖的功能,功能需求如下:1. 登陆2. 支付保证金3. 商品信息展示阶段4. 拍卖阶段叫价(最后一秒有人出价会延时5分钟)5. 尾款支付针对功能需求我们计划创建三个项目,一个后台拍卖活动数据维护,一个小程序做C端,一个api项目对前面两个项目做接口层的支持,业务流程走向如下:接口层部分做了如下8个接口,当然还有8个数据维护的接口这里就不列举了,就是针对表数据的一个增删改查,后面看DB设计即可知晓,流程没有画的特别详细但是主要流程都写了下面看下DB设计一共5张表下面看下我们后端维护数据的页面设计:这边设计的后台数据维护功能...
            11 11 1623
            分享
          • 【摘要】随着互联网金融的兴起,互联网企业依托互联网,特别是移动互联网为公众提供越来越多方便快捷、稳定高效的金融类服务,对传统的银行业务带来了很大冲击。作为应对,传统银行也在业务上不断创新,带来对IT基础设施和应用架构方面进行转型升级的要求,譬如银行内部的业务系统在开发、测试、部署、以及运维还以传统模式为主,无法满足业务创新要求的快速、弹性、敏捷等特性,同时也缺少整合、高效的基础设施平台支撑。近年云计算技术发展和云原生技术的不断迭代演进,云原生产品能力也在不断成熟和完善,云原生架构逐渐成为传统银行的IT架构选型方向。传统银行基于云原生技术建设并推广适合自身的容器云平台,实现传统应用迁移上云和云原...
            0 0 2078
            分享
          •   作为一个已经有多年工程师面试经验,并在国内的大企业,小企业,国外的大企业,小企业混迹过的面试官(注意,我是技术人员,不是HR),我面过很多形形色色的求职者,也有自己的思考。这篇文章希望能帮助到正在面试中的人们。  每年的校园招聘季,阅读和筛选简历都是我重要的工作之一。在一上午时间内怀着生怕错误优秀人才的心态伏案阅读了接近40份简历的我来说,在简历中看到让自己“情何以堪”的内容吐个槽,似乎也合情合理。  不过,简历中是否应该包含“精通”并非是我吐槽的重点,目前完全由于应届毕业生在简历中写了过多精通而被直接挂掉的事情在我身上还未发生过,过多的“精通”表述最多只是我看不惯的一个点而已。  看到回...
            0 0 1361
            分享
          • 1.2.计算机网络1.2.1.计算机通信网的组成计算机网络由通信子网和资源子网组成。其中通信子网负责数据的无差错和有序传递,其处理功能包括差错控制、流量控制、路由选择、网络互连等。其中资源子网:是计算机通信的本地系统环境,包括主机、终端和应用程序等,资源子网的主要功能是用户资源配置、数据的处理和管理、软件和硬件共享以及负载均衡等。计算机通信网就是一个由通信子网承载的、传输和共享资源子网的各类信息的系统。1.2.2.通信协议为了完成计算机之间有序的信息交换,提出了通信协议的概念,其定义是相互通信的双方(或多方)对如何进行信息交换所必须遵守的一整套规则。协议涉及到三个要素,分别为:语法:语法是用户...
            13 15 3378
            分享
          •   OPPO K12 手机官宣 4 月 24 日 14:30 发布,口号“为 5 亿大众用户普及百瓦闪充长续航”。  OPPO K12 拥有两款配色,与此前爆料的渲染图基本一致。该机预计配备 5500mAh 电池,支持 100W 快充,内部代号“皮卡丘”,还将与“一个雷电人物”进行联名。  一款型号为 PJR110 的 OPPO 新机在工信部完成入网,但并不确定官方名称。爆料称,这款新品为 OPPO K12 手机,可以参考海外发布的一加 Nord CE 4 手机。  一加 Nord CE 4 手机搭载了高通骁龙 7 Gen 3 处理器 ,搭配 LPDDR4X + UFS 3.1 组合,配备 6...
            0 0 844
            分享
      • 51testing软件测试圈微信