使用Jmeter測試thrift接口


術語描述

jmeter:一款性能壓力測試工具,支持多種協議,java 、http 等,但是不支持thrift

thrift:跨語言的RPC調用框架,提供編譯器,可以將thrift接口生成不同語言的接口服務類

此處以一個Jmeter測試thrift接口的為案例記錄下如何做!

案例描述:

一個thrift接口 ,入參String, 返回結果為入參String ,接口邏輯,打印入參內容。

操作步驟概述:

1、准備thrift接口文件HelloWorld.thrift

2、使用thrift.exe  將HelloWorld.thrift 編譯生成 java 文件

3、創建maven項目,添加依賴包,添加步驟2生成的java文件

4、創建接口實現類

5、創建thrift server

6、創建thrift client

7、創建Jmeter Java測試類

8、運行thrift server

9、運行thrift client測試

10、打包放到jmeter\lib\ext下面

11、運行Jmeter 創建java測試請求

詳細操作步驟:

1、創建thrift接口文件(文件擴展名是“.thrift”)HelloWorld.thrift

namespace java com.joker.thrift   // 定義生成java類文件的包名字,以及語言種類 
  
//定義入參  
struct Request {    
    1: optional string msg;                 
}  

//定義返回參數
struct Response {    
    1: optional string msg;                 
}

//定義異常  
exception OutOfLengthException {  
    1: optional string reason;  
}  
  
// 定義接口名稱  
service HelloWorldService {  
    Response say(1: Request request) throws (1:OutOfLengthException outOfLengthException); // 可能拋出異常。  
} 

