Jmeter實現dubbo接口壓測案例

當前項目中重構了消息服務,須要對消息服務接口作性能壓測,評估消息服務的性能狀況java

經過和開發對接,目前消息服務是經過dubbo接口對內提供服務,因此纔有了這邊文章的記錄git

最初的壓測這個dubbo接口有三種思路:github

1.第一種就是基於業務,好比註冊業務,註冊成功後,會發送短信消息到用戶手機,經過業務調用消息服務,最容易實現,可是業務瓶頸最大致使測試結果不許api

2.第二種是經過將dubbo接口上面作一層包裝,提供一個http接口訪問dubbo接口,須要提供二次開發,須要時間,並且高併發下,須要部署在tomcat容器內部tomcat

3.就是直接壓測dubbo接口,這種測試的結果最準確,目前有開源的jmeter plguin sampler插件使用併發

下面講解怎麼使用jmeter-plugins-dubbo作接口測試app

 

第一步:

源碼下載:https://github.com/dubbo/jmeter-plugins-dubboasync

https://github.com/ningyu1/jmeter-plugins-dubbo/tree/master/dist   jar下載地址ide

注意:高併發

jmeter-plugins-dubbo使用

下載提供2種版本:

A. 第一種版本是jmeter-plugins-dubbo-1.3.8-jar-with-dependencies.jar相似帶有with-dependencies的jar是包含一些基礎包,建議下載這個

B. 第二種是不帶依賴包的版本,例如jmeter-plugins-dubbo-1.3.8-SNAPSHOT.jar。而後獲取如下依賴包,將它們放到jmeter安裝目錄下的lib/ext。若是是項目中使用報錯,或者dubbo版本不是2.X版本的,建議下載這個

gson-2.8.2.jar

dubbo-2.8.4.jar  

javassist-3.21.0-GA.jar

jline-0.9.94.jar

log4j-over-slf4j-1.7.5.jar

netty-3.7.0.Final.jar

slf4j-api-1.7.5.jar

zkclient-0.2.jar

zookeeper-3.4.9.jar

 

第二步:

將下載的https://raw.githubusercontent.com/ningyu1/jmeter-plugins-dubbo/master/dist/jmeter-plugins-dubbo-1.3.8.jar

放在jar文件JMETER_HOME/lib/ext目錄下

而後啓動Jmeter

添加Dubbo Sampler配置以下

直接調用後,報錯以下:

2019-01-17 14:22:49,051 ERROR i.g.n.j.p.d.s.DubboSample: RpcException:

