Netty(三)之 Thrift
The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.
Apache Thrift软件框架,用于可扩展的跨语言服务开发,它包含软件栈和一个代码生成器用于构建服务,这个服务可以高效并且无缝的在 C++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,Node.js,Smalltalk,OCaml 和 Delphi 等其他语言间协作
Apache Thrift 与 Google Protocal Buffers 都是一种可以用于在 Netty 之上的一种数据格式,Thrift 可应用的语言比 Protocal Buffers 多,并且 Thrift 除了用于传递数据的定义,底层还提供了传输层,因此可以单独的去使用,而不必强制运行在 Netty 载体之上
Thrift
Thrift数据类型
Thrift不支持无符号类型,因为很多编程语言不存在无符号类型,比如Java
- byte:有符号字节
- i16:16位有符号整数
- i32:32位有符号整数
- i64:64位有符号整数
- double:64位浮点数
- string:字符串
- bool:布尔值
Thrift容器类型
- list:一系列由T类型的数据组成有序列表,元素可以重复
集合中的元素可以是除了service之外的任何类型,包括exception
- set:一系列由T类型的数据组成的无序列表,元素不可以重复
- map:一个字典结构,key 为 K类型,value为 V类型,相当于Java中的 HashMap
Thrift支持的三类组件
struct
结构体,编译生成完成后,对应的是我们的类,就像 C 语言一样,thrift 支持 struct 类型,目的就是将一些数据聚合在一起,方便传输管理。struct 的定义形式如下:
1 | struct People{ |
枚举,枚举的定义形式和 Java 的 Enum 定义类似
1 | enum Gender{ |
exception
异常,客户端与服务端之间通信用到的接口可能抛出的异常,thrift 支持自定义 exception,规则与 struct 一样
1 | exception RequestException{ |
service
服务,客户端与服务端之间通信用到的接口,thrift 定义服务相当于 Java 中创建 interface 一样,创建的 service 经过代码生成命令之后就会生成客户端和服务端的框架代码
1 | service HelloWorldService{ |
类型定义
thrift 支持类似 C++ 一样的 typedef 定义,在定义完别名后,在后面的 IDL 文件中就可以使用别名进行编写
1 | // 把 i32 别名成 int |
常量
thrift 也支持常量定义,使用 const 关键字
1 | const i32 MAX_RETRIES_TIME = 10 |
命名空间
thrift 的命名空间相当于 Java 中的 package 的意思,主要目的是组织代码。thrift 使用关键字 namespace 定义命名空间
1 | // 格式:namespace 语言名 路径 |
文件包含
thrift 也支持文件包含,相当于 C/C++ 中的 include,Java 中的 import,使用关键字 include 定义
1 | include "global.thrift" |
可选与必选
thrift 提供两个关键字required
,optional
,分别用于表示对应的字段是必填还是可选,主要根据你的业务来选择,推荐使用 optional
1 | 1:required string name; |
Thrift工作原理
数据之间的传输使用socket(多种语言均支持),数据载以特定的格式(String等)发送,接收方进行语言解析。通过定义 Thrift 文件,由 Thrift 文件(IDL)生成双方语言的接口,model,在生成的model及接口中会有解析码,编码的代码
Thrift 实践
下载Thrift
这一步可以直接通过 maven 或者 gradle 的方式集成 Thrift 包到所需要的项目包管理中即可
1 | # maven |
编译器安装
对于 macOS 可使用官方提供的方式去安装,也可以借助于 macOS 上,优秀的包管理工具 Homebrew 来进行安装,我这里就直接使用 Homebrew 进行安装,其他系统可参考官方文档
1 | brew install thrift |
编写.thrift文件
编写.thrift 文件的指南,可以参考官网文档,编写完文件,使用 thrift 编译器提供的命令生成相关的代码
1 | thrift --gen <language> <Thrift filename> |
示例
1 | // 定义命名空间 |
1 | try: |
1 | try: |
1 | public static void main(String[] args) throws Exception { |
1 | public static void main(String[] args) { |
相关源码rc-cluster-netty
其他
本地 Thrift 的 Python 环境,需要下载官方的文件,进行安装
1 | # 方式一: |