thrift的测试

尝试失败的版本
0.9.1 要求autoconf是2.56以上,默认的centos6.5是2.53
0.9.0
0.8.0 gcc版本不能是4.4,make写得太严格了,生成的代码,在gcc4.4下不可用
都不行
查到的解决方法http://blog.youkuaiyun.com/hoho568/article/details/7321611 尝试也不都能通过

最终确认
0.7.0

参考:
http://blog.youkuaiyun.com/hbuxiaoshe/article/details/6558391
http://jinghong.iteye.com/blog/1222713
下载
http://archive.apache.org/dist/thrift/0.7.0/thrift-0.7.0.tar.gz

yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel openssl-devel
yum remove qt
./configure --prefix=/usr/local/thrift --with-java --with-cpp --with-python
make
make install
设置环境变量
export PATH=$HADOOP_HOME/bin:$HIVE_HOME/bin:/usr/local/java/jdk1.6.0_45/bin:$HBASE_HOME/bin:$PATH:/usr/local/thrift/bin:/usr/local/git/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/thrift/lib


student.thrift:
struct Student{
1: i32 sno,
2: string sname,
3: bool ssex,
4: i16 sage,
}
service Serv{
void put(1: Student s),
}

thrift -r --gen cpp student.thrift
vim client.cpp
----------------
include "Serv.h"
#include <transport/TSocket.h>
#include <transport/TBufferTransports.h>
#include <protocol/TBinaryProtocol.h>

using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;

using boost::shared_ptr;

int main(int argc, char **argv) {
boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));

transport->open();

// 我们的代码写在这里
Student s;
s.sno = 123;
s.sname = "xiaoshe";
s.ssex = 1;
s.sage = 30;
ServClient client(protocol);
client.put(s);
//---
transport->close();

return 0;
}

----------------


---------------------------
# cat Serv_server.skeleton.cpp
// This autogenerated skeleton file illustrates how to build a server.
// You should copy it to another filename to avoid overwriting it.

#include "Serv.h"
#include <protocol/TBinaryProtocol.h>
#include <server/TSimpleServer.h>
#include <transport/TServerSocket.h>
#include <transport/TBufferTransports.h>

using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;

using boost::shared_ptr;

class ServHandler : virtual public ServIf {
public:
ServHandler() {
// Your initialization goes here
}

void put(const Student& s) {
// Your implementation goes here
printf("sno=%d sname=%s ssex=%d sage=%d/n", s.sno, s.sname.c_str(), s.ssex, s.sage);//这里是新加的
printf("put\n");
}

};

int main(int argc, char **argv) {
int port = 9090;
shared_ptr<ServHandler> handler(new ServHandler());
shared_ptr<TProcessor> processor(new ServProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();
return 0;
}

-----------------


g++ -g -I/usr/local/thrift/include/thrift -L/usr/local/thrift/lib/ -lthrift Serv.cpp student_types.cpp student_constants.cpp Serv_server.skeleton.cpp -o server
g++ -g -I/usr/local/thrift/include/thrift -L/usr/local/thrift/lib/ -lthrift -lm -pthread -lz -lrt -lssl Serv.cpp student_types.cpp student_constants.cpp client.cpp -o client


root@localhost gen-cpp]# ./server &
[1] 8553
# ./client
sno=123 sname=xiaoshe ssex=1 sage=30/nput (这里是server返回的)
#

-------------------java客户端----------

--------code begin----
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingSocket;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

//import UserService.Client;

public class UserClient {
private void start() {
try {
TTransport socket = new TSocket("localhost", 9090);
//TTransport transport = new TFramedTransport(socket);
TProtocol protocol = new TCompactProtocol(socket);

UserService.Client client = new UserService.Client(protocol);
socket.open();
System.out.println(client.get("lll"));

User u = new User();
u.uid="leojava";
u.uname="yueyue";
u.usex=true;
u.uage=3;
client.add(u);
socket.close();

} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
UserClient c = new UserClient();
c.start();

}
}

