『動善時』JMeter基礎 — 52、使用JMeter測試Dubbo介面

繁華似錦Fighting發表於2021-07-05

1、Dubbo介紹

(1)Dubbo說明

Dubbo是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。

簡單的說:Dubbo一個高效能的,基於 Java 的,開源 RPC 框架。所以嚴格來說,Dubbo不是協議,而是一種分散式服務框架。

(2)Dubbo執行原理

Dubbo架構圖如下所示:

image

節點角色說明:

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

呼叫關係說明:

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

對上圖進行說明:

  • 虛線都是非同步訪問,實線都是同步訪問。
  • 紫色虛線:在啟動時完成的功能。
  • 青色虛線(實線):都是程式執行過程中執行的功能。
  • 所有的角色都是可以在單獨的伺服器上。

Dubbo簡單的執行原理圖:

image

2、準備測試Dubbo介面的環境

需要下載JMeter的Dubbo依賴JAR包,根據你Dubbo服務的版本,去選擇對應的外掛版本。

例如:我的Dubbo是2.3.7版本,我需要的是jmeter-plugins-dubbo-2.7.1-jar-with-dependencies.jar。下載後放到JMeter安裝目錄中的lib/ext路徑下。

各版本下載地址:https://github.com/thubbo/jmeter-plugins-for-apache-dubbo/releases

注意:如果放依賴包之前就已經啟動了JMeter的話,需要重啟JMeter。

之後我就可以使用JMeter中的取樣器元件,來傳送支援Dubbo協議的請求。

如下圖所示:

image

說明:

我們在下載Dubbo的JAR包時候,會看到有兩個JAR包:

  • Jmeter-plugins-dubbo-2.7.1-jar-with-dependencies.jar
  • Jmeter-plugins-dubbo-2.7.1.jar

如果使用的是:jmeter-plugins-dubbo-${version}-jar-with-dependencies.jar

此包中已含必要的依賴,推薦使用這個包。

如果使用的是:jmeter-plugins-dubbo-${version}.jar

需要自行新增外掛的依賴包,所依賴JAR包的列表如下:

  • dubbo-2.5.3.jar
  • javassist-3.15.0-GA.jar
  • zookeeper-3.4.6.jar
  • zkclient-0.1.jar
  • jline-0.9.94.jar
  • netty-3.7.0-Final.jar
  • slf4j-api-1.7.5.jar
  • log4j-over-slf4j-1.7.5.jar

3、Dubbo Sample介面詳解

Dubbo Sample元件新增方式:選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> Dubbo Sample

介面如下圖所示:

image

針對介面中各選項說明:

  • 名稱Dubbo Sample元件的自定義名稱,見名知意最好。
  • 註釋:即新增一些備註資訊,對該Dubbo Sample元件的簡短說明,以便後期回顧時檢視。

(1)Registry Settings:註冊設定

  • Protocol:註冊協議,包括zookeepermulticastRedissimplenone
  • Address:輸入Dubbo註冊地址,註冊中心的IP+Port
    1、當使用zookeeperAddress填入zookeeper地址,叢集地址使用","分隔;
    2、當使用Dubbo直連的方式,Address填寫直連地址和服務埠,且註冊協議填none
  • Group:組型別,如果有的話,根據配置填寫即可;
  • Get Provider List:根據Address填寫的地址,獲取服務提供者的服務列表。(直連可以不選,其他都要選)
    1)點選Get Provider List後,會稍許有點卡。如果輸入的Address填寫不對,會卡死。
    2)根據實際情況選擇Interfaces(介面)和Methods(方法)。

(2)RPC Protocol Settings:RPC協議設定

Protocol:使用的Dubbo協議,包括dubbormihessianwebservicememcachedredis,根據自己的協議型別,選擇對應的選項即可。

(3)Consumer&Service Settings:消費者和提供者設定

  • Timeout:請求介面超時時間,單位ms,根據Dubbo具體配置填寫;
  • Version:版本,Dubbo不同版本之間差異較大,不同版本之間不能互相呼叫,這裡指定Dubbo版本,是為了方便識別和說明;(一般無需填寫)
  • Retries:異常重試次數。類似這種分散式服務通訊框架,大多都有重試機制,是為了保證事務成功率;
  • Cluster:叢集型別,包括failoverfailfastfailsafefailbackfailking
  • Group:組型別,如果有的話,根據配置填寫即可;
  • Connections:連線數,同上,根據配置填寫;
  • Async:服務處理型別,包括sync(同步)、async(非同步),根據配置填寫;(現在都預設選擇sync同步,目前所示樣例都是同步介面)
  • Loadbalance:負載均衡策略,包括random(隨機)、roundrobin(輪詢)、leastactive(最少活躍數)、consistenthash(一致性雜湊);

