基于HTTP的协议在互联网甚为流行。然后当传输效率更重要时,PB,Thrift协议以及Facebook2015年开源的超高速数据传输工具(Warp speed Data Transfer,WDT)。
这里对thrift协议做一下踩坑介绍。
目前流行的服务调用方式有很多种,
例如基于 SOAP 消息格式的 Web Service,
基于 JSON 消息格式的 RESTful 服务等。
其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。
Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。
thrift生成目标语言代码,
thrift -gen java HelloWorld.thrift
为了得到jar包,还需要掌握java包管理工具mvn。
mvn的核心是一个pom的概念,project object model。
POM 代表工程对象模型。它是使用 Maven 工作时的基本组件,是一个 xml 文件。它被放在工程根目录下,文件命名为 pom.xml。
能够在 POM 中设置的一些配置如下:
project dependencies
plugins
goals
build profiles
project version
developers
mailing list
每个工程应该只有一个 POM 文件。
所有的 POM 文件需要 project 元素和三个必须的字段:groupId, artifactId,version。
在仓库中的工程标识为 groupId:artifactId:version
POM.xml 的根元素是 project,它有三个主要的子节点:
节点 | 描述 |
---|---|
groupId | 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.company.bank 拥有所有的和银行相关的项目 |
artifactId | 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。 |
version | 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如:com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1 |
特别注意协议的问题,当时我们就掉坑里了。
以下是一个java客户端的例子:
package com.tc.test;
/**
* Created by topcoder on 16/11/23.
*/
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.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import query.*;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* when jmeter working, one thred has one instance of this class
*/
public class ThriftClientTest extends AbstractJavaSamplerClient {
private QueryService.Client query_client;
private TTransport transport;
private Query query = new Query();
/**
* do init job
* @param context
*/
public void setupTest(JavaSamplerContext context) {
super.setupTest(context);
transport = new TSocket("127.0.0.1", 8001);
System.out.println(transport);
transport = new TFramedTransport(transport);
try {
transport.open();
} catch (TTransportException e){
transport.close();
throw new RuntimeException(e);
}
TProtocol protocol = new TBinaryProtocol(transport);
query_client = new QueryService.Client(protocol);
}
/**
* do clean up job
* @param context
*/
public void teardownTest(JavaSamplerContext context) {
super.teardownTest(context);
transport.close();
}
public SampleResult runTest(JavaSamplerContext context) {
SampleResult result = new SampleResult();
result.sampleStart();
try {
System.out.println(query);
System.out.println(query_client.query_result(query));
} catch (TException e) {
result.setSuccessful(false);
}
result.sampleEnd();
System.out.println(result);
result.setSuccessful(true);
result.setResponseCode("code");
result.setResponseMessage("message");
return result;
}
}
代码ready之后,在工程目录执行mvn命令进行打包
$ mvn clean package
然后把jar包拷贝到jmeter的lib/ext目录。
最后,在测试计划里,配置thread group,以及sample java request即可。
注意,这里还有个坑,网上的jmeter 2.13和3.1版本的图标是不同的。所以依葫芦画瓢需要看清~