非常規(guī)協(xié)議服務(wù)的性能測試

? ? 依照市面上目前自動化的測試工具和產(chǎn)品腔丧,我們發(fā)現(xiàn)它們對常規(guī)協(xié)議:http惩阶、https等協(xié)議支持較好辐赞,可是對于非常規(guī)協(xié)議,如:dubbo搂根、rmp等協(xié)議或者公司內(nèi)部協(xié)議的支持不太好珍促,基本上是完全不支持的。我們在本文來探討一下如何支持非常規(guī)協(xié)議的自動化測試剩愧。

? ?很多人會想到將非常規(guī)協(xié)議轉(zhuǎn)變?yōu)槌R?guī)協(xié)議后再做壓測猪叙,這種方法的適用性不高,我們來舉個例子:

? ?我們想對某個dubbo協(xié)議的服務(wù)進(jìn)行壓測仁卷,dubbo協(xié)議的另一側(cè)是企業(yè)的總線接入服務(wù)穴翩。這種場景下我們?nèi)绻麑ubbo協(xié)議包裝一層成為http協(xié)議,那么http服務(wù)器有可能成為壓測的瓶頸锦积,因?yàn)槠髽I(yè)總線的性能是很強(qiáng)勁的芒帕,因此需要使用復(fù)雜的http服務(wù)集群才能擺脫http服務(wù)器的瓶頸。小編就被這種方案害苦過丰介,曾有一次壓測集團(tuán)的總線服務(wù)背蟆,因?yàn)楝F(xiàn)成的工具不支持dubbo協(xié)議,故將dubbo協(xié)議轉(zhuǎn)換成http協(xié)議使用jmeter集群進(jìn)行壓測哮幢,發(fā)現(xiàn)性能普遍較低淆储,和預(yù)想的性能有十倍之差,而問題還不只出現(xiàn)在http服務(wù)器家浇,而是出在http調(diào)用dubbo時服務(wù)器對連接的承載數(shù)目,這種協(xié)議轉(zhuǎn)換的方案慎用碴裙。

? ?那么我們要使用哪種方法去進(jìn)行這些非常規(guī)協(xié)議的自動化測試呢钢悲?

? ?jmeter提供了一種java調(diào)用,可以直接調(diào)用java的類舔株,如果我們將要封裝的協(xié)議放在java類中莺琳,直接調(diào)用java類的話,其開銷并不大载慈,其一是因?yàn)閖ava類的運(yùn)行在壓測機(jī)惭等,使用壓測機(jī)集群可以幾乎無限制的消滅掉這種瓶頸,其二是java類的系統(tǒng)開銷較低办铡,幾乎不會對壓測造成影響辞做。下面我們將對其實(shí)現(xiàn)方式進(jìn)行詳細(xì)的介紹。

我們將首先介紹通用的方法:

一.啟動JMeter

下載:

http://jmeter.apache.org/download_jmeter.cgi

啟動:

Linux環(huán)境下運(yùn)行 $安裝目錄/bin/jmeter.sh

Windows下運(yùn)行 $安裝目錄/bin/jmeter.bat

二.編寫用例

針對"Java請求"類型的測試寡具,需要基于JMeter測試框架編寫用例秤茅。

1、新建一個普通的Java工程童叠;

2框喳、將 $JMeter安裝目錄/lib/ 目錄引入工程;

3、新建Java Class五垮,如下的"PerformanceTest "乍惊,并繼承"AbstractJavaSamplerClient";

代碼示例:

Java代碼

/**

*

*/

packagetest;

importorg.apache.jmeter.config.Arguments;

importorg.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;

importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;

importorg.apache.jmeter.samplers.SampleResult;

/**

*?@author dingjingjing

*

*/

publicclassPerformanceTestextendsAbstractJavaSamplerClient?{

/**

*

*/

privatestaticlongstart?=0;

privatestaticlongend?=0;

/**

*?執(zhí)行runTest()方法前會調(diào)用此方法,可放一些初始化代碼

*/

publicvoidsetupTest(JavaSamplerContext?arg0)?{

//?開始時間

start?=?System.currentTimeMillis();

}

/**

*?執(zhí)行runTest()方法后會調(diào)用此方法.

*/

publicvoidteardownTest(JavaSamplerContext?arg0)?{

//?結(jié)束時間

end?=?System.currentTimeMillis();

//?總體耗時

System.err.println("cost?time:"+?(end?-?start)?/1000);

}

/**

*?JMeter界面中可手工輸入?yún)?shù),代碼里面通過此方法獲取

*/

publicArguments?getDefaultParameters()?{

Arguments?args?=newArguments();

returnargs;

}

/**

*?JMeter測試用例入口

*/

@Override

publicSampleResult?runTest(JavaSamplerContext?arg0)?{

SampleResult?sr?=newSampleResult();

try{

//?Start

sr.sampleStart();

/**

*?Start~End內(nèi)的代碼會被JMeter

*?納入計(jì)算吞吐量的范圍內(nèi),為了使

*?性能結(jié)果合理,無關(guān)代碼不必放此

*/

//?TODO

/**

*?True/False可按測試邏輯傳值

*?JMeter會對失敗次數(shù)做出統(tǒng)計(jì)

*/

sr.setSuccessful(true);

//?End

sr.sampleEnd();

}catch(Exception?e)?{

e.printStackTrace();

}

returnsr;

}

}

