使用 MeterSphere 進行 Dubbo 介面測試

MeterSphere 小助手發表於2020-08-10

關於 Dubbo

Dubbo 是阿里巴巴公司開源的一個Java高效能優秀的服務框架,使得應用可通過高效能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫整合,隨著近幾年微服務架構的興起,因為其理念很契合微服務,在國內有著比較廣泛的使用者群體。

Dubbo 架構

節點角色說明

  • Provider:暴露服務的服務提供方
  • Consumer:呼叫遠端服務的服務消費方
  • Registry:服務註冊與發現的註冊中心
  • Monitor:統計服務的呼叫次數和呼叫時間的監控中心
  • Container:服務執行容器

呼叫關係說明

  1. 服務容器負責啟動,載入,執行服務提供者。
  2. 服務提供者在啟動時,向註冊中心註冊自己提供的服務。
  3. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
  4. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
  5. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
  6. 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。

部署 Dubbo 服務

要針對 Dubbo 介面進行測試,首先我們需要有一套基於 Dubbo 框架的應用系統。這裡我準備了一個使用了 Dubbo 框架的 SpringBoot Demo 應用來進行說明,專案地址:https://github.com/metersphere/dubbo-docker(在此感謝下 原專案 作者 binblee 提供的專案)。如果大家自己已經有了現成的基於 Dubbo 框架的應用,可以忽略掉這一部分。

應用整體比較簡單,只提供瞭如下的一個介面兩個方法。

package com.example.service.producer;

import com.example.service.Greetings;
import com.example.service.User;

/**
* Created by libin on 9/19/16.
*/

public class GreetingsImpl implements Greetings {
public String say(String name) {
return "Greetings from " + name;
}

public String hello(User user) {
return "Name: "+user.name+", Age: "+user.age+", Gender: "+user.gender;
}
}

專案的啟動方式在 GitHub 上的 README 中已經有說明了,在此就不再贅述。當我們將專案執行起來以後,通過 HTTP GET 方法請求下 consumer 的 / 路徑,可以看到 consumer 給我們返回瞭如下資訊,說明 provider 是可以正常提供服務的。

[~/Documents/workspace/dubbo-docker/docker]# curl http://localhost:8899
Greetings from Dubbo Docker

常見的 Dubbo 介面測試方法

像 Dubbo 這樣的 RPC 框架,其提供的介面更多是一個應用系統之間各個元件/服務內部通訊使用的,不像基於 HTTP 的介面那樣,其實可選擇的測試工具不是特別多。
根據我自己的經驗,一般有如下幾種方式來進行 Dubbo 介面的測試,如果大家有其他更好的方式和工具,歡迎聯絡作者進行補充。

  • 自己寫 Java 或 Python 等程式碼註冊成一個 consumer 呼叫服務進行測試
  • 像上面例子裡的 consumer 一樣,由開發團隊把需要測試的介面再包裝成 HTTP 介面,通過測試 HTTP 介面測手段進行測試
  • 在測試環境中通過官方提供的 telnet 命令,直接 invoke 特定服務進行測試
[~/Documents/workspace/dubbo-docker]# telnet localhost 20880
Trying ::1...
Connected to localhost.
Escape character is '^]'.

dubbo>ls
com.example.service.Greetings
dubbo>ls com.example.service.Greetings
say
hello
dubbo>invoke com.example.service.Greetings.say("Tom")
"Greetings from Tom"
elapsed: 0 ms.
dubbo>
  • 使用 JMeter 配合 Dubbo Sampler 外掛進行測試

使用 MeterSphere 持續測試平臺進行 Dubbo 介面測試

除了上面提到的方法以外,我們還可以使用 MeterSphere 這樣的完全相容 JMeter 的測試平臺來進行 Dubbo 介面測試。關於 MeterSphere 的詳細介紹及部署使用方式,可以參考下面提供的連結。在這篇文章中,我們只聚焦於使用 MeterSphere 進行 Dubbo 介面測試進行介紹。

準備工作

  • 已經部署了 MeterSphere 環境,並且有具有執行介面測試許可權的賬號
  • 準備 Dubbo 介面相關資訊,包括註冊中心連線資訊、介面定義等
  • 如果使用了本文中提到的 Duboo Demo 專案,由於服務註冊時的 IP 地址是 producer 容器的 IP,可能會出現呼叫不通的情況。這裡我們通過 zk 命令手動地把這個 Demo 環境的 provider 資訊改一下,把原來 provider 中的容器 IP 改為部署該 Demo 應用的主機 IP。
