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

Posted

技术标签:

【中文标题】如何在 Apache Thrift 中切换传输协议【英文标题】:How to switch transport protocols in Apache Thrift 【发布时间】:2016-06-03 12:59:10 【问题描述】:

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

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

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

鉴于我想使用 TCP 传输协议,我是否应该担心 TQTcpServer 未配置为构建?

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

【问题讨论】:

"我应该担心 TQTcpServer 未配置为构建" -- 仅当您计划使用 Qt 时 【参考方案1】:

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 的工作方式非常相似。

【讨论】:

感谢您的解释!

以上是关于如何在 Apache Thrift 中切换传输协议的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache Thrift 时如何检测协议不匹配?

Apache Thrift学习之二(基础及原理)

thrift 是rpc协议

Thrift IPC over 管道传输 (Windows)

Python 中使用 HTTPS 的示例 Apache Thrift 服务

HTTP与RPC(Thrift)