[心得] Thrift协议以及相关压测经验踩坑总结

基于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版本的图标是不同的。所以依葫芦画瓢需要看清~

你可能感兴趣的:(技术笔记)