Thrift是由Facebook为“大规模跨语言服务开发”而开发的,现在是Apache软件基金会的开源项目。
Thrift实现了一种接口描述语言和二进制通讯协议,用来定义和创建跨语言的服务。它被当作一个RPC框架来使用。
Thrift支持的语言和特性
如果现在要实现一个除法divide的RPC接口服务:
float divide(1:int num1, 2:int num2=1) => InvalidOperation
如何使用Thrift来进行实现呢?
Thrift的基础库程序中已经提供了用于RPC通讯的底层基本消息协议和传输工具,也就是调用双方如何传输str、int、float等不同基本类型的数据无需我们自己再实现了。
但是对于不同的RPC接口是由不同个数不同类型的参数构成的,如上述divide服务就是有两个int类型的调用参数和float类型或InvalidOperation异常的返回值构成,也就是说发起调用时我们需要传递两个int类型的数据,调用完成返回值的时候,我们需要传递float类型或InvalidOperation异常,这些就需要我们利用Thrift提供的基础库自己写代码来实现。每个RPC接口服务都要定义出来,才能完成整个RPC调用。
若想调用双方使用不同的编程语言开发,即在不同的语言程序间完成RPC调用,那每个RPC接口服务都需要在调用方和被调用方使用不同的语言来定义。
上面的过程实际上是简单的重复工作。Thrift允许我们使用一种独立于任何编程语言的新的语言来定义接口服务,通常把这种语言成为接口定义语言(IDL,Interface Definition Language),我们使用Thrift的IDL将接口定义在一个文本文件中(通常使用.thrift后缀名,成为接口定义文件),然后使用Thrift提供的编译器(compiler)根据这个文件生成所需要的语言的程序源代码。\
生成得到不同接口的程序代码后,我们再编写客户端的调用代码和服务端的接口功能实现代码及启动代码,就可完成Thrift RPC的调用实现。
总结使用方法如下:
- 使用Thrift的IDL编写接口定义文件
- 使用Thrift的编译器生成特定语言的接口程序源代码
- 编写客户端和服务端程序
Thrift的架构
- TProtocol 提供了对基础类型数据进行不同方式编码的消息协议工具
- TTransport 提供了对编码后的消息数据进行不同方式网路传输的传输工具