使用Jmeter進行RPC壓力測試

LyraQA發表於2017-10-10

使用Jmeter進行RPC壓力測試

為了支援相關部門進行RPC協議的壓測,初步瞭解了Jmeter如何使用java請求進行壓測。

一、 下載Jmeter,進行解壓即可使用,適用於windows和linux。用的版本為apache-jmeter-3.2
二、需要建立可用的java工程。

使用Java sample進行壓測,需要建立一個類並實現JavaSamplerClient介面或繼承AbstractJavaSamplerClient,並重寫:

  1. public Arguments getDefaultParameters():設定可用引數的預設值;
  2. public void setupTest(JavaSamplerContext arg0):每個執行緒測試前執行一次,做一些初始化工作;
  3. public SampleResult runTest(JavaSamplerContext
    arg0):開始測試,從arg0引數可以獲得引數值;
  4. public void teardownTest(JavaSamplerContext arg0):測試結束時呼叫;

介面壓測的主要測試程式碼如下所示,main函式是方便除錯程式碼。motan的配置放在了setupTest中。 為了使用Jmeter進行測試在工程中新增本地依賴,依賴JMeter的lib目錄下的jar檔案ApacheJMeter_core.jar,ApacheJMeter_java.jar和jorphan.jar

public class PerformenceTest extends Abstract JavaSamplerClient {
    private static AlgFeedServiceMotan algFeedServiceMotan=null;
    private Logger log = getLogger();

// 初始化方法,實際執行時每個執行緒僅執行一次,在測試方法執行前執行
    @Override
    public void setupTest(JavaSamplerContext arg0){
    ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] { "classpath:my.xml" });
    algFeedServiceMotan = (AlgFeedServiceMotan) ctx.getBean("algFeedServiceRefer");
    log.info("---- 啟動執行緒 ----");
    }
// 結束方法,實際執行時每個執行緒僅執行一次,在測試方法執行結束後執行     
    @Override
    public void teardownTest(JavaSamplerContext arg0){
     log.info("---- 結束執行緒 ----");;
    }
// 設定傳入的引數,可以設定多個,已設定的引數會顯示到Jmeter的引數列表中
    @Override
    public Arguments getDefaultParameters() {
        Arguments args = new Arguments();
        return args;
    }
// 測試執行的迴圈體,根據執行緒數和迴圈次數的不同可執行多次

    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
    String ruids="xxxxx";
    next = random.nextInt(22);
    String[] uids={"yyyyy"};
    SampleResult sampleResult = new SampleResult();
    boolean success = true;
    try {
            sampleResult.sampleStart();
            String str_uids = javaSamplerContext.getParameter("ruids");
            String str_fids = javaSamplerContext.getParameter("uids");
            RankedWeibo rankedWeibo = algFeedServiceMotan.rank(0,"fenzuxxx",ruids,uids);
            if(rankedWeibo != null && rankedWeibo.getData() != null && 0 == rankedWeibo.getCode()){
                success = true;
            }else {
                success = false;
            }
        } catch (Throwable e) {
            success = false;
            e.printStackTrace();
            log.info(e.getMessage());
        } finally {
            sampleResult.sampleEnd();  // jmeter 結束統計響應時間標記
            sampleResult.setSuccessful(success);
        }
        return sampleResult;
    }

//Jmeter不執行main函式。
    public static void main(String[] args) {
        Arguments params = new Arguments();
        params.addArgument("ruids", "xxxxx");//設定引數,並賦予預設值 
        params.addArgument("uids", "xxxx,xxx,xx");//設定引數,並賦予預設值
        JavaSamplerContext arg0 = new JavaSamplerContext(params);
        PerformenceTest test = new PerformenceTest();
        test.setupTest(arg0);
        test.runTest(arg0);
        test.teardownTest(arg0);
        System.exit(0);
    }}

二、工程建好後。需要打成jar包供Jmeter呼叫
一般情況可以將工程直接打包為可執行檔案,再將jar包放在Jemter檔案的JMETER_HOME\lib\ext目錄即可。方法如下

  1. 直接Export為Runnable Jar File(eclipse和InteliJ IDEA方法各異)
  2. 在pom檔案中使用外掛打包
    a.使用maven-assembly-plugin打包成獨立可執行的jar包。可以將java工程及其全部依賴jar進行打包
    工程一般依賴了很多的jar包,而被依賴的jar又會依賴其他的jar包,這樣,當工程中依賴到不同的版本的spring時,在使用assembly進行打包時,
    只能將某一個版本jar包下的spring.schemas檔案放入最終打出的jar包裡,這就有可能遺漏了一些版本的xsd的本地對映,導致報錯。
    b.使用maven-shade-plugin可以解決這個問題,它能夠將所有jar裡的spring.schemas檔案 進行合併,在最終生成的單一jar包裡,spring.schemas包含了所有出現過的版本的集合。
    那些資源要單獨打此類配置檔案,需要和開發溝通。
    c.由於打成可執行jar包,配置motan服務時總有衝突出現。壓測時也可以採用maven-jar-plugin將工程打包(工程依賴的jar包不會一起打入)
    採用maven-dependency-plugin進行依賴。maven-jar-plugin會將工程依賴的所有jar包放在target/lib 檔案中。
    打包完成後,將jar包和lib檔案一起放入JMETER_HOME\lib\ext目錄即可。
另外在打包時需要將外部包ApacheJMeter_core.jar,ApacheJMeter_java.jar和jorphan.jar加入,打包時才不會報錯。

a.這裡我採用手動mvn install到本地倉庫,然後進行引用。版本名稱如下,並在pom中引入

<dependency>
<groupId>org.ApacheJmeterCore</groupId>
<artifactId>ApacheJmeterCore</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.ApacheJmeterJava</groupId>
<artifactId>ApacheJmeterJava</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.jorphan</groupId>
<artifactId>jorphan</artifactId>
<version>1.0</version>
</dependency>

b.在工程中新建資料夾lib,放入外部引用的這三個jar包。依賴本地

<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/ApacheJMeter_java.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/ApacheJMeter_core.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>jorphan</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/logkit-2.0.jar</systemPath>
</dependency>

三、在Jmeter資料夾bin資料夾下開啟Jmeter
建立執行緒組、Java Request、結果樹,進行測試;
線上程組中右鍵選擇Sampler->java 請求,類名稱中出現自己寫的類,即打包成功可進行呼叫壓測。

相關文章