参考资料:http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/

首先是定义thrift IDL接口,如下(SunTelTc.thrift):


namespace cpp SunTelTc
namespace java SunTelTc
namespace go SunTelTc struct TCRequest {
  1: required string desString,
  2: required string accountId,
  3: required i64   tmpTime,
  4: required string caller,
  5: required string called,
  6: optional string servletUrl,
  7: optional string otherParam,
} struct TCResponse {
  1: required i32 state,
  2: required string msg,
  3: optional string taskId,
  4: optional string otherParam,
} struct TCXdrReq {
  1: required string taskId,
  2: required string ecp,
  3: required i64 t100,
  4: required i64 t180,
  5: required i64 t200,
  6: required i64 t301,
  7: required i64 t302,
  8: required i64 t401,
  9: required i64 t402,
  10: required i64 t501,
  11: optional string otherParam,
} struct TCXdrRes {
  1: required i32 state,
  2: required string msg,
} /*
exception InvalidRequest {
  1: i32 what,
  2: string why
}*/ service TcRequest {
    void ping(),
    TCResponse SendTcReuest(1:TCRequest request),
    oneway void SendTcRequestNonblock(1:TCRequest request),
} service TcXdr {
    TCXdrRes ReportXdr (1:TCXdrReq xdr);
    oneway void ReportXdrNonblock (1:TCXdrReq xdr);
}

生成对应代码

thrift --gen cpp SunTelTc.thrift
thrift --gen java SunTelTc.thrift
thrift --gen go SunTelTc.thrift

以c++为例,响应文件如下

[root@oracle gen-cpp]# ll

-rw-r--r-- 1 root root    300 5月   8 13:18 SunTelTc_constants.cpp
-rw-r--r-- 1 root root    388 5月   8 13:18 SunTelTc_constants.h
-rw-r--r-- 1 root root  23827 5月   8 13:18 SunTelTc_types.cpp
-rw-r--r-- 1 root root   7887 5月   8 13:18 SunTelTc_types.h
-rw-r--r-- 1 root root  19102 5月   8 13:18 TcRequest.cpp
-rw-r--r-- 1 root root  14673 5月   8 13:18 TcRequest.h
-rw-r--r-- 1 root root   1701 5月   8 14:46 TcRequest_server.skeleton.cpp
-rw-r--r-- 1 root root  12781 5月   8 13:18 TcXdr.cpp
-rw-r--r-- 1 root root  10612 5月   8 13:18 TcXdr.h
-rw-r--r-- 1 root root   1461 5月   8 13:18 TcXdr_server.skeleton.cpp

以C++为例,修改服务器端代码(可选),修改TcRequest_server.skeleton.cpp中SendTcReuest函数,增加如下代码


_return.__set_state(0);
_return.__set_msg("success");
_return.__set_taskId("20150508101010");
printf("SendTcReuest\n");

编写客户端代码


#include <iostream>
#include <time.h>
#include "TcRequest.h"
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/protocol/TBinaryProtocol.h> using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using boost::shared_ptr;
using namespace SunTelTc;
using namespace std; int main(int argc, char **argv)
{
        shared_ptr<TTransport> socket(new TSocket(argv[1],atoi(argv[2])));
        shared_ptr<TTransport> transport(new TBufferedTransport(socket));
        shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));         TcRequestClient client(protocol);
        time_t begin=time(NULL);
        try {
                transport->open();
                client.ping();
                while(1){
                        static int i = 0;
                        if(i++ % 1000 == 0)
                        {
                                time_t end=time(NULL);
                                cout<<end-begin<<endl;
                        }
                        if(i==100000)
                                break;
                        TCRequest tcRequest;
                        TCResponse pResponse;
                        tcRequest.__set_desString("abcdefghijk");
                        client.SendTcReuest(pResponse,tcRequest);
                        //cout<<"state="<<pResponse.state<<" msg="<<pResponse.msg<<" taskid="<<pResponse.taskId<<endl;
                }
                transport->close();
        } catch (TException &tx) {
                printf("ERROR: %s\n", tx.what());
        }
        time_t end=time(NULL);
        cout<<"use time="<<end-begin<<endl;
        return 0;
}

