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