Thrift允许开发者在一个单独的语言无关的文件里,定义数据类型和服务接口(thrift文件),然后生成用来构建RPC客户和服务器所需的全部代码。
网络环境下,跨语言交互的一些关键组件:
- 类型(Types)——需要一种通用的类型系统。类型的转换上,编程者不需编写任何应用层以下的代码。
- 传输(Transport)——各个语言必须有一种双向传输原始数据的通用接口。一个给定的传输是如何实现的,应该与服务开发者无关。
- 协议(Protocol)——数据类型必须有某种方法,来使用传输层对它们自身编码和解码。同样地,应用开发者不需要关心该层。重要的是,数据能够以一种一致的、确定的方式被读写。
- 版本化(Versioning)——健壮的服务相关的数据类型必须提供一种自身版本化的机制。具体来说,它应当能在一个对象中添加或移除域,或改变一个函数的参数列表,而不干扰服务。
- 处理器(Processors)——最后,我们生成能够处理数据流以实现远程过程调用的代码。
1、定义thrift文件(一些用到的结构体和服务端口)
thrift的类型
1)基本类型:不支持无符号类型
- byte: 有符号字节
- i16: 16位有符号整数
- i32: 32位有符号整数
- i64: 64位有符号整数
- double: 64位浮点数
- string: 字符串
2)容器类型:集合中的元素可以是除了service之外的任何类型,包括exception
- list<T>: 一系列由T类型的数据组成的有序列表,元素可以重复。直接翻译为STL vector,Java ArrayList,或脚本语言中的native array。
- set<T>: 一系列由T类型的数据组成的无序集合,元素不可重复。翻译为STL set,Java HashSet,Python中的set,或PHP/Ruby中的native dictionary。
- map<K, V>: 一个字典结构,严格唯一的键(keys)到值(values)的映射。翻译为STL map,Java HashMap,PHP associative array,或Python/Ruby dictionary。
3)结构体(struct)
struct DocContent{
1:string content,
2:string title,
}4)枚举(enum)
enum DocContent{
MALE,
FEMALE
}5)异常(exception)
- 异常在语法和功能上都与结构体相同,生成的对象继承自各目标编程语言中适当的异常基类,以便与任何给定语言中的本地异常处理无缝地整合。
exception RequestException{
1: i32 code;
2: string reason;
}6)常量(const)
const i32 MAX_RETRIES_TIME = 10
7)可选与必选
struct People {
1: required string name;
2: optional i32 age;
}8)服务(Services)
- 对一个服务的定义在语法上等同于在面向对象编程中定义一个接口(或一个纯虚抽象类)。Thrift编译器生成实现该接口的客户与服务器存根。
service GetKeywordsString {
KeywordsResult