Apache Thrift框架是一个跨语言RPC框架,通过Thrift的接口语言IDL(Thrift interface definition language)和代码生成工具来生成各个语言的服务代码,目前支持的语言有C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml和Delphi等等。Thrift能很方便的实现跨语言的服务调用,那么IDL文件的构成则是由Thrift规定的各种类型组成的,下面就来说说Thrift类型。
1、Base Types - 基本类型
基本类型没有包括所有的语言类型,主要是所有语言的关键类型。
- bool:布尔类型(true或者false)
- byte:字节类型
- i8:8位有符号整型
- i16:16位有符号整型
- i32:32位有符号整型
- i64:64位有符号整型
- double:64位浮点类型
- binary:字节数组类型
- string:字符串类型
注:Thrift基本类型中没有无符号整型
例:
const string name = 'hello'
const i32 num1 = 1234
2、Containers - 容器类型
Thrift容器是强类型容器,可映射到大多数有容器类型的编程语言中的常用容器类型。使用Java泛型风格,一共有三种容器:
- list
:有序列表,可以包含重复值,type是指定的类型。例如转换为Java中的ArrayList、脚本语言中的数组等等 - set
:无序列表,无重复值,type是指定类型。例如转换为Java中的HashSet,Python中的set等等,另外PHP中没有set,所以最终是转换成类似的数组。 - map
:key-value表,key唯一,type1是key的类型,type2是value的类型。例如转换成功Java中的HashMap、PHP中的关联数组、Python/Ruby中的字典等等。
例:
list
set
map
3、Structs - 结构体
Thrift struct 类似于C的struct,是一系列相关数据的封装,在OOP语言中会转换为类(class)。一个struct由数据项组成,每个数据项包括一个唯一的数字标识、一个数据类型、一个名称和一个可选的默认值。
例:
struct Location {
1: double latitude; //组成:数字标识:类型 名称
2: double longitude;
}
struct Weibo {
1: required i32 userId;
2: required string userName;
3: required string text;
4: optional Location loc; //可以引用外部结构体
16: optional string language = "english"
}
4、Exceptions - 异常
异常在功能上与struct基本一样,只是声明关键词不一样,在目标语言中会继承异常基类,这样可以与任何语言的本地异常处理无缝集成。
例:
exception Xception {
1: i32 errorCode,
2: string message
}
5、Services - 服务接口
服务相当于OOP编程中的interface(或者一个抽象类),客户端和服务端去实现这些具体的功能接口。服务由一组有名称的函数组成,每个函数都有一个参数列表和一个返回类型。无返回类型的函数可以使用void关键词,另外oneway关键词可以修饰void函数,使用oneway表示该函数生成不等待响应的代码,只发起请求,并不等待服务端响应。而void函数是会等待服务端的响应,以确保操作完成。
例:
service Publish {
bool postWeibo(1:Weibo wb),
oneway void zip()
}
好了,Thrift类型就结束了,接下来说说IDL的规范。