thrift自动生成源代码剖析

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);
      }
    }
  }
根据笔者的猜测,该接口可以适用于分布式系统,即从不同的服务上获取所有的数据(每个服务的数据有限情况)。





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值