1. 程式人生 > 程式設計 >使用 JMeter 進行 Dubbo 效能測試

使用 JMeter 進行 Dubbo 效能測試

1 前言

說道效能測試工具,你會立刻聯想到哪一個?ab(ApacheBench)、JMeter、LoadRunner、wrk…可以說市面上的壓測工具實在是五花八門。那如果再問一句,對 Dubbo 進行效能壓測,你會 pick 哪一個?可能大多數人就懵逼了。可以發現,大多數的壓測工具對開放的協議支援地比較好,例如:HTTP 協議,但對於 Dubbo 框架的私有協議:dubbo,它們都顯得力不從心了。

如果不從通用的壓測工具上解決 Dubbo 的壓測需求問題,可以自己寫 Dubbo 客戶端,自己統計彙總結果,但總歸不夠優雅,再加上很多開發同學沒有豐富的測試經驗,很容易出現一些偏差。說到底,還是壓測工具靠譜,於是便引出了本文的主角 ——

jmeter-plugins-for-apache-dubbo。這是一款由 Dubbo 社群 Commiter -- 凝雨 同學開發的 JMeter 外掛,可以非常輕鬆地對 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目錄

在 ${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 介面展示

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}libext

安裝外掛後的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 介面效能時,介面實際效能會比壓測結果更加樂觀。