4放仗、導(dǎo)出成Jar并置于 $JMeter安裝目錄/lib/ext/ 下润绎,若有依賴Jar也置于 $JMeter安裝目錄/lib/ 下;

5匙监、啟動或重啟JMeter凡橱。

三、運(yùn)行用例

1亭姥、主界面左側(cè)“測試計(jì)劃”稼钩,右鍵菜單->添加->Threads(Users)->線程組;

2达罗、再選中剛才新增的"線程組"坝撑,右鍵菜單->添加->Sampler->Java請求;

3粮揉、再選中剛才新增的"Java請求"巡李,右鍵菜單->添加->監(jiān)視器->聚合報告;

4扶认、選擇想測試的類名侨拦,并在"線程組"選項(xiàng)中輸入循環(huán)次數(shù)及并發(fā)線程數(shù);

5辐宾、點(diǎn)擊菜單欄上"運(yùn)行"->啟動后便開始運(yùn)行狱从,在"聚合報告"查看結(jié)果數(shù)據(jù)。

Tips:

1.若在"Java請求"選項(xiàng)中未找到測試用例類名: 則請先確認(rèn)用例是否繼承了JMeter框架的基類叠纹; 其次保證用例Jar文件在 $安裝目錄/lib/ext/ 下季研; 嘗試重啟JMeter。

2.如果對于java請求的讀取仍然存在各種各樣的問題誉察,很大可能是java版本不一致造成的与涡,jmeter編譯時java版本大多為1.6,所以可以嘗試將編譯java類java版本保持和jmeter編譯java版本的一致持偏,或者拿到j(luò)meter源碼驼卖,在本地再次編譯jmeter。


在這里貼上jmeter調(diào)用dubbo協(xié)議的代碼:

package com.pingan;

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

import org.apache.jmeter.config.Arguments;

importorg.apache.jmeter.protocol.java.sampler.JavaSamplerClient;

importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;

importorg.apache.jmeter.samplers.SampleResult;

importcom.alibaba.dubbo.config.ApplicationConfig;

importcom.alibaba.dubbo.config.ReferenceConfig;

import com.alibaba.dubbo.config.RegistryConfig;

importcom.alibaba.dubbo.rpc.service.GenericService;

import com.paic.pafa.ac.dubbo.GenericParam;

importcom.paic.pafa.ac.dubbo.GenericResult;

