跟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 , |
14 |
1 : optional string title, |
15 |
2 : optional string summary, |
16 |
3 : optional string url, |
17 |
4 : optional string snapurl, |
20 |
struct SearchResponse { |
21 |
1 : optional StatusCode status, |
22 |
2 : optional i32 total, |
23 |
3 : list<Result> results, |
跟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) |
服务里面可以定义多个方法/函数声明。而且它能生成完整的RPC代码实现(不仅仅是接口),这正是thrift的强大之处。
写入多个struct 这个由于缺少文档,尚不清楚是否和protobuf的message一样不能自区隔,但从它产生的代码来看,它应该是能够分清序列化后对象的边界的。
序列化编码 它通过TProtocol接口来实现不同编码方式的,支持二进制、压缩、JSON、SimpleJSON这4种格式。二进制、压缩格式是需要了解的两种编码,可以推测,其压缩格式和protobuf类似。具体的编码格式目前尚没有明确的文档说明,只能从代码中慢慢参详。
生成的代码 Java:不同于protobuf的每个文件一个类,thrift是每一个struct/enum/service类型生成一个java类,类型是JavaBean,也许是为了使用的灵活性,它生成的java代码在面向对象准则方面确实不如protobuf。
|