com.alibaba.dubbo.rpc.RpcException: Failfast invoke providers dubbo://172.20.20.115:6001/com.neo.xnol.uaccount.facade.UserPersonQueryFacade?accepts=1024&accesslog=true&anyhost=true&application=DubboSample&async=false&charset=UTF-8&check=false&cluster=failfast&connections=100&default.cluster=failfast&default.delay=-1&default.loadbalance=leastactive&default.timeout=30000&default.version=2.0.0&delay=-1&dubbo=1.2.1-SNAPSHOT&generic=true&interface=com.neo.xnol.uaccount.facade.UserPersonQueryFacade&loadbalance=leastactive&methods=isPaymentPwdExist,getByMobile,getIdListByBirthday,isRealNameAuthByUserName,isRealNameAuth,isMobileExist,getTotalRegisteCount,getUserIdByRegisteTime,getByUserNameOrMobileOrEmail,isUserNameExist,getById,getByUserNameList,getUserForDistributed,getByIdCardNo,existElectronicSign,getByUserName,getByUserIdList,getUserByBeginIdAndCount,getByIdOrUserNameOrMobileOrEmail,getByEmail,getByUserNo,checkUserExist,isEmailExist,countUserRegister,getUserWithIDCardDistributed,getByUserNameOrMobile,isIdCardNoExist,getListByBeginIdAndCount&pid=87444&protocol=dubbo&register.ip=172.20.17.65&remote.timestamp=1547636861571&retries=0&revision=2.130.0-SNAPSHOT&side=consumer&timeout=30000&timestamp=1547706009472&version=2.0.0 LeastActiveLoadBalance select from all providers [com.alibaba.dubbo.registry.integration.RegistryDirectory$InvokerDelegate@611a4f9e] for service com.alibaba.dubbo.rpc.service.GenericService method $invoke on consumer 172.20.17.65 use dubbo version 1.3.8-jar-with-dependencies, but no luck to perform the invocation. Last error is: Failed to invoke remote method: $invoke, provider: dubbo://172.20.20.115:6001/com.neo.xnol.uaccount.facade.UserPersonQueryFacade?accepts=1024&accesslog=true&anyhost=true&application=DubboSample&async=false&charset=UTF-8&check=false&cluster=failfast&connections=100&default.cluster=failfast&default.delay=-1&default.loadbalance=leastactive&default.timeout=30000&default.version=2.0.0&delay=-1&dubbo=1.2.1-SNAPSHOT&generic=true&interface=com.neo.xnol.uaccount.facade.UserPersonQueryFacade&loadbalance=leastactive&methods=isPaymentPwdExist,getByMobile,getIdListByBirthday,isRealNameAuthByUserName,isRealNameAuth,isMobileExist,getTotalRegisteCount,getUserIdByRegisteTime,getByUserNameOrMobileOrEmail,isUserNameExist,getById,getByUserNameList,getUserForDistributed,getByIdCardNo,existElectronicSign,getByUserName,getByUserIdList,getUserByBeginIdAndCount,getByIdOrUserNameOrMobileOrEmail,getByEmail,getByUserNo,checkUserExist,isEmailExist,countUserRegister,getUserWithIDCardDistributed,getByUserNameOrMobile,isIdCardNoExist,getListByBeginIdAndCount&pid=87444&protocol=dubbo&register.ip=172.20.17.65&remote.timestamp=1547636861571&retries=0&revision=2.130.0-SNAPSHOT&side=consumer&timeout=30000&timestamp=1547706009472&version=2.0.0, cause: ooh.bravo.zodiac.rpc.RpcException: Failed to invoke remote proxy method $invoke to registry://s1.af88.com.cn:2181/ooh.bravo.zodiac.registry.RegistryService?application=User_RPC_Server&backup=s2.af88.com.cn:2181,s3.af88.com.cn:2181&dubbo=1.2.1-SNAPSHOT&export=dubbo://172.20.20.115:6001/com.neo.xnol.uaccount.facade.UserPersonQueryFacade?accepts=1024&accesslog=true&anyhost=true&application=User_RPC_Server&charset=UTF-8&default.cluster=failfast&default.delay=-1&default.loadbalance=leastactive&default.timeout=30000&default.version=2.0.0&delay=-1&dubbo=1.2.1-SNAPSHOT&interface=com.neo.xnol.uaccount.facade.UserPersonQueryFacade&methods=isPaymentPwdExist,getByMobile,getIdListByBirthday,isRealNameAuthByUserName,isRealNameAuth,isMobileExist,getTotalRegisteCount,getUserIdByRegisteTime,getByUserNameOrMobileOrEmail,isUserNameExist,getById,getByUserNameList,getUserForDistributed,getByIdCardNo,existElectronicSign,getByUserName,getByUserIdList,getUserByBeginIdAndCount,getByIdOrUserNameOrMobileOrEmail,getByEmail,getByUserNo,checkUserExist,isEmailExist,countUserRegister,getUserWithIDCardDistributed,getByUserNameOrMobile,isIdCardNoExist,getListByBeginIdAndCount&monitor=dubbo://s1.af88.com.cn:2181/ooh.bravo.zodiac.registry.RegistryService?application=User_RPC_Server&backup=s2.af88.com.cn:2181,s3.af88.com.cn:2181&dubbo=1.2.1-SNAPSHOT&file=/data/dubbo/cache/user_app_remoting.cache&pid=56&protocol=registry&refer=dubbo=1.2.1-SNAPSHOT&interface=ooh.bravo.zodiac.monitor.MonitorService&pid=56&timestamp=1547636861608&registry=zookeeper&timestamp=1547636861571&version=0.0.1&pid=56&revision=2.130.0-SNAPSHOT&side=provider&timestamp=1547636861571&file=/data/dubbo/cache/user_app_remoting.cache&pid=56&registry=zookeeper&timestamp=1547636861571&version=0.0.1, cause: Not found method "$invoke" in class com.neo.xnol.uaccount.facade.UserPersonQueryFacadeImpl.

ooh.bravo.zodiac.rpc.RpcException: Failed to invoke remote proxy method $invoke to registry://s1.af88.com.cn:2181/ooh.bravo.zodiac.registry.RegistryService?application=User_RPC_Server&backup=s2.af88.com.cn:2181,s3.af88.com.cn:2181&dubbo=1.2.1-SNAPSHOT&export=dubbo://172.20.20.115:6001/com.neo.xnol.uaccount.facade.UserPersonQueryFacade?accepts=1024&accesslog=true&anyhost=true&application=User_RPC_Server&charset=UTF-8&default.cluster=failfast&default.delay=-1&default.loadbalance=leastactive&default.timeout=30000&default.version=2.0.0&delay=-1&dubbo=1.2.1-SNAPSHOT&interface=com.neo.xnol.uaccount.facade.UserPersonQueryFacade&methods=isPaymentPwdExist,getByMobile,getIdListByBirthday,isRealNameAuthByUserName,isRealNameAuth,isMobileExist,getTotalRegisteCount,getUserIdByRegisteTime,getByUserNameOrMobileOrEmail,isUserNameExist,getById,getByUserNameList,getUserForDistributed,getByIdCardNo,existElectronicSign,getByUserName,getByUserIdList,getUserByBeginIdAndCount,getByIdOrUserNameOrMobileOrEmail,getByEmail,getByUserNo,checkUserExist,isEmailExist,countUserRegister,getUserWithIDCardDistributed,getByUserNameOrMobile,isIdCardNoExist,getListByBeginIdAndCount&monitor=dubbo://s1.af88.com.cn:2181/ooh.bravo.zodiac.registry.RegistryService?application=User_RPC_Server&backup=s2.af88.com.cn:2181,s3.af88.com.cn:2181&dubbo=1.2.1-SNAPSHOT&file=/data/dubbo/cache/user_app_remoting.cache&pid=56&protocol=registry&refer=dubbo=1.2.1-SNAPSHOT&interface=ooh.bravo.zodiac.monitor.MonitorService&pid=56&timestamp=1547636861608&registry=zookeeper&timestamp=1547636861571&version=0.0.1&pid=56&revision=2.130.0-SNAPSHOT&side=provider&timestamp=1547636861571&file=/data/dubbo/cache/user_app_remoting.cache&pid=56&registry=zookeeper&timestamp=1547636861571&version=0.0.1, cause: Not found method "$invoke" in class com.neo.xnol.uaccount.facade.UserPersonQueryFacadeImpl.

at ooh.bravo.zodiac.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:59)

at ooh.bravo.zodiac.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:35)

at ooh.bravo.zodiac.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:35)

at ooh.bravo.zodiac.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:78)

at ooh.bravo.zodiac.monitor.support.MonitorFilter.invoke(MonitorFilter.java:40)

at ooh.bravo.zodiac.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:78)

at ooh.bravo.zodiac.rpc.filter.ContextFilter.invoke(ContextFilter.java:36)

at ooh.bravo.zodiac.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:78)

at ooh.bravo.zodiac.rpc.filter.DynamicLinkTrackingFilter.invoke(DynamicLinkTrackingFilter.java:57)

at ooh.bravo.zodiac.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:78)

 

是否是看到這裏已經懵逼了啊。哈哈,既然出現了問題,那麼就要學着分析:首先查看這個接口的實際調用的參數咋樣:

經過dubbo默認提供的invoke指令查看:

 

方法也存在,那麼繼續查看這個方法的dubbo調用參數

ls -l

url轉碼後:

com.neo.xnol.uaccount.facade.UserPersonQueryFacade -> dubbo://172.20.20.115:6001/com.neo.xnol.uaccount.facade.UserPersonQueryFacade?accepts=1024&accesslog=true&anyhost=true&application=User_RPC_Server&charset=UTF-8&default.cluster=failfast&default.delay=-1&default.loadbalance=leastactive&default.timeout=30000&default.version=2.0.0&delay=-1&dubbo=1.2.1-SNAPSHOT&interface=com.neo.xnol.uaccount.facade.UserPersonQueryFacade&methods=isPaymentPwdExist,getByMobile,getIdListByBirthday,isRealNameAuthByUserName,isRealNameAuth,isMobileExist,getTotalRegisteCount,getUserIdByRegisteTime,getByUserNameOrMobileOrEmail,isUserNameExist,getById,getByUserNameList,getUserForDistributed,getByIdCardNo,existElectronicSign,getByUserName,getByUserIdList,getUserByBeginIdAndCount,getByIdOrUserNameOrMobileOrEmail,getByEmail,getByUserNo,checkUserExist,isEmailExist,countUserRegister,getUserWithIDCardDistributed,getByUserNameOrMobile,isIdCardNoExist,getListByBeginIdAndCount&monitor=dubbo://s1.af88.com.cn:2181/ooh.bravo.zodiac.registry.RegistryService?application=User_RPC_Server&backup=s2.af88.com.cn:2181,s3.af88.com.cn:2181&dubbo=1.2.1-SNAPSHOT&file=/data/dubbo/cache/user_app_remoting.cache&pid=56&protocol=registry&refer=dubbo=1.2.1-SNAPSHOT&interface=ooh.bravo.zodiac.monitor.MonitorService&pid=56&timestamp=1547636861608&registry=zookeeper&timestamp=1547636861571&version=0.0.1&pid=56&revision=2.130.0-SNAPSHOT&side=provider&timestamp=1547636861571

 

經過查看和對比,參數也沒錯,而後嘗試直連,仍是報錯:

經過下載這個插件的源碼和項目中的dubbo分析以及報錯日誌分析發現插件用的是dubbo的泛化調用, 而報錯日誌顯示的是獲取不到泛化對象 ,

經過對比發現是由於項目中的dubbo版本是用的2.5.4,可是在源碼的基礎上作了閹割,去掉了一部分功能,恰好去掉了jmeter插件使用到的dubbo的泛化調用特性,致使一直報錯

經過修改原始插件,經過重寫插件調用dubbo接口的調用方式後問題解決,若是外面的其餘引入完整的dubbo源碼項目,基本不會碰見這種問題

從新運行結果:

這個接口實現的業務

 

經過zk鏈接:

 

問題解決了

 

那麼再來看這個消息服務的案例:

 

zk的方式:

 

 

 

 

難點就是這個參數類型怎麼獲取呢

簡單吧,哈哈

其餘案例:

 

 

經常使用參數類型彙總

 

首先拿到dubbo接口後,須要判斷dubbo接口是否可用,咱們怎麼調試呢?能夠經過dubbo默認提供的invoke指令調用,案例實戰:

dubbo服務發佈以後,咱們能夠利用telnet命令進行調試、管理。
Dubbo2.0.5以上版本服務提供端口支持telnet命令,下面我以經過實例拋磚引玉一下:

1.鏈接服務

測試對應IP和端口下的dubbo服務是否連通,cmd命令以下

telnet localhost 20880

正常狀況下,進入telnet窗口,鍵入回車進入dubbo命令模式。

2.查看服務列表

查看服務ls

查看服務中的接口

ls

(list services and methods)

ls

顯示服務列表。

ls -l

顯示服務詳細信息列表。

ls XxxService

顯示服務的方法列表。

ls -l XxxService

顯示服務的方法詳細信息列表。

3.調用服務接口

調用接口時,以JSON格式傳入參數(這點很方便 :-D),而後打印返回值和所用時間。

invoke

invoke XxxService.xxxMethod({"prop": "value"})

調用服務的方法。

invoke xxxMethod({"prop": "value"})

調用服務的方法(自動查找包含此方法的服務)。

4.查看服務狀態 

查看服務調用次數,不過比較奇怪的是,我剛纔已經調用過一次queryDemoPageList 了,而這裏顯示的爲0(貌似不太準,有待進一步瞭解)

count

count XxxService

統計1次服務任意方法的調用狀況。

count XxxService 10

統計10次服務任意方法的調用狀況。

count XxxService xxxMethod

統計1次服務方法的調用狀況。

count XxxService xxxMethod 10

統計10次服務方法的調用狀況。

status

status

顯示彙總狀態,該狀態將彙總全部資源的狀態,當所有OK時則顯示OK,只要有一個ERROR則顯示ERROR,只要有一個WARN則顯示WARN。

status -l

顯示狀態列表。

 

好比,當前有個接口,獲取當前系統的註冊用戶數的dubbo接口,咱們能夠先經過invoke指令驗證

telnet 172.20.20.115 6001  這裏說明,172.20.20.115是咱們的dubbo服務地址,6001是user服務的端口

接口調用結果

 

參考:

https://blog.csdn.net/cyjs1988/article/details/84258046

相關文章
相關標籤/搜索