一、前言
最近在做一些業務上雲的項目,其中遠端Rpc調用方式我們選擇了Dubbo,為便于收集壓測資訊,我們選擇了使用Jmeter來做壓測工具,本文就來簡單介紹如何使用Jmeter壓測Dubbo服務接口,以及需要注意的事情。
二、Jmeter使用
2.1 下載下傳Jmeter
在 https://jmeter.apache.org/download_jmeter.cgi 下載下傳二進制包
下載下傳後解壓縮後,目錄如下:
2.2 界面模式啟動
進入解壓目錄的bin目錄,然後mac下執行 sh jmeter.sh ,如下圖:
然後就會彈出界面:
2.3 項目中引入Jmeter依賴
<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>
三、編寫Jmeter需要的Dubbo擴充插件
public class ConsumerHelloService extends AbstractJavaSamplerClient {
private Hello hello = null;
@Override
public SampleResult runTest(JavaSamplerContext context) {
System.out.println("---begin run----");
SampleResult sr = new SampleResult();
try {
sr.sampleStart();
String result = hello.sayHello(UUID.randomUUID().toString());
sr.setResponseData("from provider:" + result, null);
sr.setDataType(SampleResult.TEXT);
sr.setSuccessful(true);
sr.sampleEnd();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("---end run----");
return sr;
}
@Override
public void setupTest(JavaSamplerContext context) {
System.out.println("---begin setup----");
try {
DubboFactory dubboFactory = new DubboFactory();
dubboFactory.setRegistry("127.0.0.1:2181");
dubboFactory.setGroup("dubbo");
dubboFactory.init();
hello = dubboFactory.getReference(Hello.class, "dubbo", null, true, null,
null);
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
throw e;
}
System.out.println("---end setup----");
}
}
- 如上代碼,插件類需要繼承AbstractJavaSamplerClient類,并且重寫runTest和setupTest這兩個方法。
- setupTest方法會在ConsumerHelloService類執行個體化後調用一次,用來執行一些初始化操作,這裡我們用來完成對服務接口Hello的消費,也就是連結服務提供方,并傳回一個Hello的代理類。
- runTest方法則用來具體調用Hello接口的方法,我們壓測也就是頻繁的調用runTest來測試hello的sayHello方法。
四、dubbo插件打包與壓測
4.1 dubbo插件的安裝
首先我們需要把ConsumerHelloService類所在的應用打包為一個jar包,然後把打包好的jar放入到jmeter目錄的apache-jmeter/lib/ext:
然後需要把打成的jar包裡面所依賴的包放入到apache-jmeter/lib。 那麼如何找jar包依賴的jar那,一個簡單的方法是把項目添加springboot的maven插件:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.2.RELEASE</version>
<configuration>
<executable>false</executable>
<excludeDevtools>true</excludeDevtools>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
springboot插件的機制打成的jar結構如下:
其中lib中會包含所有依賴的jar.
4.2 測試
按照上面講解的執行sh jmeter.sh啟動 界面
然後添加線程組
然後可以設定壓測線程個數等屬性
然後添加Java請求配置元件
然後在類名稱這下拉框中就會存在dubbo插件類,
然後線程組設定線程個數,并儲存:
到這裡說明Jmeter已經找到了我們的dubbo擴充插件,下面我們添加一些螢幕以便監控結果
這裡你可以選擇你需要的監控頁面
最後單擊綠色三角 開始壓測:
注意:dubbo服務提供方線程池預設是200個線程,如果你壓測時候設定線程個數超過200,則會抛出下面異常:
這時候你需要修改服務提供方的線程池中線程個數,具體是調用ProtocolConfig類的setThreads方法來設定,或者如果是xml方式,使用下面方式設定: