天天看點

實戰Jmeter壓測Dubbo服務接口

作者:技術聯盟總壇

一、前言

最近在做一些業務上雲的項目,其中遠端Rpc調用方式我們選擇了Dubbo,為便于收集壓測資訊,我們選擇了使用Jmeter來做壓測工具,本文就來簡單介紹如何使用Jmeter壓測Dubbo服務接口,以及需要注意的事情。

二、Jmeter使用

2.1 下載下傳Jmeter

在 https://jmeter.apache.org/download_jmeter.cgi 下載下傳二進制包

實戰Jmeter壓測Dubbo服務接口

下載下傳後解壓縮後,目錄如下:

實戰Jmeter壓測Dubbo服務接口

2.2 界面模式啟動

進入解壓目錄的bin目錄,然後mac下執行 sh jmeter.sh ,如下圖:

實戰Jmeter壓測Dubbo服務接口

然後就會彈出界面:

實戰Jmeter壓測Dubbo服務接口

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:

實戰Jmeter壓測Dubbo服務接口

然後需要把打成的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結構如下:

實戰Jmeter壓測Dubbo服務接口

其中lib中會包含所有依賴的jar.

4.2 測試

按照上面講解的執行sh jmeter.sh啟動 界面

然後添加線程組

實戰Jmeter壓測Dubbo服務接口

然後可以設定壓測線程個數等屬性

實戰Jmeter壓測Dubbo服務接口

然後添加Java請求配置元件

實戰Jmeter壓測Dubbo服務接口

然後在類名稱這下拉框中就會存在dubbo插件類,

實戰Jmeter壓測Dubbo服務接口

然後線程組設定線程個數,并儲存:

實戰Jmeter壓測Dubbo服務接口

到這裡說明Jmeter已經找到了我們的dubbo擴充插件,下面我們添加一些螢幕以便監控結果

實戰Jmeter壓測Dubbo服務接口

這裡你可以選擇你需要的監控頁面

最後單擊綠色三角 開始壓測:

實戰Jmeter壓測Dubbo服務接口

注意:dubbo服務提供方線程池預設是200個線程,如果你壓測時候設定線程個數超過200,則會抛出下面異常:

實戰Jmeter壓測Dubbo服務接口

這時候你需要修改服務提供方的線程池中線程個數,具體是調用ProtocolConfig類的setThreads方法來設定,或者如果是xml方式,使用下面方式設定:

實戰Jmeter壓測Dubbo服務接口

繼續閱讀