天天看點

跨平台-thrift

thrift 是什麼?

    Thrift is a software framework for scalable cross-language services development. It combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml.

   thrift 支援現有現在的主流語言,由facebook開源出來的一個跨平台的通信工具。

thrift更多資訊(建議看官網wiki)

     可以參考thrift官方wiki:http://wiki.apache.org/thrift/

     thrift基礎學習:http://dongxicheng.org/search-engine/thrift-guide/

     在thrift官方wiki中我們可以找到自己想要的東東,thrift IDL 、代碼生成,client端開發,server端 開發等等

附件中附帶thrift代碼生成工具,具體使用 可以 使用 thrift-0.6.1.exe --help 檢視幫助,如 簡單的生成java代碼指令:

thrift -r --gen java tutorial.thrift 

thrift bug

           在使用thrift進行跨平台資料通信時會遇到一些問題,在此總結一下幾條望大家注意:

1.跨語言資料通信反序列化失敗

  java,c++ 使用thrift進行通信時,如果我們在java和c++平台之間傳輸的是 一個class序列化後的字元串(使用thrift的序列化api),如c++作為伺服器端,java作為用戶端,使用java接收c++傳過來的class序列化字元串後,java将字元串反序列化,會出現反序列化失敗的情況,但命名接收到了字元串,這時請在c++端将序列化後的字元串進行BASE64編碼,java接收到base64編碼的字元串後,将其base64字元串反編碼形成的char數組進行thrift反序列化到class中即可解決跨語言的資料通信問題

2.thrift使用過程中的通信異常

   在thrift通信過程中,如頻繁報類似:“Cannot read. Remote side has closed. Tried to read 1 bytes, but only got 0 bytes”的錯誤,很有可能是由于thrift版本導緻到,無論是用戶端還是伺服器端請使用最高版本的thrift。這個bug在官網有記錄:https://issues.apache.org/jira/browse/THRIFT-517