分享

关于thrift

 Colin收藏 2011-12-19

跟protobuf很相似,但其功能特性要比protobuf丰富的多。不仅可以从描述文件自动生成序列化/反序列化代码,而且可以产生完整的RPC通信框架的实现。支持的语言有很多种:C++, Java, Python, Ruby, Perl, PHP, C#, Erlang, Haskell等。

工具包安装过程
它要在linux环境下安装,需要依赖g++,boost,lex,yacc等工具库。对于不同的目标语言,它还需要依赖其它相应的工具或库。例如Java需要这些:
# Apache Ant
# Apache Ivy
# Apache Commons Lang
# SLF4J
默认情况下,它会安装好多种目标语言的生成器。如果你机器碰巧缺少某种语言依赖的库,很可能会安装失败,比如我只需要安装Java、C++、Python、Ruby这4种语言的生成器,在执行configure时,就要把其它语言都禁掉,否则会失败。



1 ./configure --without-csharp --without-erlang --without-perl --without-php --without-php_extension --without-haskell

然后一路make即可。

.thrift文件描述语法


01 struct SearchRequest {
02 1 : required string query,
03 2 : optional i32 p = 1,
04 3 : optional i32 n,
05 }
06
07 enum StatusCode {
08 SUCCESS = 1,
09 ERROR = 2,
10 TIMEOUT = 3,
11 }
12
13 struct Result {
14 1 : optional string title,
15 2 : optional string summary,
16 3 : optional string url,
17 4 : optional string snapurl,
18 }
19
20 struct SearchResponse {
21 1 : optional StatusCode status,
22 2 : optional i32 total,
23 3 : list<Result> results,
24 }

跟protobuf很相似,struct相当于protobuf的message,只是数字标签放在了字段声明前面,用的是逗号而不分号,但不允许类型嵌套。

生成目标语言代码
把上述示例保存成SearchResponse.thrift文件,执行


1 thrift -r --gen java --gen cpp --gen py SearchResponse.thrift

生成的目标代码分别放在gen-java,gen-cpp,gen-py目录下。

数据类型
同样也是分为标量型和复合型,标量型如下:
bool: A boolean value (true or false)
byte: An 8-bit signed integer
i16: A 16-bit signed integer
i32: A 32-bit signed integer
i64: A 64-bit signed integer
double: A 64-bit floating point number
string: A text string encoded using UTF-8 encoding
复合型有struct,binary,container(包括list,set,map),service,还有exception。

字段修饰规则
它也可以用required、optional修饰字段,但没有repeated,因为它有container数据类型。

包/注释/导入/常量/typedef
使用namespace关键字指定.thrift文件的命名空间。
支持c/java风格的单行、多行注释。
使用include包含其它的.thrift文件。
使用const定义常量,可以定义整型、浮点型、字符串、list、map常量。
使用typedef声明类型。

更新struct类型
更新struct的字段时,为了保持兼容性,同protobuf一样,下面几条规则是显而易见的:
1.不要改变现有字段的数字标签。
2.新加的字段应当声明成optional,而不应该声明成required。
3.可以删除非required字段,只要这些被删除字段的数据标签不再被用于其它字段。

定义服务


1 service SearchService {
2 SearchResponse search(1: SearchRequest req)
3 }

服务里面可以定义多个方法/函数声明。而且它能生成完整的RPC代码实现(不仅仅是接口),这正是thrift的强大之处。

写入多个struct
这个由于缺少文档,尚不清楚是否和protobuf的message一样不能自区隔,但从它产生的代码来看,它应该是能够分清序列化后对象的边界的。

序列化编码
它通过TProtocol接口来实现不同编码方式的,支持二进制、压缩、JSON、SimpleJSON这4种格式。二进制、压缩格式是需要了解的两种编码,可以推测,其压缩格式和protobuf类似。具体的编码格式目前尚没有明确的文档说明,只能从代码中慢慢参详。

生成的代码
Java:不同于protobuf的每个文件一个类,thrift是每一个struct/enum/service类型生成一个java类,类型是JavaBean,也许是为了使用的灵活性,它生成的java代码在面向对象准则方面确实不如protobuf。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多