一文教你 Dubbo 服务性能压测(with JMeter)
??點擊上方?好好學java?,選擇?星標?公眾號
重磅資訊、干貨,第一時間送達 今日推薦:為什么魂斗羅只有 128 KB卻可以實現(xiàn)那么長的劇情?個人原創(chuàng)+1博客:點擊前往,查看更多 原文地址:https://ricstudio.top/archives/dubbo-benchmark-jmeter 轉載請注明出處!前言
最近在做Dubbo服務與Prometheus的監(jiān)控集成,為了測試監(jiān)控組件對Dubbo RPC 調(diào)用的性能影響,就需要對添加前后做性能測試。雖然之前給組內(nèi)搭建了統(tǒng)一的Dubbo 服務測試平臺,但是無法用于性能測試。
說起性能測試,大家可能會有很多選擇,wrk、JMeter等等。但是相信大家一般都是用于測試HTTP接口,對于這種Dubbo框架的這種私有協(xié)議dubbo://,這些工具沒有提供原生的支持。第一個想法就是通過Dubbo 的泛化調(diào)用來自己寫一個客戶端,然后統(tǒng)計測試結果,但是這樣一是不優(yōu)雅,二是有可能重復造輪子,浪費時間。經(jīng)過一番google之后,果然得到了想要的答案。
今天要介紹的,就是一款來自于Dubbo 社區(qū)的JMeter 插件jmeter-plugins-for-apache-dubbo,使用這款插件,就可以讓JMeter 對Dubbo 服務的測試。
本文假定讀者使用JMeter 進行過簡單的性能測試,并且安裝了JMeter
正文
Step 1:安裝Dubbo 插件
克隆項目:git clone https://github.com/thubbo/jmeter-plugins-for-apache-dubbo.git
打包項目,構建 JMeter 插件:mvn clean install
或者你可以直接跳過上面兩步,下載 jmeter-plugins-dubbo-2.7.3-jar-with-dependencies.jar
將插件添加到 ${JMETER_HOME}\lib\ext(安裝完之后重啟jmeter)
Step 2:編寫JMeter 腳本
1、創(chuàng)建Dubbo Sample
在 【測試計劃】 區(qū)域右鍵單擊 【線程組】,并選擇 【添加】 > 【取樣器】 > Dubbo Sample
image.png在 Dubbo Sample 對話框中配置注冊中心地址、服務接口名(Java interface 類名)、方法名、參數(shù)類型和參數(shù)值等信息。
配置步驟如下:
配置注冊中心,通常使用 ZooKeeper。(配置完成之后,點擊上面Get Provider List 按鈕獲取注冊的服務列表)
若 Protocol 選擇為 zookeeper,則 Address 填寫 ZooKeeper 地址。
若生產(chǎn)環(huán)境通常包含多個 ZooKeeper 節(jié)點,可填寫多個 ZooKeeper 地址并用英文逗號(,)隔開。
若針對單臺服務器進行測試,則將 Protocol 選擇 none,Address 填寫 Dubbo 服務地址。
按需調(diào)整服務調(diào)用配置,如分組 Group、版本 Version、調(diào)用超時時間 Timeout(默認為 1 秒)等。
配置 Dubbo 服務的完整 Java 接口類名和方法名。
配置每個參數(shù)的參數(shù)類型和參數(shù)值。
參數(shù)類型:基本類型(如 boolean, int 等)直接寫類型名,其他類型寫完整 Java 類名(注意哦,是完整類名)。
參數(shù)值:基本類型和字符串直接寫參數(shù)值,復雜類型用 JSON 表示填寫。
為了方便本地調(diào)試測試腳本,可以添加結構監(jiān)聽器,右鍵單擊 【線程組】,選擇 【添加】 > 【監(jiān)聽器】> 【察看結果樹】,添加 察看結果樹 監(jiān)聽器。
Step 3:測試執(zhí)行
在**【線程組】上右擊,點擊【驗證】**,執(zhí)行單次請求,來測試工具與服務的聯(lián)通性。
在**【察看結果樹】選項卡中可以看到【響應數(shù)據(jù)】**返回如預期,說明可以正常執(zhí)行 Dubbo 調(diào)用了。
image.pngStep 4:添加斷言
有時候你會看到執(zhí)行結果顯示成功,但是實際上Dubbo 服務調(diào)用失敗了,或者業(yè)務處理失敗,返回結果中包含了錯誤碼。比如下面兩張圖。
RPC 調(diào)用失敗。
image.png業(yè)務處理失敗。
image.png解決方法:
針對此類問題,可以添加斷言來檢查服務是否成功。泛化調(diào)用的結果以 JSON 形式返回,可以添加斷言檢查返回的 JSON 數(shù)據(jù),以更準確的校驗服務執(zhí)行是否成功。
具體步驟就是,在 jmeter的 【測試計劃】 區(qū)域右鍵單擊 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) {// passlog.error("error", ex); } if (resp == null) {AssertionResult.setFailure(true);AssertionResult.setFailureMessage("RESPONSE IS NOT JSON: " + respStr); } else {// 簡單檢查: dubbo 泛化調(diào)用失敗時, 返回 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 根據(jù)你自己的實際業(yè)務,校驗請求是否成功.AssertionResult.setFailure(true);AssertionResult.setFailureMessage("請求失敗, code=" + resp.get("code"));} else {AssertionResult.setFailure(false);} } image.png讓我們看看,添加了斷言之后,再驗證的結果。
image.png可以看到,斷言起到了業(yè)務校驗的作用,并且提示了報錯信息。
至于如何編寫腳本的其他部分,就要考慮你要模擬的場景來設置了,屬于如何使用JMeter的部分,所以這里就不過多敘述。
更多常見問題
關于該插件的更多常見問題,請參考該插件的github wiki中的FAQ。
參考
jmeter-plugins-for-apache-dubbo)
總結
以上是生活随笔為你收集整理的一文教你 Dubbo 服务性能压测(with JMeter)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么魂斗罗只有 128 KB却可以实现
- 下一篇: Java 将 Word 文档转换为 PD