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示例