如何在Apache Thrift中切换传输协议

时间:2016-06-03 12:59:11

标签: thrift

Apache Thrift netstack巧妙地解释了传输协议可以是原始的TCP,HTTP等。但是我找不到一个适当的文档来描述如何在下面使用传输协议之间切换,也许我是在这里遗漏了一些东西。

另外,我在ubuntu系统(./configure)上构建Thrift之前配置了一个小的后续问题,我看到以下内容:

    C++ Library:
   Build TZlibTransport ...... : yes
   Build TNonblockingServer .. : yes
   Build TQTcpServer (Qt4) .... : no
   Build TQTcpServer (Qt5) .... : no

我是否应该警惕TQTcpServer未配置为构建,因为我想使用TCP传输协议?

我是Thrift的新手,请原谅我缺乏更好地构建问题的经验。

1 个答案:

答案 0 :(得分:3)

Thrift具有端点传输,分层传输和协议相互堆叠的概念,以形成具体的实现。 tutorial显示了基本原则(这是C ++版本):

  boost::shared_ptr<TTransport> socket(new TSocket("localhost", 9090));
  boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
  boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
  CalculatorClient client(protocol);

如果您需要切换传输,理论上您只需删除TSocket行并插入您选择的其他传输。在实践中,可能会有一些细微之处,但这是基本的想法。 test suite code可以作为在实践中如何做到这一点的一个很好的例子:

  if (ssl) {
    factory = boost::shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory());
    factory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
    factory->loadTrustedCertificates(pemPath.c_str());
    factory->authenticate(true);
    socket = factory->createSocket(host, port);
  } else {
    if (domain_socket != "") {
      if (abstract_namespace) {
        std::string abstract_socket("\0", 1);
        abstract_socket += domain_socket;
        socket = boost::shared_ptr<TSocket>(new TSocket(abstract_socket));
      } else {
        socket = boost::shared_ptr<TSocket>(new TSocket(domain_socket));
      }
      port = 0;
    } else {
      socket = boost::shared_ptr<TSocket>(new TSocket(host, port));
    }
  }

  if (transport_type.compare("http") == 0) {
    boost::shared_ptr<TTransport> httpSocket(new THttpClient(socket, host, "/service"));
    transport = httpSocket;
  } else if (transport_type.compare("framed") == 0) {
    boost::shared_ptr<TFramedTransport> framedSocket(new TFramedTransport(socket));
    transport = framedSocket;
  } else {
    boost::shared_ptr<TBufferedTransport> bufferedSocket(new TBufferedTransport(socket));
    transport = bufferedSocket;
  }

这又是C ++,只有客户端。还有一个counterpart for the server end非常相似。