原文地址: 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
git clone https://github.com/thubbo/jmeter-plugins-for-apache-dubbo.git
mvn clean install
或者你能夠直接跳過上面兩步,下載 jmeter-plugins-dubbo-2.7.3-jar-with-dependencies.jar服務器
${JMETER_HOME}\lib\ext
(安裝完以後重啓jmeter)
一、建立Dubbo Sample框架
在 【測試計劃】 區域右鍵單擊 【線程組】,並選擇 【添加】 > 【取樣器】 > Dubbo Sampleide
在 Dubbo Sample 對話框中配置註冊中心地址、服務接口名(Java interface 類名)、方法名、參數類型和參數值等信息。工具
配置步驟以下:性能
配置註冊中心,一般使用 ZooKeeper。(配置完成以後,點擊上面Get Provider List
按鈕獲取註冊的服務列表)測試
zookeeper
,則 Address 填寫 ZooKeeper 地址。none
,Address 填寫 Dubbo 服務地址。配置每一個參數的參數類型和參數值。
爲了方便本地調試測試腳本,能夠添加結構監聽器,右鍵單擊 【線程組】,選擇 【添加】 > 【監聽器】> 【察看結果樹】,添加 察看結果樹 監聽器。
在【線程組】上右擊,點擊【驗證】,執行單次請求,來測試工具與服務的聯通性。
在【察看結果樹】選項卡中能夠看到【響應數據】返回如預期,說明能夠正常執行 Dubbo 調用了。
有時候你會看到執行結果顯示成功,可是實際上Dubbo 服務調用失敗了,或者業務處理失敗,返回結果中包含了錯誤碼。好比下面兩張圖。
RPC 調用失敗。
業務處理失敗。
解決方法:
針對此類問題,能夠添加斷言來檢查服務是否成功。泛化調用的結果以 JSON 形式返回,能夠添加斷言檢查返回的 JSON 數據,以更準確的校驗服務執行是否成功。
具體步驟就是,在 jmeter的 【測試計劃】 區域右鍵單擊 Dubbo Sample,並選擇 【添加】 > 【斷言】 > 【JSR233 Assertion】。
這裏我給出個人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); } }
讓咱們看看,添加了斷言以後,再驗證的結果。
能夠看到,斷言起到了業務校驗的做用,而且提示了報錯信息。
至於如何編寫腳本的其餘部分,就要考慮你要模擬的場景來設置了,屬於如何使用JMeter的部分,因此這裏就不過多敘述。
關於該插件的更多常見問題,請參考該插件的github wiki中的FAQ。