thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点;代码侵入较强是其弱点。
下面记录以C++做服务器,C++,java和python做客户端的示例,这个和本人现在工作环境吻合,使用多线程长连接的socket来建立高效分布式系统的跨语言调用平台。
2.生成c++,java和python代码框架
这时生成子目录gen-cpp,gen-java,gen-py
3.生成C++服务端代码
修改UserServer.cpp
注意这段代码使用TCompactProtocol,需要#include <config.h>
另外这个是Blocking的多线程服务器
4.生成C++的client文件UserClient.cpp
下面记录以C++做服务器,C++,java和python做客户端的示例,这个和本人现在工作环境吻合,使用多线程长连接的socket来建立高效分布式系统的跨语言调用平台。
遗憾的是目前版本(0.7.0)的C语言还不支持Compact协议,导致在现在的环境中nginx c module调用thrift要使用binary协议。thrift开发团队似乎对C语言不太感冒。
1.定义idl文件acsuser.thrift
- struct User{
- 1: string uid,
- 2: string uname,
- 3: bool usex,
- 4: i16 uage,
- }
- service UserService{
- void add(1: User u),
- User get(1: string uid),
- }
2.生成c++,java和python代码框架
- thrift -r --gen cpp acsuser.thrift
- thrift -r --gen java acsuser.thrift
- thrift -r --gen py acsuser.thrift
这时生成子目录gen-cpp,gen-java,gen-py
3.生成C++服务端代码
- cp gen-cpp/UserService_server.skeleton.cpp UserServer.cpp
修改UserServer.cpp
- #include "UserService.h"
- #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 ::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);
- }
- void get(User& _return, const std::string& uid) {
- // Your implementation goes here
- _return.uid = "leo1";
- _return.uname = "yueyue";
- _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);
- }
- };
- 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;
- }
注意这段代码使用TCompactProtocol,需要#include <config.h>
另外这个是Blocking的多线程服务器
4.生成C++的client文件UserClient.cpp