术语描述

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函数启动)

测试结果

使用Jmeter测试thrift接口的更多相关文章

  1. jmeter测试dubbo接口

    本文讲解jmeter测试dubbo接口的实现方式,文章以一个dubbo的接口为例子进行讲解,该dubbo接口实现的功能为: 一:首先我们看服务端代码 代码架构为: 1:新建一个maven工程,pom文 ...

  2. jmeter 测试websocket接口(一)

    jmeter 测试websocket接口时,需要对jmeter添加测试websocket的jar包. 下载地址: https://download.csdn.net/download/qq_14913 ...

  3. jmeter 测试restful接口

    jmeter 测试restful接口,JSON数据格式 1.添加线程组 2.添加HTTP信息头管理器 请求发送JSON数据格式参数,需要设置Content-Type为application/json ...

  4. jmeter测试 flask 接口请求

    jmeter测试 flask 接口请求 flask的代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- from flask import Flas ...

  5. 『动善时』JMeter基础 — 50、使用JMeter测试WebService接口

    目录 1.什么是WebService 2.WebService和SOAP的关系 3.什么是WSDL 4.测试WebService接口前的准备 (1)如何判断是WebService接口 (2)如何获取W ...

  6. 『动善时』JMeter基础 — 50、使用JMeter测试WebSocket接口

    目录 1.什么是WebSocket接口 2.为什么需要WebSocket 3.测试WebService接口前的准备 4.WebSocket Sampler组件界面详解 5.使用JMeter测试WebS ...

  7. 『动善时』JMeter基础 — 51、使用JMeter测试WebService接口

    目录 1.什么是WebService 2.WebService和SOAP的关系 3.什么是WSDL 4.测试WebService接口前的准备 (1)如何判断是WebService接口 (2)如何获取W ...

  8. JMeter测试dubbo接口总结

    Jmeter 测试dubbo 接口 1. 安装JMeter 安装到/usr/local下 2. github上下载 jmeter-plugins-dubbo-x.x.x-jar-with-depend ...

  9. Jmeter - 测试 http 接口

    前言: 本文主要针对http接口进行测试,使用Jmeter工具实现. Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对 ...

随机推荐

  1. unity 顶点弹性网格效果

    1.球衰减 首先,我们将处理球衰减,鼠标或手指点中网格的点是碰撞点,越往外它所受的影响越小.我们需要从CPU中获取"_ImpactPos"这个碰撞点,获取摄像机和碰撞点的矢量,我们 ...

  2. [web安全原理分析]-文件上传漏洞基础

    简介 前端JS过滤绕过 待更新... 文件名过滤绕过 待更新 Content-type过滤绕过 Content-Type用于定义网络文件的类型和网页编码,用来告诉文件接收方以什么形式.什么编码读取这个 ...

  3. 使用Beyond Compare对比大篇幅文件的小技巧

    我们在编辑较大篇幅的文章时,无可避免地要经过多次的修改.有时候修改的版本过多时,我们很可能就会记不清最新版的文章对比上一版的文章,究竟修改了哪些地方.但有了Beyond Compare(Windows ...

  4. 使用Camtasia制作我的观影报告

    最近抖音兴起做<我的观影报告>风潮.<我的观影报告>是通过剪辑影片+旁白的方法,将自己观看过的影片安利给观众的方式.如果大家想要制作这类型的观影报告,建议使用Camtasia( ...

  5. 电子邮件怎么用EasyRecovery恢复,只需简单5步

    在日常工作中,我们常常会用电子邮件与上事.客户等协商工作事务.电子邮件快捷.方便,慢慢地成为我们工作中不可缺少的沟通工具之一. 然而使用的过程中,你会发现垃圾邮件也越积越多了,平时,我看到积压的垃圾邮 ...

  6. 利用css3实现照片列表展开小demo

    效果如下: 其实实现起来很简单,就是控制 宽 高的变化,然后给他加上transition 过度而已.觉得代码没什么难的地方,就不打注释了,如果哪里有不懂的话,可以直接评论呢. 直接上源码 html代码 ...

  7. python 工业日志模块 未来的python日志最佳实践

    目录 介绍 好的功能 安装方法 参数介绍 呆log 参数与 使用方法 版本说明 后期版本规划 todo 感谢 介绍 呆log:工业中,python日志模块,安装即用.理论上支持 python2, py ...

  8. zabbix 监控域名证书到期时间!!!!

    在客户端机器上创建脚本 vim /etc/zabbix/zabbix_agentd.d/check-cert-expire.sh #!/bin/sh host=$1port=$2end_date=`o ...

  9. ②SpringCloud 实战:引入Feign组件,完善服务间调用

    这是SpringCloud实战系列中第二篇文章,了解前面第一篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 简介 Feign 是一个声明式的 RE ...

  10. GraphicsLab 之 Atmospheric Scattering (一)

    作者:i_dovelemon 日期:2020-10-11 主题:Atmospheric Scattering, Volume Scattering, Rayleigh Scattering, Mie ...