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