術語描述
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函數啟動)

測試結果

