使用 JMeter 進行 Dubbo 效能測試
1 前言
說道效能測試工具,你會立刻聯想到哪一個?ab(ApacheBench)、JMeter、LoadRunner、wrk…可以說市面上的壓測工具實在是五花八門。那如果再問一句,對 Dubbo 進行效能壓測,你會 pick 哪一個?可能大多數人就懵逼了。可以發現,大多數的壓測工具對開放的協議支援地比較好,例如:HTTP 協議,但對於 Dubbo 框架的私有協議:dubbo
,它們都顯得力不從心了。
如果不從通用的壓測工具上解決 Dubbo 的壓測需求問題,可以自己寫 Dubbo 客戶端,自己統計彙總結果,但總歸不夠優雅,再加上很多開發同學沒有豐富的測試經驗,很容易出現一些偏差。說到底,還是壓測工具靠譜,於是便引出了本文的主角 ——
2 JMeter 介紹
在開始壓測 Dubbo 之前,先簡單介紹一下這款開源的效能測試工具 —— JMeter。JMeter 是 Apache 組織基於 Java 開發的一款效能測試工具。它最初被設計用於 Web 應用測試,但後來擴充套件到其他測試領域,並可以在 Windows、Mac、Linux 環境下安裝使用。JMeter 還提供了圖形介面,這使得編寫測試用例變得非常簡單,具有易學和易操作的特點。
JMeter 官網:http://jmeter.apache.org/download_jmeter.cgi
2.1 安裝 JMeter
截止本文釋出,官方的最新版本為:apache-jmeter-5.1.1.zip,下載後直接解壓即可。
在 ${JMETER_HOME}/bin 下找到啟動指令碼,可以開啟圖形化介面
- Mac/Linux 使用者可以直接使用 jmeter 可執行檔案,或者 jmeter.sh 啟動指令碼
- Windows 使用者可以使用 jmeter.bat 啟動指令碼
2.2 命令列提示資訊
啟動過程中會有一段命令列日誌輸出:
================================================================================
Don't use GUI mode for load testing !,only for Test creation and Test debugging.
For load testing,use CLI Mode (was NON GUI):
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================複製程式碼
注意到第一行的提示,GUI 僅僅能夠用於除錯和建立測試計劃,實際的效能測試需要使用命令列工具進行。
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
- 【jmx file】:使用 GUI 建立的測試計劃檔案,字尾名為
.jmx
- 【results file】:測試結果文字檔案輸出路徑
- 【Path to web report folder】:測試報告輸出路徑,JMeter 的強大之處,可以生成圖文並茂的測試報告
2.3 GUI 介面展示
上圖所示為 JMeter 的主介面。官方提供了國際化支援,通過 【Options】->【Choose Language】可以將介面語言變更為簡體中文。
3 JMeter 壓測 HTTP
本節以 JMeter 壓測 HTTP 為引子,介紹 JMeter 的使用方式,讓沒有使用過 JMeter 的讀者對這款工具有一個較為直觀的感受。
3.1 建立執行緒組
在“測試計劃”上右鍵 【新增】-->【執行緒(使用者)】-->【執行緒組】。
給執行緒組起一個名字,方便記憶。
- 執行緒數:決定了由多少執行緒併發壓測
- Ramp-Up:代表了 JMeter 建立所有執行緒所需要的時間,如圖所示則代表每 0.1s 建立一個執行緒
- 迴圈次數:在執行所設定的次數之後,壓測將會終止。如果想要執行固定時長的壓測,可以設定為:永遠,並在下面的排程器中指定持續時間
3.2 增加 HTTP 取樣器
在剛剛建立的執行緒組上右鍵 【新增】-->【取樣器】-->【HTTP請求】。
為 HTTP 取樣器配置上壓測地址和必要的引數
3.3 新增察看結果樹
在剛剛建立的執行緒組上右鍵 【新增】-->【監聽器】-->【察看結果樹】。
只有添加了【察看結果樹】才能讓我們看到 GUI 中測試的結果。
3.4 準備 HTTP Server
使用 SpringBoot 可以快速構建一個 RestController,其暴露了 localhost:8080/queryOrder/{orderNo}
做為壓測入口
@RestController
public class OrderRestController {
@Autowired
OrderService orderService;
@RequestMapping("/queryOrder/{orderNo}")
public OrderDTO queryOrder(@PathVariable("orderNo") long orderNo) {
return orderService.queryOrder(orderNo);
}
}複製程式碼
被壓測的服務 OrderService :
@Component
public class OrderService {
public OrderDTO queryOrder(long orderNo) {
OrderDTO orderDTO = new OrderDTO();
orderDTO.setOrderNo(orderNo);
orderDTO.setTotalPrice(new BigDecimal(ThreadLocalRandom.current().nextDouble(100.0D)));
orderDTO.setBody(new byte[1000]);
return orderDTO;
}
}複製程式碼
3.5 驗證結果
在剛剛建立的執行緒組上右鍵 【驗證】,執行單次驗證,可以用來測試與服務端的連通性。在【察看結果樹】選項卡中可以看到【響應資料】已經正常返回了。
3.6 執行測試計劃
還記得之前啟動 GUI 時控制檯曾經提示過我們,GUI 只負責建立測試計劃並驗證,不能用於執行實際的併發壓測。在 GUI 中準備就緒之後,我們可以在【檔案】->【儲存測試計劃為】中將測試計劃另存為 rest-order-thread-group.jmx
測試檔案,以便我們在命令列進行壓測:
jmeter -n -t ./rest-order-thread-group.jmx -l ./result.txt -e -o ./webreport複製程式碼
下圖展示了最終生成的測試報告,主要彙總了執行次數、響應時間、吞吐量、網路傳輸速率。
在實際的測試報告中,還有更加詳細的維度可以展示,上述只是展示了彙總資訊。
4 JMeter 壓測 Dubbo
JMeter 預設並不支援私有的 dubbo 協議,但其優秀的擴充套件機制使得只需要新增外掛,就可以完成 Dubbo 壓測,這一節也是本文重點介紹的部分。
4.1 安裝 jmeter-plugins-for-apache-dubbo
外掛地址:https://github.com/thubbo/jmeter-plugins-for-apache-dubbo
目前該外掛支援對最新版本的 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}libext
4.2 增加 Dubbo 取樣器
之前的小結已經介紹瞭如何新增執行緒組和 HTTP 取樣器,現在想要對 Dubbo 應用進行效能測試,可以直接複用之前的執行緒組配置,線上程組上右鍵 【新增】-->【取樣器】-->【Dubbo Sample】。
建立 Dubbo 取樣器之後,可以對其進行配置
4.3 準備 Dubbo Provider
複用 HTTP 取樣器時的 OrderService
@Service
public class OrderDubboProvider implements OrderApi {
@Autowired
OrderService orderService;
@Override
public OrderDTO queryOrder(long orderNo) {
return orderService.queryOrder(orderNo);
}
}複製程式碼
配置 application.properties,註冊服務到 Zookeeper 註冊中心:
dubbo.scan.basePackages=com.alibaba.edas.benchmark
dubbo.application.name=dubbo-provider-demo
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.port=20880複製程式碼
4.4 驗證結果
在 JMeter 中配置好 Dubbo 服務所連線的註冊中心,接著通過 Get Provider List
可以獲取到服務提供者列表,以供壓測選擇。線上程組上右鍵 【驗證】,執行單次驗證,可以用來測試與服務端的連通性。在【察看結果樹】選項卡中可以看到【響應資料】可以正常執行 Dubbo 呼叫了。
4.5 執行測試計劃
可以將 Dubbo 取樣器和 HTTP 取樣器包含在同一個測試計劃中一起執行,同時進行了 Dubbo 介面與 Rest 介面的效能對比。在命令列進行壓測:
jmeter -n -t ./rest-order-thread-group.jmx -l ./result.txt -e -o ./webreport複製程式碼
下圖展示了最終生成的測試報告:
Dubbo 介面與 Rest 介面所封裝的業務介面均為 OrderService
,所以壓測上的差距直接體現出了 Dubbo 和 Rest 的差距。從報告對比上來看,Dubbo 介面的平均 RT 遠低於 Rest 介面。
5 總結
本文從零到一介紹了使用 JMeter 壓測 HTTP 的方法,讓讀者熟悉 JMeter 的使用方式,並著重介紹了使用 jmeter-plugins-for-apache-dubbo 外掛壓測 Dubbo 的方法。
由於 JMeter Plugin 的限制,目前 Dubbo 的壓測請求是通過泛化呼叫進行傳送的,會有一定程度的效能下降,所以在實際評估 Dubbo 介面效能時,介面實際效能會比壓測結果更加樂觀。