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

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路徑下。

各版本下載地址://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介面的訪問。