準(zhǔn)備兩臺(tái)機(jī)器,一臺(tái)用于部署dubbo的服務(wù)端代碼,另一臺(tái)安裝jmeter,用于運(yùn)行客戶(hù)端的測(cè)試腳本。采用zookeeper作為dubbo的注冊(cè)中心。本次測(cè)試所有依賴(lài)的版本信息如下:
· jdk版本:1.7
· maven版本:3.3
· jmeter版本:3.0
· dubbo版本:2.5.4
為簡(jiǎn)單起見(jiàn),我們直接使用dubbo官方提供的demo工程來(lái)進(jìn)行講解。
服務(wù)端部署
具體步驟
1、首先clone dubbo的官方代碼,編譯安裝:
# cd ~
# git clone https://github.com/alibaba/dubbo.git
# cd dubbo
# mvn clean install -DskipTests=true
2、安裝成功之后,我們進(jìn)入demo工程,解壓服務(wù)端的代碼:
# cd dubbo-demo/dubbo-demo-provider/target
# tar zxvf dubbo-demo-provider-2.5.4-SNAPSHOT-assembly.tar.gz
# cd dubbo-demo-provider-2.5.4-SNAPSHOT
我們需要編輯dubbo的配置文件,使其采用zookeeper作為注冊(cè)中心(默認(rèn)情況下采用組播注冊(cè)中心):
# vim conf/dubbo.properties
修改好之后的配置文件內(nèi)容如下:
dubbo.container=log4j,spring
dubbo.application.name=demo-provider
dubbo.application.owner=
dubbo.registry.address=zookeeper://10.168.120.xxx:2181
dubbo.monitor.protocol=registry
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.service.loadbalance=roundrobin
dubbo.log4j.file=logs/dubbo-demo-provider.log
dubbo.log4j.level=WARN
zookeeper的地址根據(jù)自己的實(shí)際情況填寫(xiě)即可。
3、啟動(dòng)服務(wù):
# bin/start.sh
如果啟動(dòng)成功,會(huì)有如下的輸出:
Starting the demo-provider ......OK!
PID: 28164
STDOUT: logs/stdout.log
注意點(diǎn)
1、如果出現(xiàn)啟動(dòng)失敗,或者注冊(cè)中心注冊(cè)失敗的問(wèn)題,請(qǐng)檢查注冊(cè)中心的ip地址是否配置成功,以及防火墻是否開(kāi)放了對(duì)應(yīng)的端口。
2、默認(rèn)情況下,start.sh里配置的jvm堆棧大小為2g,如果自己的機(jī)器內(nèi)存不夠的話(huà),可以調(diào)低start.sh里面jvm堆棧大小的配置。
3、如果還有其他問(wèn)題,可以通過(guò)logs文件夾下的日志進(jìn)一步分析。
客戶(hù)端部署
具體步驟
我們借助jmeter的java sampler來(lái)調(diào)用服務(wù)端的接口進(jìn)行測(cè)試,所以我們需要將原先的客戶(hù)端里的代碼和java sampler進(jìn)行結(jié)合。我們?cè)趧偛诺膁emo工程目錄下,創(chuàng)建我們的測(cè)試類(lèi):
# vim ~/dubbo/dubbo-demo/dubbo-demo-consumer/src/main/java/com/alibaba/dubbo/demo/consumer/DemoConsumer.java
具體代碼如下:
package com.dubbo.test;
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.support.ClassPathXmlApplicationContext;
import com.alibaba.dubbo.demo.DemoService;
import java.util.Random;
public classDemoConsumerextendsAbstractJavaSamplerClient{
private DemoService demoService = null;
@Override
publicvoidsetupTest(JavaSamplerContext context){
super.setupTest(context);
ClassPathXmlApplicationContext springContext = new ClassPathXmlApplicationContext(new String[] { "dubbo-demo-consumer.xml" });
springContext.start();
demoService = (DemoService) springContext.getBean("demoService");
}
@Override
publicSampleResultrunTest(JavaSamplerContext javaSamplerContext){
SampleResult sr = new SampleResult();
Random r = new Random();
try {
sr.sampleStart();
String result = demoService.sayHello(r.nextInt(100000) + "");
sr.setResponseData("from provider:" + result, null);
sr.setDataType(SampleResult.TEXT);
sr.setSuccessful(true);
sr.sampleEnd();
}
catch (Exception e) {
e.printStackTrace();
}
return sr;
}
@Override
publicvoidteardownTest(JavaSamplerContext context){
super.teardownTest(context);
}
}
自定義的java sampler測(cè)試類(lèi)需要繼承AbstractJavaSamplerClient抽象類(lèi),然后我們需要重載setupTest、runTest以及teardownTest這三個(gè)方法:
· setupTest:用于構(gòu)建測(cè)試環(huán)境。我們?cè)谶@里可以初始化spring以及dubbo上下文,獲取服務(wù)端的bean。
· runTest:具體的測(cè)試邏輯。我們?cè)谶@里向服務(wù)端發(fā)送了一個(gè)隨機(jī)數(shù)字字符串,然后借助SampleResult類(lèi)將服務(wù)端的返回值回顯到j(luò)meter。
· teardownTest:執(zhí)行收尾工作,比如釋放相關(guān)資源等。
同時(shí),我們需要在pom里添加jmeter對(duì)應(yīng)的依賴(lài):
# vim ~/dubbo/dubbo-demo/dubbo-demo-consumer/pom.xml
添加的依賴(lài)如下:
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>3.0</version>
</dependency>
將dubbo.properties以及dubbo-demo-consumer.xml文件拷貝到resources根目錄下,方便程序讀取配置文件,否則需要做些額外的工作使他們納入到classpath中:
# cd ~/dubbo/dubbo-demo/dubbo-demo-consumer
# cp src/main/assembly/conf/dubbo.properties src/main/resources
# cp src/main/resources/META-INF/spring/dubbo-demo-consumer.xml src/main/resources
然后編輯dubbo.properties文件,使客戶(hù)端也采用zookeeper作為注冊(cè)中心:
dubbo.container=log4j,spring
dubbo.application.name=demo-consumer
dubbo.application.owner=
dubbo.registry.address=zookeeper://10.168.120.xxx:2181
dubbo.monitor.protocol=registry
dubbo.log4j.file=logs/dubbo-demo-consumer.log
dubbo.log4j.level=WARN
在dubbo-demo-consumer文件夾下重新執(zhí)行 mvn clean install -DskipTests=true ,然后解壓target目錄下的dubbo-demo-consumer-2.5.4-SNAPSHOT-assembly.tar.gz。將解壓目錄的lib文件夾下的所有jar包拷貝到j(luò)meter的lib文件夾下,并且將其中的dubbo-demo-consumer-2.5.4-SNAPSHOT.jar拷貝到j(luò)meter的lib/ext文件夾。
啟動(dòng)jmeter,建立線(xiàn)程組,然后選擇java sampler,并且添加察看結(jié)果樹(shù):
運(yùn)行結(jié)果如下: