最近Boss让我研究一下Thrift,所以通过查阅大量的资料,整理出以下文档,在此备份。
一、引言
1、 背景
Thrift源于facebook,2007年facebook提交Apache基金会将Thrift作为一个开源项目。Facebook创造Thrift的目的是为了解决facebook系统中各系统间大数据量的传输通信以及系统间语言环境不同需要跨平台的问题。
2、 简介
Apache Thrift是Facebook实现的一种高效的、支持多种编程语言(IDL)的远程服务调用框架,包括一个软件库和一组代码生成工具,以加快高效率、可扩展的后端服务的开发与实现的速度。它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,它的代码生成器引擎可以在多种语言中,如C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk等创建高效的、无缝的服务,传输数据格式采用二进制格式,相对于JSON和XML体积更小,对于高并发、大数据量和多语言的环境更有优势。
它把各语言中最常用的部分加以抽象,把它们放进一个通用库里,再用各个语言实现,来实现跨编程语言的高效而可靠的通信。亦即,Thrift允许开发者在一个单独的语言无关的文件里(IDL文件),定义数据类型和服务接口,然后生成用来构建RPC客户和服务器所需的全部代码。
Thrift服务器包含用于绑定协议和传输层的基础架构,它提供阻塞、非阻塞、单线程和多线程的模式运行在服务器上,可以配合服务器/容器一起运行,可以和现有的J2EE服务器/WEB容器无缝结合。
跨语言支持:Thrift可以通过代码生成工具将接口定义文件生成不同语言的服务器端和客户端代码,从而实现服务器端和客户端的跨语言支持。用户在thrift定义文件中声明服务,这些服务通过编译生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提供服务)。其中Protocol(协议层,定义数据的传输格式)和Transport(传输层,定义数据传输方式)被用作运行时库
3、 特点
1、 支持多种编程语言:C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk;
2、 在多种不同的语言之间通信,thrift可以作为二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务;
3、 Thrift适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部数据传输相对于JSON和xml无论在性能、传输大小上有明显的优势。
缺点:Thrift适用于程序对程序静态的数据交换,需要先确定好他的数据结构,它是完全静态化的,当数据结构发生变化时,必须重新编辑IDL文件,代码生成,再编译载入的流程。
4、 开发流程
定义IDL文件--->使用代码生成工具生成代码---->实现类接口---->实现客户端以及服务器端。
二、技术要领
1、 整体架构
Thrift包含了一个完整的堆栈结构来构建客户端和服务器,如下图所示:
顶部的黄色部分是在Thrift 定义文件中,用户实现的业务逻辑代码;褐色部分是根据Thrift定义的服务接口描述文件生成的客户端和服务器端代码框架;红色部分是根据Thrift文件生成代码实现数据的读写操作;红色部分以下是Thrift的协议、传输体系以及底层I/O通信,使用Thrift可以很方便的定义一个服务并且选择不同的传输协议和传输层而不用重新生成代码。
2、 类型
Thrift提供各种语言中最基本的类型,是一种通用的类型系统。Thrift类型系统的目标是使编程者能使用完全在Thrift中定义的类型,而不论他们使用的是哪种编程语言。
Thrift类型系统没有引入任何特殊的动态类型或包装器对象,也不要求开发者编写任何对象序列化或传输的代码。
Base Types:基本类型
Struct:结构体类型
Container:容器类