安装Thrift并写一个简单的测试程序

参考链接:

http://thrift.apache.org/docs/install/centos   Apache thrift官方安装步骤

http://blog.163.com/zhangjie_0303/blog/static/9908270620140311022650/  网友的示例,可以搞清楚Thrift到底能干什么


目录:

1.安装步骤

2.示例:C++Server 及 C++Client

3.运行示例时的错误解决,error:./CppServer: error while loading shared libraries: libthrift-1.0.0-dev.so: cannot open 

1.安装步骤

参考:http://thrift.apache.org/docs/install/centos   Apache thrift官方安装步骤,一步步安装即可。

2.示例:C++Server 及 C++Client

运行示例效果截图:

安装Thrift并写一个简单的测试程序_第1张图片

编辑demo.thrift文件,内容如下:
struct UserProfile{
        1:i32 id, //注意这里是逗号,而不是分号
        2:string name,
        3:string blurb
} //这里没有分号
 
service UserStorage{
        void store(1: UserProfile user), //注意这里是逗号,而不是分号
        UserProfile getUser(1: i32 uid)
}
 
运行如下命令
cloud1:~/test/thrift/demo # thrift -r --gen cpp demo.thrift 
cloud1:~/test/thrift/demo # ls
demo.thrift  gen-cpp
可以看到在当前目录下产生了一个gen-cpp的目录,该目录下即以上命令产生的文件:
UserStorage.cpp
UserStorage.h
UserStorage_server.skeleton.cpp
demo_constants.cpp
demo_constants.h
demo_types.cpp
demo_types.h

注意:在以上文件中,只有UserStorage_server.skeleton.cpp是跟业务相关的,是可以修改的,其余文件都是框架相关的。
UserStorage_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 "UserStorage.h"
#include
#include
#include
#include
#include
 
using namespace std;
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
 
using boost::shared_ptr;
 
class UserStorageHandler : virtual public UserStorageIf {
 public:
  UserStorageHandler() {
    // Your initialization goes here
  }
 
  void store(const UserProfile& user) {
    // Your implementation goes here
    printf("store\n");
  }
 
  void getUser(UserProfile& _return, const int32_t uid) {
    // Your implementation goes here
    printf("getUser\n");
  }
};
 
int main(int argc, char **argv) {
  int port = 9090;
  shared_ptr handler(new UserStorageHandler());
  shared_ptr processor(new UserStorageProcessor(handler));
  shared_ptr serverTransport(new TServerSocket(port));
  shared_ptr transportFactory(new TBufferedTransportFactory());
  shared_ptr protocolFactory(new TBinaryProtocolFactory());
 
  TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
  server.serve();
  return 0;
}

可以看到,该文件只是一个框架,用户可以根据需要扩展该文件,笔者修改如下(蓝色部分为添加的代码,同时将文件改名为UserStorage_server.cpp):
// This autogenerated skeleton file illustrates how to build a server.
// You should copy it to another filename to avoid overwriting it.
#include "UserStorage.h"
#include 
#include 
#include 
#include 
#include 
using namespace std;
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using boost::shared_ptr;
class UserStorageHandler : virtual public UserStorageIf {
 public:
  UserStorageHandler() {
    // Your initialization goes here
  }
  void store(const UserProfile& user) {
    // Your implementation goes here
    log[user.id] = user; //实际的保存操作
    printf("store\n");
  }
  void getUser(UserProfile& _return, const int32_t uid) {
    // Your implementation goes here
        _return = log[uid]; //实际获取操作,注意:在实际生产中,这里还需要异常处理
    printf("getUser\n");
  }
  //增加成员变量,用户保存用户数据,为了简单起见,这里只将数据保存在内存,当然可以可以保存在数据库、文件等等,主要注意,如果保存在其他介质的话
  //在初始化的时候记得加载进内存或者打开访问句柄
  protected:
        map log;
};
int main(int argc, char **argv) {
  int port = 9090;
  shared_ptr handler(new UserStorageHandler());
  shared_ptr processor(new UserStorageProcessor(handler));
  shared_ptr serverTransport(new TServerSocket(port));
  shared_ptr transportFactory(new TBufferedTransportFactory());
  shared_ptr protocolFactory(new TBinaryProtocolFactory());
  TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
  server.serve();
  return 0;
}

可以看到以上程序还包括一个简单的服务端代码,问了进行测试,笔者从thrift/tutorial/cpp/目录下copy了一个客户端代码和Makefile
修改如下:
CppClient.cpp (蓝色部分为客户化代码) 
 
#include 
#include 
#include 
#include 
#include 
#include 
#include "UserStorage.h"
using namespace std;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using namespace boost;
int main(int argc, char** argv) {
  shared_ptr socket(new TSocket("localhost", 9090));
  shared_ptr transport(new TBufferedTransport(socket));
  shared_ptr protocol(new TBinaryProtocol(transport));
  UserStorageClient client(protocol);
  try {
    transport->open();
        UserProfile user;
        user.id = 1;
        user.name = "liqb";
        user.blurb = "aaaaaa";
        client.store(user);
        UserProfile user2;
        client.getUser(user2, 1);
        printf("user.id = %d user.name = %s user.blurb = %s\n", user2.id, user2.name.c_str(), user2.blurb.c_str());
    transport->close();
  } catch (TException &tx) {
    printf("ERROR: %s\n", tx.what());
  }
}
 
Makefile
 
BOOST_DIR = /usr/local/boost/include/boost-1_33_1/
THRIFT_DIR = /usr/local/include/thrift
LIB_DIR = /usr/local/lib
GEN_SRC = UserStorage.cpp demo_constants.cpp demo_types.cpp
default: server client
server: UserStorage_server.cpp
        g++ -o CppServer -I${THRIFT_DIR} -I${BOOST_DIR}  -I../gen-cpp -L${LIB_DIR} -lthrift UserStorage_server.cpp ${GEN_SRC}
client: CppClient.cpp
        g++ -o CppClient -I${THRIFT_DIR} -I${BOOST_DIR}  -I../gen-cpp -L${LIB_DIR} -lthrift CppClient.cpp ${GEN_SRC}
clean:
        $(RM) -r CppClient CppServer
 
编译之后产生CppServer 和CppClient 两个可执行程序,分别运行CppServer 和CppClient,即可以看到测试结果。
先运行服务器:
cloud1:~/test/thrift/demo/gen-cpp # ./CppServer 
再执行客户端:
cloud1:~/test/thrift/demo/gen-cpp # ./CppClient 
user.id = 1 user.name = liqb user.blurb = aaaaaa
cloud1:~/test/thrift/demo/gen-cpp # 

服务器上显示:
cloud1:~/test/thrift/demo/gen-cpp # ./CppServer 
store
getUser


3.运行./CppServer和./CppClient时错误解决,error:./CppServer: error while loading shared libraries: libthrift-1.0.0-dev.so: cannot open shared object file: No such file or directory


解决步骤:
1、使用find命令查找缺失的libthrift-1.0.0-dev.so共享库文件所在位置:find /usr/local/ -name "libthrift-1.0.0*"


2、将找到的目录位置写入 /etc/ld.so.conf 配置文件,这个文件记录了编译时使用的动态链接库的路径,使用命令:sudo vim /etc/ld.so.conf ,在末尾增加报错文件的路径


3、然后使用ldconfig命令,使配置生效。



4.再运行测试程序正常

安装Thrift并写一个简单的测试程序_第2张图片

你可能感兴趣的:(thrift中间件)