编译

g++ SunTelTc_constants.cpp SunTelTc_types.cpp client.cpp TcRequest.cpp -o client -lthrift
g++ SunTelTc_constants.cpp SunTelTc_types.cpp TcRequest_server.skeleton.cpp TcRequest.cpp -o server -lthrift

测试结果

本机客户端单线程测试100万次请求,花费55s,性能基本上能满足业务需求了。

thrift使用案例的更多相关文章

  1. 思数云hadoop目录

    全文检索.数据分析挖掘.推荐系统.广告系统.图像识别.海量存储.快速查询 l Hadoop介绍 n Hadoop来源与历史 n Hadoop版本 n Hadoop开源与商业 l HDFS系统架构 n ...

  2. 和 Thrift 的一场美丽邂逅

    一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化” + “方式”.“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化 ...

  3. Apache thrift RPC 双向通信

    在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...

  4. WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例

    最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...

  5. Thrift简单实践

    0.什么是RPC RPC(Remote Procedure Call - 远程过程调用),是通过网络从远程计算机上请求服务,而不需要了解底层网路技术的细节.简单点说,就是像调用本地服务(方法)一样调用 ...

  6. Hadoop-HBASE案例分析-Hadoop学习笔记<二>

    之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X概述第八章的笔记 主要介绍HBase,一个分布式数据库的应用案例. 案例概况: 1)时间序列数据库(OpenTSD ...

  7. python thrift 服务端与客户端使用

    一.简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, ...

  8. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

  9. _00019 Storm架构介绍和Storm获取案例(简单的官方网站Java案例)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

随机推荐

  1. 【转】EF 获取类的属性并排除特定属性(getType().GetProperties())

    当获取一个类型(class)的所有属性时,想排除指定属性,该如何操作? 比如:EF中一个实体类型UserEntity,通过反射获取这个类的属性时,想排除这个为映射的字段ID 使用以下方法即可! Pro ...

  2. Python3组播通信编程实现教程(发送者+接收者)

    一.说明 1.1 标准组播解释 通信分为单播.多播(即组播).广播三种方式 单播指发送者发送之后,IP数据包被路由器发往目的IP指定的唯一一台设备的通信形式,比如你现在与web服务器通信就是单播形式 ...

  3. axios ajax fetch 区别

    请求方式千千万,axios是一种对ajax的封装,fetch是一种浏览器原生实现的请求方式,跟ajax对等

  4. etymon word write alb pain high alt increase large agency ag lose weight fat assist out~3

        1● alb   2● write =====>rait     1● alg 2● pain   痛,疼痛           1● alt 2● high   高         1 ...

  5. maven多模块项目找不到Class错误

    接手了一个maven管理的多模块项目,又是javaconfig,又是spring data jpa,还算是比较新比较正规的模块化结构吧..然后我往其中的一个模块中新添加了一个jpa的entity,然后 ...

  6. MyEclipse常用设置和快捷键

    Java快捷键 1.注释快捷键 先敲/  再敲两个**     Enter 回车 2.system.out.println(); 常用设置 [子类继承父类] [编码字体设置] 删除当前行:ctrl+d ...

  7. php把数据转换为json格式

    public function demos(){ $data=[ 'state'=>1, 'msg'=>'更新成功' ]; return json_encode($data); }

  8. shell脚本中出现图形化界面

    http://www.ttlsa.com/shell/how-to-create-dialog-boxes-in-interactive-shell-script/

  9. (C/C++学习笔记) 七. 类型转换

    七. 类型转换 ● 隐式类型转换 隐式类型转换 implicit type conversions #include<iostream> using namespace std; void ...

  10. C数据结构 : 线性表 与 链表

    一.线性表 一般表现为数组,使用一组地址连续的存储单元依次存储数据元素,如图: 它具有如下特点: 长度固定,必须在分配内存之前确定数组的长度. 存储空间连续,即允许元素的随机访问. 存储密度大,内存中 ...