thrift的优势在于强大的跨语言能力,虽然是机器人的代码,但是一点都不肉鸡。。。
学习一下吧。本文针对C++进行分析。
设定thrift的配置文件,这里做一个简单的例子:
struct Person{//data definition
1:i64 id;
2:string name;
}
service PersonService{//interface
list<Person> getPerson()
}
如上的代码是类似于伪码的中间语言,用于生成多种语言。
调用thrift命令之后,会生成如下文件,
下面将介绍这些文件的具体内容。
PersonService.cpp && PersonService.h
这两个文件定义了客户端和服务器端的具体实现,如下是doxygen生成的类图:
client使用的是PersonServiceIf系列的类,PersonServiceIf为接口类:
class PersonServiceIf {
public:
virtual ~PersonServiceIf() {}
virtual void getPerson(std::vector<Person> & _return) = 0;
};
定义了函数实现的接口,该接口即为在配置文件中指定的接口。
PersonServiceClient继承该接口,定义如下:
class PersonServiceClient : virtual public PersonServiceIf {/*{{{*/
public:
PersonServiceClient(boost::shared_ptr< ::apache::thrift::protocol::TProtocol> prot) :
piprot_(prot),
poprot_(prot) {
iprot_ = prot.get();
oprot_ = prot.get();
}
PersonServiceClient(boost::shared_ptr< ::apache::thrift::protocol::TProtocol> iprot, boost::shared_ptr< ::apache::thrift::protocol::TProtocol> oprot) :
piprot_(iprot),
poprot_(oprot) {
iprot_ = iprot.get();
oprot_ = oprot.get();
}
boost::shared_ptr< ::apache::thrift::protocol::TProtocol> getInputProtocol() {
return piprot_;
}
boost::shared_ptr< ::apache::thrift::protocol::TProtocol> getOutputProtocol() {
return poprot_;
}
void getPerson(std::vector<Person> & _return);
void send_getPerson();
void recv_getPerson(std::vector<Person> & _return);
protected:
boost::shared_ptr< ::apache::thrift::protocol::TProtocol> piprot_;
boost::shared_ptr< ::apache::thrift::protocol::TProtocol> poprot_;
::apache::thrift::protocol::TProtocol* iprot_;
::apache::thrift::protocol::TProtocol* oprot_;
};/*}}}*/
采用了虚拟继承的方式,该方式在自动生成的代码中并没有明显的意义(客户端了类不会多次继承接口类)。实现有两个构造函数,对于输入和输出可以采用不同的协议(这个很虎,如果协议相同,采用单参数的构造函数即可)。
getPerson只是为了统一接口,实际上使用的是send_getPerson和recv_getPerson两个接口,一个用于发送请求,另外一个用于接收请求,这两个接口都对底层的通信实现做了封装。
PersonServiceMultiface也继承自该接口类,定义如下:
///<猜测用于分布式的系统
class PersonServiceMultiface : virtual public PersonServiceIf {/*{{{*/
public:
PersonServiceMultiface(std::vector<boost::shared_ptr<PersonServiceIf> >& ifaces) : ifaces_(ifaces) {
}
virtual ~PersonServiceMultiface() {}
protected:
std::vector<boost::shared_ptr<PersonServiceIf> > ifaces_;
PersonServiceMultiface() {}
void add(boost::shared_ptr<PersonServiceIf> iface) {
ifaces_.push_back(iface);
}
public:
void getPerson(std::vector<Person> & _return) {
size_t sz = ifaces_.size();
for (size_t i = 0; i < sz; ++i) {
if (i == sz - 1) {
ifaces_[i]->getPerson(_return);
return;
} else {
ifaces_[i]->getPerson(_return);
}
}
}
根据笔者的猜测,该接口可以适用于分布式系统,即从不同的服务上获取所有的数据(每个服务的数据有限情况)。