Apache thrift是一个可用来进行可扩展的跨语言(C++,java,python等)的服务架构的开发的框架,facebook的服务基于此开发。它采用接口描述语言定义并创建服务,所包含的代码生成引擎可以在多种语言中使用。下面详细介绍thrift服务搭建方法:
首先根据应用规则,即客户端与服务器的交互逻辑设计.thrift脚本。
thrift支持的基本类型包括预定义的基本类型(byte,i32,i64,double,string)、结构体(struct)、容器(list,set,map)、枚举等。
例如设计如下thrift文件:
struct Content{
1:string content,
}
struct Ret
{
1:string word,
2:i32 property,
3:double pos,
4:string ref,
}
struct RetVec{
1:string mid,
2:list rets,
}
service Serv{
list getContentRets(1:list con),
}
上述服务设计了3个struct和一个服务接口,对于客户端请求的每一组Content返回一组RetVec,每一个RetVec包含对特定Content的处理结果,包括一个mid和一组Ret。
生成c++,java和python代码框架:
thrift -r --gen cpp hello.thrift
thrift -r --gen java hello.thrift
thrift -r --gen py hello.thrift
这时生成子目录gen-cpp,gen-java,gen-py
Serv.cpp
Serv.h
Serv_server.skeleton.cpp
hello_constants.cpp
hello_constants.h
hello_types.cpp
hello_types.h
其中Serv_server.skeleton.cpp用于服务端修改代码,Serv.h提供服务接口,hello_*.cpp和hello_*.h是根据定义的struct生成的数据类型文件。
Serv_server.skeleton.cpp类似如下内容:
#include "Serv.h"
#include
#include
#include
#include
#include
#include
#include
#include
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 ServHandler : virtual public ServIf {
public:
ServHandler() {
// Your initialization goes here
}
void getContentRets(vector _ret_vec_RetVec, const vector con){
// Your implementation goes here
}
};
int main(int argc, char **argv) {
shared_ptr handler(new ServHandler());
shared_ptr processor(new ServProcessor(handler));
shared_ptr protocolFactory(new TBinaryProtocolFactory());
shared_ptr transportFactory(new TBufferedTransportFactory());
shared_ptr serverTransport(new TServerSocket(9090));
shared_ptr threadManager = ThreadManager::newSimpleThreadManager(10);
shared_ptr threadFactory = shared_ptr(new PosixThreadFactory());
threadManager->threadFactory(threadFactory);
threadManager->start();
printf("start user server...\n");
TThreadPoolServer server(processor, serverTransport, transportFactory, protocolFactory, threadManager);
server.serve();
return 0;
}
#include "Serv.h" // 替换成你的.h
#include
#include
#include
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 socket(new TSocket("localhost", 9090));
boost::shared_ptr transport(new TBufferedTransport(socket));
boost::shared_ptr protocol(new TBinaryProtocol(transport));
transport->open();
// 我们的代码写在这里
transport->close();
return 0;
}
BOOST_DIR = /usr/local/include/boost/
THRIFT_DIR = /usr/local/include/thrift
LIB_DIR = /usr/local/lib
GEN_SRC = ./gen-cpp/hello_types.cpp ./gen-cpp/hello_constants.cpp ./gen-cpp/Serv.cpp
default: server client
server: Serv_server.skeleton.cpp
g++ -g -o HelloServer -I${THRIFT_DIR} -I${BOOST_DIR} -I./gen-cpp -L${LIB_DIR} -lthrift Serv_server.skeleton.cpp ${GEN_SRC}
client: UserClient.cpp
g++ -g -o HelloClient -lm -pthread -lz -lrt -lssl -I${THRIFT_DIR} -I${BOOST_DIR} -I./gen-cpp -L${LIB_DIR} -lthrift HelloClient.cpp ${GEN_SRC}
clean:
$(RM) -r HelloServer HelloClient
Thrift允许你选择 protocol ,transport和server。因为Thrift 最早是有C++开发的,Thrift在C++实现中有最大的变化。