• 使用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、打包放到jmeterlibext下面

    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:	hrift> .	hrift-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、打包放入到jmeterlibext下面(libthrift-0.13.0.jar 和 新建的工程打的包)

    mvn clean install  // 将创建的maven工程打成jar包,在项目的根目录下面执行

    11、运行Jmeter 创建java测试请求 (thrift server 需要启动--IDE里面的main函数启动)

    测试结果

  • 相关阅读:
    【python】为什么IDE看很多源码的函数都是pass带过
    【PyQt5】使用pyqtgraph绘图时UI卡顿的解决
    Qt designer button图标适应控件大小
    【转载】标量,向量,矩阵与张量
    Python实现简单的HTTP服务器(支持文件下载)
    Python——Pygame实现生命游戏(game of life)
    mysql允许外部连接设置
    fastdfs在ubuntu的编译安装,php扩展fastdfs的安装
    ubuntu下安装mongodb
    ubuntu16.04安装mongo扩展出现的问题
  • 原文地址:https://www.cnblogs.com/mjoker0416/p/13221447.html
Copyright © 2020-2023  润新知