Dubbo 服務性能壓測(with JMeter)

原文地址: Dubbo 服務性能壓測(with JMeter)

轉載請註明出處!git

前言

最近在作Dubbo服務與Prometheus的監控集成,爲了測試監控組件對Dubbo RPC 調用的性能影響,就須要對添加先後作性能測試。雖然以前給組內搭建了統一的Dubbo 服務測試平臺,可是沒法用於性能測試。github

提及性能測試,你們可能會有不少選擇,wrk、JMeter等等。可是相信你們通常都是用於測試HTTP接口,對於這種Dubbo框架的這種私有協議dubbo://,這些工具沒有提供原生的支持。第一個想法就是經過Dubbo 的泛化調用來本身寫一個客戶端,而後統計測試結果,可是這樣一是不優雅,二是有可能重複造輪子,浪費時間。通過一番google以後,果真獲得了想要的答案。apache

今天要介紹的,就是一款來自於Dubbo 社區的JMeter 插件jmeter-plugins-for-apache-dubbo,使用這款插件,就可讓JMeter 對Dubbo 服務的測試。json

本文假定讀者使用JMeter 進行過簡單的性能測試,而且安裝了 JMeter

正文

Step 1:安裝Dubbo 插件

  1. 克隆項目:git clone https://github.com/thubbo/jmeter-plugins-for-apache-dubbo.git
  2. 打包項目,構建 JMeter 插件:mvn clean install

    或者你能夠直接跳過上面兩步,下載 jmeter-plugins-dubbo-2.7.3-jar-with-dependencies.jar服務器

  3. 將插件添加到 ${JMETER_HOME}\lib\ext(安裝完以後重啓jmeter)

image.png

Step 2:編寫JMeter 腳本

一、建立Dubbo Sample框架

【測試計劃】 區域右鍵單擊 【線程組】,並選擇 【添加】 > 【取樣器】 > Dubbo Sampleide

image.png

Dubbo Sample 對話框中配置註冊中心地址、服務接口名(Java interface 類名)、方法名、參數類型和參數值等信息。工具

配置步驟以下:性能

  • 配置註冊中心,一般使用 ZooKeeper。(配置完成以後,點擊上面Get Provider List 按鈕獲取註冊的服務列表)測試

    • Protocol 選擇爲 zookeeper,則 Address 填寫 ZooKeeper 地址。
    • 若生產環境一般包含多個 ZooKeeper 節點,可填寫多個 ZooKeeper 地址並用英文逗號(,)隔開。
    • 若針對單臺服務器進行測試,則將 Protocol 選擇 noneAddress 填寫 Dubbo 服務地址。
  • 按需調整服務調用配置,如分組 Group、版本 Version、調用超時時間 Timeout(默認爲 1 秒)等。
  • 配置 Dubbo 服務的完整 Java 接口類名和方法名。
  • 配置每一個參數的參數類型和參數值。

    • 參數類型:基本類型(如 boolean, int 等)直接寫類型名,其餘類型寫完整 Java 類名(注意哦,是完整類名)。
    • 參數值:基本類型和字符串直接寫參數值,複雜類型用 JSON 表示填寫

image.png

爲了方便本地調試測試腳本,能夠添加結構監聽器,右鍵單擊 【線程組】,選擇 【添加】 > 【監聽器】> 【察看結果樹】,添加 察看結果樹 監聽器。

Step 3:測試執行

【線程組】上右擊,點擊【驗證】,執行單次請求,來測試工具與服務的聯通性。

【察看結果樹】選項卡中能夠看到【響應數據】返回如預期,說明能夠正常執行 Dubbo 調用了。

image.png

Step 4:添加斷言

有時候你會看到執行結果顯示成功,可是實際上Dubbo 服務調用失敗了,或者業務處理失敗,返回結果中包含了錯誤碼。好比下面兩張圖。

RPC 調用失敗。

image.png

業務處理失敗。

image.png

解決方法:

針對此類問題,能夠添加斷言來檢查服務是否成功。泛化調用的結果以 JSON 形式返回,能夠添加斷言檢查返回的 JSON 數據,以更準確的校驗服務執行是否成功。

具體步驟就是,在 jmeter的 【測試計劃】 區域右鍵單擊 Dubbo Sample,並選擇 【添加】 > 【斷言】 > 【JSR233 Assertion】

image.png

這裏我給出個人groovy 測試腳本代碼:

String respStr = null;
Map<String, Object> resp = null;
try {
    respStr = SampleResult.getResponseDataAsString();
    resp = (Map<String, Object>) com.alibaba.fastjson.JSON.parse(respStr);
} catch (Throwable ex) {
    // pass
    log.error("error", ex);
}
if (resp == null) {
    AssertionResult.setFailure(true);
    AssertionResult.setFailureMessage("RESPONSE IS NOT JSON: " + respStr);
} else {
    // 簡單檢查: dubbo 泛化調用失敗時, 返回 JSON 包含 code 和 detailMessage 字段.
    if (resp.get("code") != null && resp.get("detailMessage")) {
        AssertionResult.setFailure(true);
        AssertionResult.setFailureMessage("rpc exception, code=" + resp.get("code") + " detailMessage=" + resp.get("detailMessage"));
    } else if(!"SUCCESS".equals((String)resp.get("code"))) {
        // TODO 根據你本身的實際業務,校驗請求是否成功.
        AssertionResult.setFailure(true);
        AssertionResult.setFailureMessage("請求失敗, code=" + resp.get("code"));
    } else {
        AssertionResult.setFailure(false);
    }
}

image.png

讓咱們看看,添加了斷言以後,再驗證的結果。

image.png

能夠看到,斷言起到了業務校驗的做用,而且提示了報錯信息。

至於如何編寫腳本的其餘部分,就要考慮你要模擬的場景來設置了,屬於如何使用JMeter的部分,因此這裏就不過多敘述。

更多常見問題

關於該插件的更多常見問題,請參考該插件的github wiki中的FAQ

參考

相關文章
相關標籤/搜索