說道性能測試工具,你會馬上聯想到哪個?ab(ApacheBench)、JMeter、LoadRunner、wrk…能夠說市面上的壓測工具實在是五花八門。那若是再問一句,對 Dubbo 進行性能壓測,你會 pick 哪個?可能大多數人就懵逼了。能夠發現,大多數的壓測工具對開放的協議支持地比較好,例如:HTTP 協議,但對於 Dubbo 框架的私有協議:dubbo
,它們都顯得力不從心了。html
若是不從通用的壓測工具上解決 Dubbo 的壓測需求問題,能夠本身寫 Dubbo 客戶端,本身統計彙總結果,但總歸不夠優雅,再加上不少開發同窗沒有豐富的測試經驗,很容易出現一些誤差。說到底,仍是壓測工具靠譜,因而便引出了本文的主角 —— jmeter-plugins-for-apache-dubbo。這是一款由 Dubbo 社區 Commiter -- 凝雨 同窗開發的 JMeter 插件,能夠很是輕鬆地對 Dubbo 實現性能測試。git
在開始壓測 Dubbo 以前,先簡單介紹一下這款開源的性能測試工具 —— JMeter。JMeter 是 Apache 組織基於 Java 開發的一款性能測試工具。它最初被設計用於 Web 應用測試,但後來擴展到其餘測試領域,並能夠在 Windows、Mac、Linux 環境下安裝使用。JMeter 還提供了圖形界面,這使得編寫測試用例變得很是簡單,具備易學和易操做的特色。github
JMeter 官網:http://jmeter.apache.org/download_jmeter.cgiweb
截止本文發佈,官方的最新版本爲:apache-jmeter-5.1.1.zip , 下載後直接解壓便可。apache
在 ${JMETER_HOME}/bin 下找到啓動腳本,能夠打開圖形化界面網絡
啓動過程當中會有一段命令行日誌輸出:併發
================================================================================
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 僅僅可以用於調試和建立測試計劃,實際的性能測試須要使用命令行工具進行。app
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
框架
.jmx
上圖所示爲 JMeter 的主界面。官方提供了國際化支持,經過 【Options】->【Choose Language】能夠將界面語言變動爲簡體中文。dom
本節以 JMeter 壓測 HTTP 爲引子,介紹 JMeter 的使用方式,讓沒有使用過 JMeter 的讀者對這款工具備一個較爲直觀的感覺。
在「測試計劃」上右鍵 【添加】-->【線程(用戶)】-->【線程組】。
給線程組起一個名字,方便記憶。
在剛剛建立的線程組上右鍵 【添加】-->【取樣器】-->【HTTP請求】。
爲 HTTP 取樣器配置上壓測地址和必要的參數
在剛剛建立的線程組上右鍵 【添加】-->【監聽器】-->【察看結果樹】。
只有添加了【察看結果樹】才能讓咱們看到 GUI 中測試的結果。
使用 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;
}
}複製代碼
在剛剛建立的線程組上右鍵 【驗證】,執行單次驗證,能夠用來測試與服務端的連通性。在【察看結果樹】選項卡中能夠看到【響應數據】已經正常返回了。
還記得以前啓動 GUI 時控制檯曾經提示過咱們,GUI 只負責建立測試計劃並驗證,不能用於執行實際的併發壓測。在 GUI 中準備就緒以後,咱們能夠在【文件】->【保存測試計劃爲】中將測試計劃另存爲 rest-order-thread-group.jmx
測試文件,以便咱們在命令行進行壓測:
jmeter -n -t ./rest-order-thread-group.jmx -l ./result.txt -e -o ./webreport複製代碼
下圖展現了最終生成的測試報告,主要彙總了執行次數、響應時間、吞吐量、網絡傳輸速率。
在實際的測試報告中,還有更加詳細的維度能夠展現,上述只是展現了彙總信息。
JMeter 默認並不支持私有的 dubbo 協議,但其優秀的擴展機制使得只須要添加插件,就能夠完成 Dubbo 壓測,這一節也是本文重點介紹的部分。
插件地址:https://github.com/thubbo/jmeter-plugins-for-apache-dubbo
目前該插件支持對最新版本的 Dubbo 進行壓測,推薦的安裝方式:
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}libext
以前的小結已經介紹瞭如何添加線程組和 HTTP 取樣器,如今想要對 Dubbo 應用進行性能測試,能夠直接複用以前的線程組配置,在線程組上右鍵 【添加】-->【取樣器】-->【Dubbo Sample】。
建立 Dubbo 取樣器以後,能夠對其進行配置
複用 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複製代碼
在 JMeter 中配置好 Dubbo 服務所鏈接的註冊中心,接着經過 Get Provider List
能夠獲取到服務提供者列表,以供壓測選擇。在線程組上右鍵 【驗證】,執行單次驗證,能夠用來測試與服務端的連通性。在【察看結果樹】選項卡中能夠看到【響應數據】能夠正常執行 Dubbo 調用了。
能夠將 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 接口。
本文從零到一介紹了使用 JMeter 壓測 HTTP 的方法,讓讀者熟悉 JMeter 的使用方式,並着重介紹了使用 jmeter-plugins-for-apache-dubbo 插件壓測 Dubbo 的方法。
因爲 JMeter Plugin 的限制,目前 Dubbo 的壓測請求是經過泛化調用進行發送的,會有必定程度的性能降低,因此在實際評估 Dubbo 接口性能時,接口實際性能會比壓測結果更加樂觀。