(4)Interface Settings:介面設定

  • Interface:填寫要請求的介面名。因為Dubbo服務大多是開發根據規範自行命名的,因此這裡需要填寫完整的介面名+包名;(如果選擇了上面的Get Provider List,則無需填寫,會自動回填)
  • Method:當前介面下的方法名,按照開發提供的API文件填寫即可;(如果選擇了上面的Get Provider List,則無需填寫,會自動回填)
  • Args:介面引數,根據API文件填寫,輸入對應的引數型別和引數值即可;
    1)paramType:引數支援任何型別,可以直接使用java.lang下的包裝類,如:intfloatshotdoublelongbytebooleancharString等。
    型別也可以是自定義物件POJO,需使用類的完全名稱。
    2)paramValue:填寫需要的引數值,例如:int為1,booleantrue等,自定義類與List或者Map等使用Json格式資料。

4、Dubbo Sample元件的使用

(1)測試計劃內包含的元件

新增元件操作步驟

  1. 建立測試計劃。
  2. 建立執行緒組:選中“測試計劃”右鍵 —> 新增 —> 執行緒(使用者) —> 執行緒組
  3. 線上程組中,新增取樣器Dubbo Sample元件:選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> Dubbo Sample
  4. 線上程組中,新增監聽器“察看結果樹”元件:選中“執行緒組”右鍵 —> 新增 —> 監聽器 —> 察看結果樹

最終測試計劃中的元件如下:

image

提示:下面介紹兩種方式,來請求Dubbo 服務。

(2)使用zookeeper協議請求Dubbo介面

1)使用zookeeper協議呼叫Dubbo服務步驟

  1. 先獲取zookeeper註冊中心的地址,因為Dubbo服務都註冊在這裡。
  2. 點選Get Provider List按鈕,可以獲得提供者的所提供服務的列表。
  3. 選擇要請求的介面與方法。
  4. 填入對應的引數,傳送請求。

2)Dubbo介面資訊說明

  1. 介面:com.example.provider.service.HelloFroParameterService:1.0.0
  2. 方法名:sayHelloFroParameter
  3. 引數型別:String,如果是自定義物件,填寫物件的全名。
  4. 引數值:字串就行。

填寫好的Dubbo Sample請求內容,如下圖所示:

image

提示:其他選項我們暫時不用填寫。

3)補充說明

當點選Get Provider List按鈕之後,會出現如下提示資訊:

image

意思是:獲取所有提供者的服務列表,可能會導致 JMeter 停止響應幾秒鐘。 你要繼續嗎?

我們點選是即可。

然後停頓一會,會出現如下提示:

image

意思是:提示你,獲取提供者列表以完成! 檢查日誌是否有錯誤。

這就證明我們獲得提供者列表成功了。

提示:

如果10秒中都沒有出現如上彈框,證明列表獲取失敗,可能是zookeeper地址填寫錯誤,也可以能是服務有問題了。

而此時JMeter介面是卡死狀態,我們就需要強制關閉掉JMeter了,因為等再長時間也沒有意義了。

獲取到提供者列表後,在InterfacesMethods的下拉選單中就有內容了,我們可以選擇需要呼叫的介面和方法。

同時選擇好的介面和方法,會同步到下面Interface Settings中的介面和方法的設定中。

如下圖所示:

image

4)執行檢視結果

執行指令碼,檢視結果。

我們可以看到,成功請求了Dubbo介面,並接收到了返回的資料。

如下圖所示:

image

(3)使用直連的方式請求Dubbo介面

直連方式與zookeeper連線方式不同,不需要到註冊中心去分配一個提供者來提供服務,我們是直接連結某個提供者,去進行請求。

1)使用直連方式呼叫Dubbo服務步驟

  1. Protocol協議選擇none
  2. Dubbo介面填寫直連地址:如:127.0.0.1:20880
  3. 填寫介面地址:com.example.provider.service.HelloService:1.0.0
  4. 填寫呼叫的方法名:sayHello
  5. 請求一個不帶引數的Dubbo介面,所以不需要填寫引數。

編輯完成,如下圖所示:

image

2)執行檢視結果

我們可以看到,成功請求了Dubbo介面,並接收到了返回的資料。

如下圖所示:

image

以上就完成了JMeter對Dubbo介面的訪問。

相關文章