[~/Documents/workspace/dubbo-docker/docker]# zkcli -s 192.168.2.170:2181
2020/08/06 18:55:25 Connected to 192.168.2.170:2181
>>> ls /dubbo/com.example.service.Greetings/providers
[dubbo%3A%2F%2F172.19.0.2%3A20880%2Fcom.example.service.Greetings%3Fanyhost%3Dtrue%26application%3Dproducer-app%26dubbo%3D2.5.3%26interface%3Dcom.example.service.Greetings%26methods%3Dsay%2Chello%26pid%3D1%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1596709972791]
>>> delete /dubbo/com.example.service.Greetings/providers/dubbo%3A%2F%2F172.19.0.2%3A20880%2Fcom.example.service.Greetings%3Fanyhost%3Dtrue%26application%3Dproducer-app%26dubbo%3D2.5.3%26interface%3Dcom.example.service.Greetings%26methods%3Dsay%2Chello%26pid%3D1%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1596709972791
Deleted /dubbo/com.example.service.Greetings/providers/dubbo%3A%2F%2F172.19.0.2%3A20880%2Fcom.example.service.Greetings%3Fanyhost%3Dtrue%26application%3Dproducer-app%26dubbo%3D2.5.3%26interface%3Dcom.example.service.Greetings%26methods%3Dsay%2Chello%26pid%3D1%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1596709972791
>>> create /dubbo/com.example.service.Greetings/providers/dubbo%3A%2F%2F192.168.2.170%3A20880%2Fcom.example.service.Greetings%3Fanyhost%3Dtrue%26application%3Dproducer-app%26dubbo%3D2.5.3%26interface%3Dcom.example.service.Greetings%26methods%3Dsay%2Chello%26pid%3D1%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1596709972791
Created /dubbo/com.example.service.Greetings/providers/dubbo%3A%2F%2F192.168.2.170%3A20880%2Fcom.example.service.Greetings%3Fanyhost%3Dtrue%26application%3Dproducer-app%26dubbo%3D2.5.3%26interface%3Dcom.example.service.Greetings%26methods%3Dsay%2Chello%26pid%3D1%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1596709972791
>>>

建立專案

登入 MeterSphere 平臺後,點選在上方選單中選擇「介面測試」,在專案列表中點選「建立專案」

建立介面測試

點選介面上方中央的【建立測試按鈕】,建立新的介面測試集

在介面測試建立頁面選擇該測試所屬的專案,並填入介面測試集名稱

配置場景資訊

點選左側場景列表中的場景配置,在右側的場景資訊中,填入場景名稱,並選擇「Dubbo 配置」標籤頁。

在該頁面中把準備的註冊中心連線資訊,介面版本等資訊填好。

在場景中配置的變數、HTTP 請求頭、Dubbo 配置等資訊試用於該場景下的所有請求

新增 Dubbo 請求

點選左側場景列表中新增請求按鈕,選擇 Dubbo 型別的介面進行新增

填寫該請求的名稱後,點選「Get Providers List」從註冊中心中獲取服務列表,從下拉選單中選擇需要測試的介面及方法,根據該方法的定義,傳入所需的引數

上面新增的介面只有一個 String 型別的引數,再次新增一個引數型別為自定義類的請求。這裡我們檢視一下程式碼中這個介面的定義,發現其需要一個 User 類的物件作為引數

package com.example.service;

/**
* Created by libin on 9/19/16.
*/

public interface Greetings {
String say(String name);
String hello(User user);
}

同時結合 User 類的定義

package com.example.service;

enum Gender {
MALE, FEMALE;
}

public class User {
public String name;
public Integer age;
public Gender gender;
}

我們可以通過這樣的形式傳入引數值 {"name":"姓名", "age":年齡, "gender": "MALE 或 FEMALE"}

當介面請求都新增完成後,我們先把預設新增的那個 HTTP 請求刪掉,然後就可以點選「儲存並執行」按鈕進行 Dubbo 介面的測試了

檢視報告

測試執行完成後,即可在頁面上檢視到測試執行的結果報告

點選報告中的場景及請求,可檢視到請求的詳細內容及響應內容

轉化為效能測試

介面測試執行通過後,我們還可以通過 MeterSphere 提供的介面測試轉效能測試的功能,直接發起針對 Dubbo 介面的效能測試。

在「介面測試」頁面的「測試」下拉選單中,選擇我們剛建立的測試,點選更多操作中的「建立效能測試」選項

在彈出的頁面中根據需求配置壓力引數後,點選「儲存並執行」按鈕即可發起效能測試

相關文章