--------code end----

编译

javac -classpath /usr/local/lib/libthrift-0.7.0.jar:/usr/local/lib/slf4j-api-1.5.8.jar:/usr/local/lib/commons-lang-2.5.jar:/usr/local/lib/commons-codec-1.3.jar:/usr/local/lib/httpclient-4.0.1.jar:/usr/local/lib/httpcore-4.0.1.jar:/usr/local/lib/servlet-api-2.5.jar UserClient.java ./gen-java/*.java
java -classpath .:/usr/local/lib/libthrift-0.7.0.jar:/usr/local/lib/slf4j-api-1.5.8.jar:/usr/local/lib/commons-lang-2.5.jar:/usr/local/lib/commons-codec-1.3.jar:/usr/local/lib/httpclient-4.0.1.jar:/usr/local/lib/httpcore-4.0.1.jar:/usr/local/lib/servlet-api-2.5.jar:/usr/local/lib/slf4j-log4j12-1.6.1.jar:/usr/local/lib/log4j-1.2.17.jar:./gen-java/ UserClient

结果:
客户端
# java -classpath .:/usr/local/lib/libthrift-0.7.0.jar:/usr/local/lib/slf4j-api-1.5.8.jar:/usr/local/lib/commons-lang-2.5.jar:/usr/local/lib/commons-codec-1.3.jar:/usr/local/lib/httpclient-4.0.1.jar:/usr/local/lib/httpcore-4.0.1.jar:/usr/local/lib/servlet-api-2.5.jar:/usr/local/lib/slf4j-log4j12-1.6.1.jar:/usr/local/lib/log4j-1.2.17.jar:./gen-java/ UserClient
SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6, 1.5.7, 1.5.8]
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.
User(uid:leo1, uname:yueyue, usex:true, uage:3)
#
服务端
# ./UserServer
start user server...
uid=leo1 uname=yueyue usex=1 uage=3
uid=leojava uname=yueyue usex=1 uage=3


------------python---客户端

#!/usr/bin/env python
import sys
sys.path.append('./gen-py')
from acsuser import UserService
from acsuser.ttypes import *
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TCompactProtocol

# Make socket
transport = TSocket.TSocket('localhost', 9090)
# Buffering is critical. Raw sockets are very slow
transport = TTransport.TBufferedTransport(transport)
# Wrap in a protocol
protocol = TCompactProtocol.TCompactProtocol(transport)
# Create a client to use the protocol encoder
client = UserService.Client(protocol)
# Connect!
transport.open()
# Call Server services
u = client.get('lll')
print 'uid=%s uname=%s usex=%d u.uage=%d' %(u.uid,u.uname,u.usex,u.uage)

u1 = User()
u1.uid='leo'
u1.uname='yueyue'
u1.usex=1
u1.uage=3
client.add(u1)



结果
python PythonClient.py
uid=leo1 uname=yueyue usex=1 u.uage=3

-----------------传list的例子--------------

struct User{
1: string uid,
2: string uname,
3: bool usex,
4: i16 uage,
5: list<i32> subNodeList,
6: map<i32,string> subNodeMap,
7: set<i32> subNodeSet
}
service UserService{
void add(1: User u),
void addlist(1: list<User> u),
User get(1: string uid),
}


UserServer.cpp :
[code="java"]
# cat UserServer.cpp
#include "UserService.h"
#include <vector>
#include <config.h>
//#include <protocol/TBinaryProtocol.h>
#include <protocol/TCompactProtocol.h>
#include <server/TSimpleServer.h>
#include <transport/TServerSocket.h>
#include <transport/TBufferTransports.h>
#include <concurrency/ThreadManager.h>
#include <concurrency/PosixThreadFactory.h>
#include <server/TThreadPoolServer.h>
#include <server/TThreadedServer.h>
using namespace std;
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using namespace ::apache::thrift::concurrency;

using boost::shared_ptr;

class UserServiceHandler : virtual public UserServiceIf {
public:
UserServiceHandler() {
// Your initialization goes here
}

void add(const User& u) {
// Your implementation goes here
printf("uid=%s uname=%s usex=%d uage=%d\n", u.uid.c_str(), u.uname.c_str(), u.usex, u.uage);
printf("add\n");
}
//void addlist(const std::vector<User, std::allocator<User> > & u) {
void addlist(const std::vector<User> & u) {
std::vector<User>::const_iterator iter;
for(iter=u.begin();iter!=u.end();iter++) {
printf("u size: %d\n",u.size());
printf("send 1: %s, %s\n",(*iter).uid.c_str(),(*iter).uname.c_str());
}
//User rect;
//rect.uid="ning";
//rect.uname="haohao";
//rect.usex=0;
//rect.uage=3;
//u.push_back(rect);
//for(int x = 0; x < 5; x++)
//{
// u.push_back(new User());
//}
//std::vector<User, std::allocator<User>>::iterator it=u.begin();
//for(it=u.begin();it!=u.end();it++){
// std::cout<<"test"<<std::endl;
// cout<<(*it).id<<endl;
// printf("addlist---\n");
// }
printf("addlist---\n");
}
// void addlist(const std::Vector<User>& vec) {
// std::vector<User>::iterator it=vec.begin();
// for(it=vec.begin();it!=vec.end();it++){
// // cout<<"test"<<endl;
// // std::cout<<"addlist:"<<(*it).uid<<std::endl;
// printf("addlist id --%s\n",(*it).uid,c_str());
// }
// printf("addlist ---------\n");
// }

void get(User& _return, const std::string& uid) {
// Your implementation goes here
_return.uid = "tinghaode";
_return.uname = "ningge";
_return.usex = 1;
_return.uage = 3;
printf("uid=%s uname=%s usex=%d uage=%d\n", _return.uid.c_str(), _return.uname.c_str(), _return.usex, _return.uage);
printf("get\n");
}

};

int main(int argc, char **argv) {
shared_ptr<UserServiceHandler> handler(new UserServiceHandler());
shared_ptr<TProcessor> processor(new UserServiceProcessor(handler));
shared_ptr<TProtocolFactory> protocolFactory(new TCompactProtocolFactory());
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TServerTransport> serverTransport(new TServerSocket(9090));

shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(10);
shared_ptr<PosixThreadFactory> threadFactory = shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
threadManager->threadFactory(threadFactory);
threadManager->start();
printf("start user server...\n");

TThreadPoolServer server(processor, serverTransport, transportFactory, protocolFactory, threadManager);
server.serve();
return 0;
}

#
[/code]

UserClient.cpp :
[code="java"]
# cat UserClient.cpp
#include "UserService.h"
#include <config.h>
#include <vector>
#include <transport/TSocket.h>
#include <transport/TBufferTransports.h>
#include <protocol/TCompactProtocol.h>

using namespace std;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;

using boost::shared_ptr;

int main(int argc, char **argv) {
boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
boost::shared_ptr<TProtocol> protocol(new TCompactProtocol(transport));

transport->open();

User u;
u.uid = "leo";
u.uname = "yueyue";
u.usex = 1;
u.uage = 3;

UserServiceClient client(protocol);
client.add(u);

//-----list begin--
vector<User> vec;
User rect;
rect.uid="ning";
rect.uname="haohao";
rect.usex=0;
rect.uage=3;
vec.push_back(rect);
client.addlist(vec);
//-----list end----

User u1;
client.get(u1,"lll");

transport->close();
printf("uid=%s uname=%s usex=%d uage=%d\n", u1.uid.c_str(), u1.uname.c_str(), u1.usex, u1.uage);
return 0;
}
#
[/code]
注意
std::vector<User>::const_iterator iter
用const_iterator
【Python】Thrift rpc 接口测试 python thrift rpc 协议的接口自动化测试使用方案 阅读详情

相关推荐

thrift测试程序

thrift测试程序 包含客户端和服务端

Thrift接口测试实践

中很详细的介绍到针对不同的协议的测试,本质的核心思想都是一样的,都是客户端与服务端之间的请求/响应模式或者是异步通信的模式。在使用Thrift之前,首先需要搭建Thrift的环境,在Mac中,搭建环境成功后,输入命令:thrift -v就会显示具体的版本号信息,具体如下图所示。包含了用于绑定协议和传输层的基础架构,也是基于HTTP/2.0的版本实现,Thrift提供阻塞,非阻塞,单线程,多线程的模式运行在服务器上,结合。在如上代码中,对返回来的响应数据进行了反序列化的处理以及响应数据的验证。

2301_78843735的博客 413

Thrift接口查询、Scan过滤器

1 HBase分享六、Thrift接口查询、Scan过滤器 1.1 依据行键和列族过滤 1.2 据行键开始、行键结束和列族过滤 1.3 通过行键前缀进行查询 1.4 查找在当前指定时间之前且大于等于startRowKey行键记录; 1.5 查找在当前指定时间之前,在startRowKey~endRowKey间行键记录; 1.6 使用TScan过滤器进行过滤,20种过滤器进行介绍 1.6.1 行健过滤器(RowFilter) 1.6.2 字段值过滤器(ValueFilter) 1.6.3 字段过滤(QualifierFilter) 1.6.4 单列值过滤器(SingleColumnV

如何动态的测试Thrift服务

当一个客户端需要调用远程服务器上的某个方法时,客户端会向服务器发送一个请求(包括请求参数),服务器接收到请求后执行相应的方法,并返回结果(包括返回值)。在客户端代码中,创建一个与服务器通信的TSocket对象,然后使用该对象创建TProtocol对象,并利用其创建OrderService.Client客户端代理对象。在上述代码中,使用Thrift提供的TProcessor将服务实现类与IDL文件中定义的接口绑定起来,并创建了一个TSimpleServer对象来启动服务器。

2301_77645834的博客 1036

thriftTest java案例代码

windows上开发java thrift 的案例代码

linux下安装和测试thrift

linux下呕心沥血的安装和测试thrift,真诚感谢整个过程中的各位帖主。

thrift示例及性能测试

1     简介 Thrift是一个跨语言的服务部署框架,最初由facebook开发用做系统内各语言之间的RPC(Remote Procedure Call Protocol,远程过程调用协议通信),2007年由facebook贡献到apache基金,08年5月进入apache孵化器。Thrift通过一个中间语言IDL(interface description language, 接口定义

liu_lin_sp的博客 7831

thrift-mock:用于模拟节俭服务的轻量级Java测试库

节俭的模拟 用于模拟节俭服务的轻量级Java单元测试库 特征 初始化节俭模拟服务器,无需任何预定义节俭IDL,仅需一个端口 动态绑定节俭接口对其响应 可配置的响应延迟 支持将不同的节俭服务中的不同接口绑定到一台服务器 嵌入junit4 支持阻塞和非阻塞呼叫 入门 1.导入Maven依赖 与junit一起工作 < dependency> < groupId>com.didiglobal.thriftmock</ groupId> < artifactId>thrift-mock-server4junit</ artifactId> < version>1.0.2</ version> </ dependency> 在没有junit的情况下工作 < dependency> < gro

Thrift 自测本地Thrift服务

Thrift 自测本地Thrift服务 一:自测需求 小组小伙伴要求我的业务模块提供一个RPC接口。之前并没有用过Thrift的RPC调用。经过一系列的研究和讨教终于是完成了 整个流程。 二:自测过程 1:由于小伙伴们任务都比较紧张,所以我自己先约定好接口参数,返回结果。这里面有如下步骤 业务端部署: 1⃣️在IDL...

0bug0warning的博客 1831

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入解析了SAP CO模块中结果分析码KKA2/CJ88的核心应用,通过真实案例详细阐述了如何在成本波动剧烈的销售型项目中,运用结果分析实现收入与成本的精准匹配。文章重点拆解了不同结果分析方法的适用场景与财务影响,并提供了从配置、操作到问题排查的完整实战指南,帮助财务顾问提升项目财务管理能力。

qsc9012345的博客 608

运算放大器电路中的T型网络:如何用更小电阻实现高增益并降低噪声?

本文深入解析了运算放大器电路中T型反馈网络的设计与应用。该网络通过三个较小阻值电阻的组合,等效实现高增益,有效规避了传统大反馈电阻带来的显著热噪声问题。文章从数学原理、噪声定量分析到实际设计技巧,系统阐述了如何利用T型网络在实现高增益的同时,显著降低电路噪声并改善整体性能。

banana的博客 318

Thrift测试

Ubuntu下测试Thrift Thrift介绍 Thrift 官网 http://thrift.apache.org/ 版本下载 http://archive.apache.org/dist/thrift/ 安装编译环境 在Ubuntu12.04下编译失败,automake、boots等需要版本较高,apt-get install命令不能安装,自己编译太麻烦,放弃。 ...

1026

WordPress搭建“外贸独立站”完整操作教程

  以往的文章,我们介绍了很多种搭建独立站的方式,有最省事的Shopify 、最专业的Magento以及最省钱的Wordpress Woocommerce。其中,通过主机托管的方式又分了免费的谷歌云vps主机、1美元Godaddy主机以及SiteGround共享主机三种。建站方法方式实在太多了,有免费的,有廉价的,有商业版的,有共享主机、有云主机主机以及各种各样的vps服务器,选择哪种方式,哪款主机,也只有真正试了才直到。   没错,上述的这些方法方式,无一例外,我都亲身折腾过。从个人实际需求和建站方式来

www25qi的博客 8080

Ubuntu下thrift的安装与测试

Ubuntu下thrift的安装与测试

chenglinhust的专栏 1907

从Verilog到GDS:手把手教你搞定Calibre LVS物理验证(附常见报错解决)

本文详细介绍了从Verilog到GDS的Calibre LVS物理验证全流程,包括工具链配置、RTL到SPICE网表转换、LVS运行配置及高级技巧。重点解析了常见报错如网络不匹配、器件不匹配和电源引脚缺失的解决方案,帮助工程师高效完成芯片物理验证,确保设计正确性。

culing2941的博客 507

基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现

本文详细介绍基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现。通过I2S接口直接传输PCM数据,避免SRC重采样,实现真正的HIFI级音质。涵盖硬件连接、软件架构、网络传输优化及实际音质对比,为音频爱好者提供高性价比的无损无线音频解决方案。

rnn9storyteller的博客 948

基于Jmeter的thrift-RPC接口测试

根据需求,产品部分功能采用thrift-RPC协议进行接口的增、删、改、查,前期采用Junit对其进行测试,为了提高RPC接口测试的简洁化和后期的性能测试需求,打算通过Jmeter的java类测试实现。 前期准备: 开发提供了IDL描述的Thrift文件:dataService.thrift,其中定义了相关接口函数及数据类型,如下: enum VStatus { ON...

dilai0918的博客 1218

在 SAP SD 模块里,销售订单号既可以由系统“自动”产生,也可以由用户“手工”输入,核心取决于“号码段(Number Range)”与“订单类型(Sales Document Type)”这两处配

SAP销售订单编号配置指南:系统提供内部自动编号和外部手工编号两种方式,通过VN01定义号码段(内部/外部),VOV8分配给订单类型并设置"ExtNo.Rq"选项即可切换。高阶应用支持灵活编号(如加前缀)或通过增强出口完全自定义编号规则。配置时需注意号码段创建、分配及传输问题,常见故障包括号码范围不存在或配置错误。核心是"号码段+订单类型"的组合控制编号生成方式,满足从简单到复杂的业务需求。

金牌架构师 531
上一篇: sqoop从mysql到数据到hadoop中
下一篇: hbase的安装和测试
linux内核控
博客等级 码龄19年 41粉丝 638原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值