1 前言
說道性能測試工具,你會馬上聯想到哪個?ab(ApacheBench)、JMeter、LoadRunner、wrk…能夠說市面上的壓測工具實在是五花八門。那若是再問一句,對 Dubbo 進行性能壓測,你會 pick 哪個?可能大多數人就懵逼了。能夠發現,大多數的壓測工具對開放的協議支持地比較好,例如:HTTP 協議,但對於 Dubbo 框架的私有協議:dubbo
,它們都顯得力不從心了。html
若是不從通用的壓測工具上解決 Dubbo 的壓測需求問題,能夠本身寫 Dubbo 客戶端,本身統計彙總結果,但總歸不夠優雅,再加上不少開發同窗沒有豐富的測試經驗,很容易出現一些誤差。說到底,仍是壓測工具靠譜,因而便引出了本文的主角 —— jmeter-plugins-for-apache-dubbo。這是一款由 Dubbo 社區 Commiter -- 凝雨 同窗開發的 JMeter 插件,能夠很是輕鬆地對 Dubbo 實現性能測試。java
<!-- more -->git
2 JMeter 介紹
在開始壓測 Dubbo 以前,先簡單介紹一下這款開源的性能測試工具 —— JMeter。JMeter 是 Apache 組織基於 Java 開發的一款性能測試工具。它最初被設計用於 Web 應用測試,但後來擴展到其餘測試領域,並能夠在 Windows、Mac、Linux 環境下安裝使用。JMeter 還提供了圖形界面,這使得編寫測試用例變得很是簡單,具備易學和易操做的特色。github
JMeter 官網:http://jmeter.apache.org/download_jmeter.cgiweb
2.1 安裝 JMeter
截止本文發佈,官方的最新版本爲:apache-jmeter-5.1.1.zip , 下載後直接解壓便可。shell
在 ${JMETER_HOME}/bin 下找到啓動腳本,能夠打開圖形化界面apache
- 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]
app
- 【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}\lib\ext
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 接口性能時,接口實際性能會比壓測結果更加樂觀。