public class DubboClient implementsJavaSamplerClient {

publicstatic int j = 0;

publicstatic int j1 = 0;

publicstatic int p= 0;

GenericServicegenericService = null;

//publicDubboClient() {

//System.out.println("gouzao");

//run();

//System.out.println("finish");

//

//}

publicSampleResult runTest(JavaSamplerContext jsc) {

SampleResultsampleResult = new SampleResult();

GenericParamparam = new GenericParam();

param.setParams(getParams());

try{

sampleResult.sampleStart();

GenericResultresult = (GenericResult) genericService.$invoke("anymethod",

newString[] { "com.paic.pafa.ac.dubbo.GenericParam" }, new Object[] {param });

System.out.println(result.getResult());

sampleResult.setResponseCodeOK();

sampleResult.setResponseMessageOK();

sampleResult.setSuccessful(true);

sampleResult.setResponseData(result.getResult().toString(),"UTF-8");}

catch(Exceptione){

sampleResult.setResponseCode("error");

sampleResult.setResponseMessage("error");

sampleResult.setSuccessful(false);

sampleResult.setResponseData("帥哥鸿秆,貌似是你的網(wǎng)不通款慨,或者服務(wù)掛了", "UTF-8");

j1++;

}

finally{

sampleResult.sampleEnd();

}

returnsampleResult;

}

publicstatic void main(String[] args) {

DubboClientclient = new DubboClient();

client.setupTest(null);

client.runTest(null);

}

publicString run() {

//DubboClientclient = new DubboClient();

setupTest(null);

returnrunTest(null).toString();

}

publicstatic void main1(String[] args) {

intcount=90;

inti=0;

for(;i

newThread(new Runnable() {

publicvoid run() { //新啟動一個線程,避免時間的浪費(fèi)

for(;;){

DubboClientclient = new DubboClient();

client.setupTest(null);

client.runTest(null);

client.j++;

System.out.println(j+"error"+j1);

}

}

}).start();}

}

publicArguments getDefaultParameters() {

//TODO Auto-generated method stub

returnnull;

}

publicvoid setupTest(JavaSamplerContext arg0) {

try{

ReferenceConfigreference = new ReferenceConfig();

reference.setUrl("dubbo://10.21.99.79:20882/esb-proxy.service.B10013_000000");

reference.setInterface("esb-proxy.service.B10013_000000");

reference.setGeneric(true);

reference.setApplication(newApplicationConfig("ff-test"));

reference.setTimeout(10000);

reference.setRegistry(newRegistryConfig("zookeeper://10.21.66.48:2181"));

genericService = reference.get();}

catch(Exceptione){

System.out.print("error\n\n\n");

}

}

publicvoid teardownTest(JavaSamplerContext arg0) {

//TODO Auto-generated method stub

}

publicMap getParams() {

Map params = new HashMap();

Map esbRequest = new HashMap();

Map header = new HashMap();

Map content = new HashMap();

esbRequest.put("content",content);

esbRequest.put("header",header);

StringsendSerialNo = this.getSeqNo();

esbRequest.put("sendSerialNo",sendSerialNo);

esbRequest.put("idType","1");

esbRequest.put("idNo","1");

params.put("esbRequest",esbRequest);

params.put("timeOutMs","30000");

params.put("systemId","958537");

params.put("requestNo",sendSerialNo);

returnparams;

}

publicString getSeqNo() {

returnString.valueOf(System.currentTimeMillis() + System.nanoTime() + newRandom().nextInt(2));

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谬莹,一起剝皮案震驚了整個濱河市檩奠,隨后出現(xiàn)的幾起案子桩了,更是在濱河造成了極大的恐慌,老刑警劉巖埠戳,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件井誉,死亡現(xiàn)場離奇詭異,居然都是意外死亡整胃,警方通過查閱死者的電腦和手機(jī)颗圣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屁使,“玉大人在岂,你說我怎么就攤上這事÷牛” “怎么了蔽午?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酬蹋。 經(jīng)常有香客問我及老,道長,這世上最難降的妖魔是什么范抓? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任骄恶,我火速辦了婚禮,結(jié)果婚禮上匕垫,老公的妹妹穿的比我還像新娘僧鲁。我一直安慰自己,他們只是感情好象泵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布寞秃。 她就那樣靜靜地躺著,像睡著了一般单芜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上犁柜,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天洲鸠,我揣著相機(jī)與錄音,去河邊找鬼馋缅。 笑死扒腕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萤悴。 我是一名探鬼主播瘾腰,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼覆履!你這毒婦竟也來了蹋盆?” 一聲冷哼從身側(cè)響起费薄,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栖雾,沒想到半個月后楞抡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡析藕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年召廷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片账胧。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡竞慢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出治泥,到底是詐尸還是另有隱情筹煮,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布车摄,位于F島的核電站寺谤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吮播。R本人自食惡果不足惜变屁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望意狠。 院中可真熱鬧粟关,春花似錦、人聲如沸环戈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽院塞。三九已至遮晚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拦止,已是汗流浹背县遣。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汹族,地道東北人萧求。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像顶瞒,于是被迫代替她去往敵國和親夸政。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理榴徐,服務(wù)發(fā)現(xiàn)守问,斷路器匀归,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法酪碘,內(nèi)部類的語法朋譬,繼承相關(guān)的語法,異常的語法兴垦,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 0 準(zhǔn)備 安裝注冊中心:Zookeeper徙赢、Dubbox自帶的dubbo-registry-simple;安裝Du...
    七寸知架構(gòu)閱讀 13,989評論 0 88
  • 關(guān)鍵詞:全局把控探越、細(xì)節(jié)到位狡赐、加強(qiáng)行動力 工作內(nèi)容: 1、蔓之研許昌新田360店--效果圖繪制 2钦幔、哈爾濱鯊魚咬吐司...
    不一樣的Jing閱讀 457評論 0 0
  • 對于繪畫枕屉,我真的可以說從沒想過,有一天鲤氢,能弱弱地拿起筆來畫一個稱之為東西的東西搀擂。小時候存在的記憶僅限于畫過一只兩條...
    想和小魚一起游閱讀 1,439評論 0 2