2、使用thrift.exe  將HelloWorld.thrift 編譯生成 java 文件,執行完下面命令會產生java文件 (https://mirror.bit.edu.cn/apache/thrift/0.13.0/thrift-0.13.0.exe)

D:\thrift> .\thrift-0.13.0.exe -r -gen java .\HelloWorld.thrift   // 這是在win下面的命令行執行的執行的,不要復制粘貼就執行,看自己的 thrift-0.13.0.exe 和 HelloWorld.thrift 文件的位置  

3、創建maven項目,添加依賴包,添加步驟2生成的java文件 (不會的請百度)

最終的maven工程的目錄結構:(lib包是要自己新建一個lib文件夾,然后將jmeter安裝目錄下面的lib/ext/拷貝到lib下面來)

 

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.hhl</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>demo</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
	<!-- junit測試依賴,可以不要,創建maven項目自帶 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		
		<!-- thrift依賴 -->
		<dependency>
			<groupId>org.apache.thrift</groupId>
			<artifactId>libthrift</artifactId>
			<version>0.13.0</version>
		</dependency>

        <!-- 將lib文件夾下面的包添加依賴 -->
		<dependency>
          <groupId>org.apache</groupId>
          <artifactId>jmeter-java</artifactId>
          <version>1.0</version>
          <scope>system</scope>
          <systemPath>${basedir}/lib/ApacheJMeter_java.jar</systemPath>
        </dependency>
        
         <!-- 將lib文件夾下面的包添加依賴 -->
        <dependency>
          <groupId>org.apache</groupId>
          <artifactId>jmeter-core</artifactId>
          <version>1.0</version>
          <scope>system</scope>
          <systemPath>${basedir}/lib/ApacheJMeter_core.jar</systemPath>
        </dependency>
        
	</dependencies>

	<build>
		<plugins>
			<!-- 指定jdk -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

4、創建接口實現類HelloWorldServiceImpl.java

package com.joker.thrift.impl;

import org.apache.thrift.TException;

import com.joker.thrift.HelloWorldService;
import com.joker.thrift.OutOfLengthException;
import com.joker.thrift.Request;
import com.joker.thrift.Response;

public class HelloWorldServiceImpl implements HelloWorldService.Iface{

	@Override
	public Response say(Request request) throws OutOfLengthException, TException {
		
		Response response = new Response();
		response.setMsg(request.getMsg());
		System.out.print("HelloWorldServiceImpl.say = "+request.getMsg());
		if(request.getMsg().length() > 20) {
			throw new OutOfLengthException();
		}
		
		return response;
	}

}

5、創建thrift server

package com.joker.thrift.server;

import java.net.ServerSocket;

import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;

import com.joker.thrift.HelloWorldService;
import com.joker.thrift.HelloWorldService.Processor;
import com.joker.thrift.impl.HelloWorldServiceImpl;

public class HelloWorldServer {
	public static void main(String[] args) throws Exception{

		  // Transport
        ServerSocket socket = new ServerSocket(8888);
        TServerSocket serverTransport = new TServerSocket(socket);

        // Processor
        HelloWorldService.Processor processor = new Processor(new HelloWorldServiceImpl());

        TServer.Args tServerArgs = new TServer.Args(serverTransport);
        tServerArgs.processor(processor);

        // Server
        TServer server = new TSimpleServer(tServerArgs);
        System.out.println("Starting the simple server...");
        server.serve();
		
	}
} 

6、創建thrift client

package com.joker.thrift.client;

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

import com.joker.thrift.HelloWorldService;
import com.joker.thrift.Request;
import com.joker.thrift.Response;

public class HelloWorldClient {
	public static void main(String[] args) {
		TTransport transport = null;
		try {
			// 創建TTransport
			transport = new TSocket("localhost", 8888);

			// 創建TProtocol 協議要與服務端一致
			TProtocol protocol = new TBinaryProtocol(transport);

			// 創建client
			HelloWorldService.Client client = new HelloWorldService.Client(protocol);

			transport.open(); // 建立連接

			Request request = new Request();  // 構造請求參數
			request.setMsg("Hello world!!");

			Response response = client.say(request);  // client調用server端方法
			
			System.out.println("result = "+response.msg);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			transport.close(); // 請求結束,斷開連接

		}
	}
}

7、創建Jmeter Java測試類

package com.joker.thrift.jmeter;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

import com.joker.thrift.HelloWorldService;
import com.joker.thrift.Request;
import com.joker.thrift.Response;

public class HelloWorldServiceTest extends AbstractJavaSamplerClient{

	 private TTransport transport;
	 private HelloWorldService.Client helloWorldService;
	 private TBinaryProtocol binaryProtcol;
	
	@Override
	public SampleResult runTest(JavaSamplerContext context) {  // 需要關注的是這一塊
		System.out.println(" runTest start");
		Request request = new Request();
		request.setMsg(context.getParameter("msg"));		 
		
		SampleResult result = new SampleResult();  // 記錄響應結果
		result.sampleStart(); // 開始記錄
		try {
			Response response = helloWorldService.say(request);  // 調用thrift生成的 service類中的方法
			result.setResponseData(response.getMsg().getBytes());
			result.setSuccessful(true);  // 設置成功
		} catch (TException e) {
			result.setSuccessful(false);  // 設置失敗
			e.printStackTrace();
		}
		result.sampleEnd();  // 記錄結束 用於統計耗時的
		return result;
	}

	@Override
	public Arguments getDefaultParameters() {  // 這個數獲取默認參數的,應該是可以定制化的,在jmeter上面配置
		System.out.println(" getDefaultParameters start");
		Arguments args = new Arguments();
		args.addArgument("msg","LoveHHL");
		return args;
	}

	@Override
	public void setupTest(JavaSamplerContext context) { // 創建請求
		
		super.setupTest(context);		
		System.out.println(" setupTest start");
		transport =  new TSocket("localhost",8888);
		binaryProtcol = new TBinaryProtocol(transport);
		helloWorldService = new HelloWorldService.Client(binaryProtcol);
		
		try {
			transport.open();
		} catch (TTransportException e) {
			transport.close();
			e.printStackTrace();
		}
		
	}

	@Override
	public void teardownTest(JavaSamplerContext context) {  // 關閉資源
		super.teardownTest(context);
		System.out.println(" teardownTest start");
		transport.close();
		
	}

}

8、運行thrift server

 

 

9、運行thrift client測試

 

查看下thrift server

10、打包放入到jmeter\lib\ext下面(libthrift-0.13.0.jar 和 新建的工程打的包)

mvn clean install  // 將創建的maven工程打成jar包,在項目的根目錄下面執行

11、運行Jmeter 創建java測試請求 (thrift server 需要啟動--IDE里面的main函數啟動)

 

測試結果

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM