Thrift 简析
Thrift 是一种可扩展、跨语言的服务开发框架,用于各个服务之间的 RPC 通信。
概述
Thrift 最初由 Facebook 于 2007 年开发,2008 年进入 Apache 开源项目。Thrift 主要用于各个服务之间的 RPC 通信,是一种可扩展、跨语言的 RPC 服务开发框架,其服务端和客户端可以用不同的语言来开发。只需要依照 IDL(Interface Description Language)定义一次接口,Thrift 工具就能编译生成 C++, Java, Python, PHP, Ruby, JavaScript, Node.js 等语言的代码。
Thrift 类型
Thrift 的类型包括了基本类型,如 bool,byte,double,string 和不同长度的 有符号整数 类型;也提供了特殊类型如 binary,enum,structs,容器类型(list,set,map),exception,service,const 等,也支持类型定义。
基本类型
| 1 | bool: 布尔变量 | 
其中 i16 类型相当于 short 类型,i32 类型相当于 int 类型,i64 类型相当于 long 类型。
** 注:Thrift 不支持无符号整数类型,因为很多编程语言不存在无符号类型,比如 Java**
特殊类型
| 1 | binary: 未编码的字节序列 | 
枚举类型
| 1 | enum Sex { | 
结构体
结构体中包含一系列的 强类型 域,目的是聚集一系列数据,类似于无继承的类。
| 1 | struct People { | 
容器类型
集合中的类型可以是除了 service 之外的任何类型,包括 exception。
| 1 | list: 由 T 类型的数据组成的有序列表,元素可以重复 | 
异常
Thrift 支持自定义 exception,规则和 struct 类似:
| 1 | exception RequestException { | 
服务
thrift 定义服务相当于 Java 中创建 Interface,创建的 service 经过代码生成命令之后就会生成客户端和服务端的框架代码。定义形式如下:
| 1 | service HelloWordService { | 
常量 (const)
thrift 也支持常量定义,使用 const 关键字,例如:
| 1 | const i32 MAX_RETRIES_TIME = 10 | 
类型定义
thrift 支持类似 C++ 一样的 typedef 定义,比如:
| 1 | typedef i32 Integer | 
Thrift 语法
命名空间
thrift 的命名空间相当于 Java 中的 package,主要目的是组织代码。thrift 使用关键字 namespace 定义命名空间,例如:
| 1 | namespace java com.winwill.thrift | 
文件包含
thrift 也支持文件包含,相当于 C/C++ 中的 include,Java 中的 import。使用关键字 include 定义,例 如:
| 1 | include "global.thrift" | 
可选与必选
thrift 提供两个关键字 required,optional,分别用于表示对应的字段时必填的还是可选的。例如:
| 1 | struct People { | 
表示 name 是必需的,age 是可选的。
联合
当一个结构体中,field 之间的关系是互斥的,即只能有一个 field 可生效被赋值。我们可以用 union 来声明这个结构体,而不是一堆堆 optional 的 field,语意上也更明确了。例如:
| 1 | union JavaObjectArg { | 
注释
thrift 注释方式支持 shell 风格的注释,支持 C/C++ 风格的注释,即 # 和 // 开头的语句都单当做注释,/**/ 包裹的语句也是注释。
| 1 | # 这是一个注释 | 
python2 示例
定义idl
首先我们需要定义一个 idl —— hello.thrift:
| 1 | /* | 
生成代码
运行命令:
| 1 | thrift -r -gen py hello.thrift | 
会生成一个 gen-py 文件夹,里面的 hello 文件夹即为生成的服务
server端代码
在 gen-py 目录中新建 server.py
| 1 | # coding: utf-8 | 
client端代码
在 gen-py 目录中新建 client.py
| 1 | # coding: utf-8 | 
运行结果
| 1 | $ python server.py | 
参考
1、winwill2010,Thrift 入门教程
2、王博文,Python Thrift示例