thrift使用案例
参考资料: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使用案例的更多相关文章
- 思数云hadoop目录
全文检索.数据分析挖掘.推荐系统.广告系统.图像识别.海量存储.快速查询 l Hadoop介绍 n Hadoop来源与历史 n Hadoop版本 n Hadoop开源与商业 l HDFS系统架构 n ...
- 和 Thrift 的一场美丽邂逅
一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化” + “方式”.“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化 ...
- Apache thrift RPC 双向通信
在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...
- WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...
- Thrift简单实践
0.什么是RPC RPC(Remote Procedure Call - 远程过程调用),是通过网络从远程计算机上请求服务,而不需要了解底层网路技术的细节.简单点说,就是像调用本地服务(方法)一样调用 ...
- Hadoop-HBASE案例分析-Hadoop学习笔记<二>
之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X概述第八章的笔记 主要介绍HBase,一个分布式数据库的应用案例. 案例概况: 1)时间序列数据库(OpenTSD ...
- python thrift 服务端与客户端使用
一.简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, ...
- (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)
本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...
- _00019 Storm架构介绍和Storm获取案例(简单的官方网站Java案例)
博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...
随机推荐
- provider和consumer配置参数的优先级
<dubbo:service>和<dubbo:reference>存在一些相同的参数,例如:timeout,retries等,那么哪个配置的优先级高呢? consumer合并u ...
- Android 常用动画
一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha :渐变透明度动画效果 scale :渐变尺寸伸缩 ...
- vue 小知识
图片: 1.img 的路径 <img :src="item.src"/> 2.背景图片的路径 v-bind:style="{backgroundImage: ...
- 由@Convert注解引出的jackson对枚举的反序列化规则
对于一些状态字段以前时兴用常量,现在时兴用枚举,虽然阅读体验极佳,但是传值的时候还是会有些麻烦,需要设置一下转换器.比如: class A{ @Convert(converter=TestTypeCo ...
- linux下/proc/diskstats文件详解
每一列的含义分别为: 第一列为 设备号 (number of issued reads. This is the total number of reads completed successfull ...
- laravel的validation 中文 文件
使用方法: 直接替换resources/lang/en/validation.php中的内容 <?php return [ 'unique' => ':attribute 已存在', 'a ...
- 将数组,矩阵存入csv文件中
我们在做各种模型训练时,往往会先将数据处理成矩阵,然后交给建模的人去训练.这时通常数据清洗者提交的是保存了矩阵的文件,一般为TXT或csv,接下来主要讲解我在实现这个过程中遇到的一些问题. impor ...
- Java代理:静态代理、动态代理
要理解动态代理,需要先理解反射(http://www.cnblogs.com/Donnnnnn/p/7729443.html) 通俗理解: 在很多底层框架中都会用得到,比如struts,Spring等 ...
- [Linux]Linux下开启snmp支持IPV4和IPV6
SNMP简介 简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol).数据库模型(database schema)和一组资源 ...
- (Java学习笔记) Java Threading (Java线程)
Java Threading (Java线程) ● Process & Thread Processes are the abstraction of running programs: A ...