CentOS 6.6 Thrift 环境搭建
来源:互联网 发布:优酷和腾讯视频知乎 编辑:程序博客网 时间:2024/06/02 03:08
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
getting started
The first thing you need to know is that the C++ code generated by Thrift compiles only on Unix based systems, although some success has been reported using Cygwin on Win32 in ThriftInstallationWin32.
Requirements
Make sure that your system meets the requirements as noted in ThriftRequirements
- Thrift library files
- Thrift header files.
Installing the Thrift library
Installing the Thrift library is trivial to link with the generated code.
Download a snapshot of Thrift and extract if you haven't done so already - Direct Link
Navigate to lib/cpp using the terminal of your choice
Run make to compile
Run make install to install the library. Your user needs root permissions.
Generating the server code
In this example we use an imaginary file called your_thrift_file.thrift:
#!/usr/local/bin/thrift --gen cppnamespace cpp Testservice Something { i32 ping()}
Now run:
thrift --gen cpp your_thrift_file.thrift
Exploring the generated code - The Server
The generated code should be under the gen-cpp directory. You will see a number of generated C++ and header files along with an automatically generated server skeleton code (in bold).
- Something.cpp
- Something.h
Something_server.skeleton.cpp
- your_thrift_file_constants.cpp
- your_thrift_file_constants.h
- your_thrift_file_types.cpp
- your_thrift_file_types.h
Implementing the Server
Copy the generated server skeleton to a file named Something_server.cpp and keep the original:
cp Something_server.skeleton.cpp Something_server.cpp
When this server is run in console it prints "ping" on the console window each time the function is called from a client.
Here's the autogenerated skeleton file to illustrate how to write a server: Something_server.cpp
1 #include "Something.h" 2 #include <protocol/TBinaryProtocol.h> 3 #include <server/TSimpleServer.h> 4 #include <transport/TServerSocket.h> 5 #include <transport/TTransportUtils.h> 6 7 using namespace apache::thrift; 8 using namespace apache::thrift::protocol; 9 using namespace apache::thrift::transport; 10 using namespace apache::thrift::server; 11 12 using boost::shared_ptr; 13 14 using namespace Test; 15 16 class SomethingHandler : virtual public SomethingIf { 17 public: 18 SomethingHandler() { 19 // Your initialization goes here 20 } 21 22 int32_t ping() { 23 // Your implementation goes here 24 printf("ping\n"); 25 } 26 27 }; 28 29 int main(int argc, char **argv) { 30 int port = 9090; 31 shared_ptr<SomethingHandler> handler(new SomethingHandler()); 32 shared_ptr<TProcessor> processor(new SomethingProcessor(handler)); 33 shared_ptr<TServerTransport> serverTransport(new TServerSocket(port)); 34 shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory()); 35 shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); 36 37 TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory); 38 server.serve(); 39 return 0; 40 }
Compiling/Building the server
To quickly build a binary using a single command use:
g++ -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -Wall -I/usr/local/include/thrift *.cpp -L/usr/local/lib -lthrift -o something
Compiling
You need to point your compiler to the thrift include path (CXX flag: -I/usr/local/include/thrift)
g++ -Wall -I/usr/local/include/thrift -c Something.cpp -o something.og++ -Wall -I/usr/local/include/thrift -c Something_server.cpp -o server.og++ -Wall -I/usr/local/include/thrift -c your_thrift_file_constants.cpp -o constants.og++ -Wall -I/usr/local/include/thrift -c your_thrift_file_types.cpp -o types.o
Linking
You need to point your linker to the thrift library. (Linker flag: -lthrift or -l/usr/local/lib/libthrift.so )
g++ -L/usr/local/lib *.o -o Something_server -lthrift
Writing the client code
thrift does not auto generate a client interface, so you have to create the file.
1 #include "Something.h" // As an example 2 3 #include <transport/TSocket.h> 4 #include <transport/TBufferTransports.h> 5 #include <protocol/TBinaryProtocol.h> 6 7 using namespace apache::thrift; 8 using namespace apache::thrift::protocol; 9 using namespace apache::thrift::transport; 10 11 using namespace Test; 12 13 int main(int argc, char **argv) { 14 boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090)); 15 boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket)); 16 boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport)); 17 18 SomethingClient client(protocol); 19 transport->open(); 20 client.ping(); 21 transport->close(); 22 23 return 0; 24 }
Compiling
g++ -Wall -I/usr/local/include/thrift -c Something_client.cpp -o client.o
Linking
g++ -L/usr/local/lib client.o Something.o constants.o types.o -o Something_client -lthrift
Compiling/Building everything with Makefile
GEN_SRC := Something.cpp your_thrift_file_constants.cpp your_thrift_file_types.cppGEN_OBJ := $(patsubst %.cpp,%.o, $(GEN_SRC))THRIFT_DIR := /usr/local/include/thriftBOOST_DIR := /usr/local/includeINC := -I$(THRIFT_DIR) -I$(BOOST_DIR).PHONY: all cleanall: something_server something_client%.o: %.cpp $(CXX) -Wall -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H $(INC) -c $< -o $@something_server: Something_server.o $(GEN_OBJ) $(CXX) $^ -o $@ -L/usr/local/lib -lthrift something_client: Something_client.o $(GEN_OBJ) $(CXX) $^ -o $@ -L/usr/local/lib -lthrift clean: $(RM) *.o something_server something_client
Appendix: About TNonblockingServer
If you are writing an application that will serve a lot of connection (like php front end calling thrift service), you'd better use TNonblockingServer. TNonblockingServer can accept a lot of connections while throttling the processor threads using a pool.
* TNonblockingServer with a thread pool is the c++ alternative of the JAVA THsHaServer; * TNonblockingServer withOUT a thread pool is the c++ alternative of the JAVA TNonblockingServer;
Server code with thread pool:
shared_ptr<TProcessor> processor(new SomethingProcessor(handler)); shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); // using thread pool with maximum 15 threads to handle incoming requests shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(15); shared_ptr<PosixThreadFactory> threadFactory = shared_ptr<PosixThreadFactory>(new PosixThreadFactory()); threadManager->threadFactory(threadFactory); threadManager->start(); TNonblockingServer server(processor, protocolFactory, 8888, threadManager); server.serve(); // ...
C++ client code (you have to use TFramedTransport here):
boost::shared_ptr<TSocket> socket(new TSocket("localhost", 8888)); boost::shared_ptr<TTransport> transport(new TFramedTransport(socket)); boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport)); SomethingClient client(protocol); transport->open(); // do something here... transport->close();
PHP client code (you have to use TFramedTransport here):
$transport = new TFramedTransport(new TSocket("localhost", 8888)); $transport->open(); $protocol = new TBinaryProtocol($transport); $client= new SomethingClient($protocol, $protocol); // do something here... transport->close();
- CentOS 6.6 Thrift 环境搭建
- thrift and php 环境搭建
- 搭建HBase+thrift+php环境
- 搭建HBase+thrift+php环境
- CentOS 6.6 搭建python环境
- CentOS 6.6搭建LNMP环境
- centos 环境安装 及 thrift安装
- Thrift学习整理之环境搭建
- CentOS 6.6上搭建C++运行环境
- CentOS搭建NodeJS环境
- CentOS搭建LAMP环境
- CentOS搭建LAMP环境
- centos搭建ftp环境
- CentOS开发环境搭建
- centos 搭建lamp环境
- CentOS PHP环境搭建
- CentOS 搭建 LAMP环境
- CentOs Server环境搭建
- 什么是多道程序?
- 2012年5月SAT香港真题解析
- ZOJ Problem Set - 1006 Do the Untwist
- SQLserver提示数据库中已存在名为 'fk_mxq_Cno' 的对象”
- shell学习四十八天----文件校验和匹配
- CentOS 6.6 Thrift 环境搭建
- 敌兵 布阵
- Invert Binary Tree
- GRE写作必备句型
- CentOS 7+vim+ycm(clang)
- React 入门实例教程
- NodeMCU实现远程控制LED灯
- Android学习系列之(二)项目目录结构基本介绍
- 数字三角形