使用 JMeter 進行 Dubbo 性能測試

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目錄

在 ${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 界面展現

image-20190905211412101

上圖所示爲 JMeter 的主界面。官方提供了國際化支持,經過 【Options】->【Choose Language】能夠將界面語言變動爲簡體中文。

3 JMeter 壓測 HTTP

本節以 JMeter 壓測 HTTP 爲引子,介紹 JMeter 的使用方式,讓沒有使用過 JMeter 的讀者對這款工具備一個較爲直觀的感覺。

3.1 建立線程組

在「測試計劃」上右鍵 【添加】-->【線程(用戶)】-->【線程組】。

image-20190905211637435

給線程組起一個名字,方便記憶。

image-20190905211831670

  • 線程數:決定了由多少線程併發壓測
  • Ramp-Up:表明了 JMeter 建立全部線程所須要的時間,如圖所示則表明每 0.1s 建立一個線程
  • 循環次數:在運行所設置的次數以後,壓測將會終止。若是想要運行固定時長的壓測,能夠設置爲:永遠,並在下面的調度器中指定持續時間

3.2 增長 HTTP 取樣器

在剛剛建立的線程組上右鍵 【添加】-->【取樣器】-->【HTTP請求】。

image-20190905211606505

爲 HTTP 取樣器配置上壓測地址和必要的參數

image-20190905212937824

3.3 添加察看結果樹

在剛剛建立的線程組上右鍵 【添加】-->【監聽器】-->【察看結果樹】。

image-20190905213114409

只有添加了【察看結果樹】才能讓咱們看到 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 驗證結果

在剛剛建立的線程組上右鍵 【驗證】,執行單次驗證,能夠用來測試與服務端的連通性。在【察看結果樹】選項卡中能夠看到【響應數據】已經正常返回了。

image-20190905214317033

3.6 執行測試計劃

還記得以前啓動 GUI 時控制檯曾經提示過咱們,GUI 只負責建立測試計劃並驗證,不能用於執行實際的併發壓測。在 GUI 中準備就緒以後,咱們能夠在【文件】->【保存測試計劃爲】中將測試計劃另存爲 rest-order-thread-group.jmx 測試文件,以便咱們在命令行進行壓測:

jmeter -n -t ./rest-order-thread-group.jmx -l ./result.txt -e -o ./webreport

下圖展現了最終生成的測試報告,主要彙總了執行次數、響應時間、吞吐量、網絡傳輸速率。

image-20190905215339406

在實際的測試報告中,還有更加詳細的維度能夠展現,上述只是展現了彙總信息。

4 JMeter 壓測 Dubbo

JMeter 默認並不支持私有的 dubbo 協議,但其優秀的擴展機制使得只須要添加插件,就能夠完成 Dubbo 壓測,這一節也是本文重點介紹的部分。

4.1 安裝 jmeter-plugins-for-apache-dubbo

插件地址:https://github.com/thubbo/jmeter-plugins-for-apache-dubbo

目前該插件支持對最新版本的 Dubbo 進行壓測,推薦的安裝方式:

  1. 克隆項目:git clone https://github.com/thubbo/jmeter-plugins-for-apache-dubbo.git

  2. 打包項目,構建 JMeter 插件:mvn clean install ,獲得:jmeter-plugins-dubbo-2.7.3-jar-with-dependencies.jar

  3. 將插件添加到 ${JMETER_HOME}\lib\ext

安裝插件後的ext目錄

4.2 增長 Dubbo 取樣器

以前的小結已經介紹瞭如何添加線程組和 HTTP 取樣器,如今想要對 Dubbo 應用進行性能測試,能夠直接複用以前的線程組配置,在線程組上右鍵 【添加】-->【取樣器】-->【Dubbo Sample】。

image-20190906141506679

建立 Dubbo 取樣器以後,能夠對其進行配置

image-20190906143444779

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 調用了。

image-20190906143425928

4.5 執行測試計劃

能夠將 Dubbo 取樣器和 HTTP 取樣器包含在同一個測試計劃中一塊兒執行,同時進行了 Dubbo 接口與 Rest 接口的性能對比。在命令行進行壓測:

jmeter -n -t ./rest-order-thread-group.jmx -l ./result.txt -e -o ./webreport

下圖展現了最終生成的測試報告:

image-20190906144422407

Dubbo 接口與 Rest 接口所封裝的業務接口均爲 OrderService,因此壓測上的差距直接體現出了 Dubbo 和 Rest 的差距。從報告對比上來看,Dubbo 接口的平均 RT 遠低於 Rest 接口。

5 總結

本文從零到一介紹了使用 JMeter 壓測 HTTP 的方法,讓讀者熟悉 JMeter 的使用方式,並着重介紹了使用 jmeter-plugins-for-apache-dubbo 插件壓測 Dubbo 的方法。

因爲 JMeter Plugin 的限制,目前 Dubbo 的壓測請求是經過泛化調用進行發送的,會有必定程度的性能降低,因此在實際評估 Dubbo 接口性能時,接口實際性能會比壓測結果更加樂觀。

相關文章
相關標籤/搜索