介绍
Thrift 最初由Facebook开发,而后捐献给Apache,目前已广泛应用于业界。Thrift 正如其官方主页介绍的,“是一种可扩展、跨语言的服务开发框架”。简而言之,它主要用于各个服务之间的RPC通信,其服务端和客户端可以用不同的语言来开发。只需要依照IDL(Interface Description Language)定义一次接口,Thrift工具就能自动生成 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml等语言的代码。
安装
Thrift的安装还是有些繁琐的,跟着官方文档的走就可以。如果你是Mac OS X, 这里有更方便的方法。
brew install boost |
不过注意上述方法默认安装的最新版。
Thrift 类型系统
thrfit的类型系统包括了基本类型,比如bool, byte, double, string和int。也提供了特殊类型如binary,提供了structs(等同于无继承的class),还提供了容器类型(list,set,map)。
基本类型(basic types)
- bool: 布尔变量
- byte: 8位有符号整数
- i16: 16位有符号整数
- i32: 32位有符号整数
- i64: 64位有符号整数
- double: 64位浮点数
- string: 字符串
注:thrift不支持无符号整数类型,因为很多编程语言不存在无符号类型,比如java
特殊类型(special types)
binary: 未编码的字节序列
枚举(enum)
枚举的定义形式和Java的Enum定义差不多,例如:
enum Sex { |
容器类型(container)
集合中的元素可以是除了service之外的任何类型,包括exception。
- list
: 一系列由T类型的数据组成的有序列表,元素可以重复 - set
: 一系列由T类型的数据组成的无序集合,元素不可重复 - map<K, V>: 一个字典结构,key为K类型,value为V类型
结构体(struct)
结构体中包含一系列的强类型域,等同于无继承的class。可以看出struct写法很类似C语言的结构体。
struct Example { |
可选与必选
thrift提供两个关键字required
,optional
,分别用于表示对应的字段时必填的还是可选的。例如:
struct People { |
表示name是必填的,age是可选的。
联合(union)
当一个结构体中,field之间的关系是互斥的,即只能有一个field被使用被赋值。我们可以用union来声明这个结构体,而不是一堆堆optional的field,语意上也更明确了。例如:
union JavaObjectArg { |
异常(Exceptions)
可以自定义异常类型,所定义的异常会继承对应语言的异常基类,例如java,就会继承 java.lang.Exception
。
exception InvalidOperation { |
服务(service)
thrift定义服务相当于Java中创建Interface一样,创建的service经过代码生成命令之后就会生成客户端和服务端的框架代码。定义形式如下:
service StringCache { |
命名空间(namespace)
thrift的命名空间相当于Java中的package的意思,主要目的是组织代码。thrift使用关键字namespace定义命名空间,例如:
namespace java me.wuchong.thrift |
注意末尾不能有分号,由此生成的代码,其包路径结构为me.wuchong.thrift
下一篇文章,将通过一个简单的实例来了解thrift的使用。
##参考资料