一.简介
定义:Thrift是facebook开发出的一个
软件库
和一组
代码生成工具
,以加快高效率、可扩展的后端服务的开发与实现的速度。
使用:先在一个单独的语言无关的文件中定义数据类型和服务接口,再用生成器生成代码,最后可以根据需要添加和修改生成代码(可能用到Thrift的库)。
特色:多语言支持、库和代码生成器带来的高效率。
二.基础组件
包括:类型、传输、协议、版本化和处理器
2.类型
2.1.基本类型:bool,byte,i16,i32,i64,double,string
2.2.结构体:使用关键字struct定义
2.3.容器:list<type>,set<type>,Map<type1,type2>
2.4.异常:使用关键字exception定义
2.5.服务:使用关键字service定义
3.传输
3.1.接口:TTransport,TServerTransport
3.2.实现:TSocket,TFileTransport,Utilities(TBufferdTransport,TFramedTransport和
TMemoryBuffer)
4.协议:
4.1.接口:双向有序的消息传递
基本类型、容器及结构体的编码
4.2.结构:Thrift协议是自定界的,没有任何成帧,且不论编码格式。
如需成帧可使用TFramedTransport来完成。
4.3.实现:所有数据按一种扁平的二进制格式来写的。
5.版本化:
5.1.域标识符:在语言无关文件中的变量前的数字,自动添加的是从-1开始的负数
5.2.lsset:用于对待预料之外的域
5.3.案例分析:主要是客户端和服务器新旧不匹配
5.4.协议/传输版本化
6.远程过程调用实现:
6.1.TProcessor:核心接口,有bool process(TProtocol in,TProtocol out)
6.2.生成代码:特别提示下,内部会生成相应的Client类
6.3.TServer:类型有TSimpleServer,TThreadedServer和TThreadPoolServer。
三.其他
7.实现细节
7.1.目标语言:C++,Java,Python,Ruby和PHP。
7.2.生成的结构体
7.3.RPC方法识别
7.4.服务器和多线程:Thrift实现了自己的多线程库
7.5.线程原语:命名空间facebook::thirft::concurrency中实现了Thrift线程库:
primitives,thread pool manager,timer manager。
boost::shared_ptr,Mutex类,Condition类和Monitor类。
借用Java中thread(线程对象)和runnable(线程执行逻辑)的区别的经验。
7.6.Thread,Runnable and shared_ptr
7.7.ThreadManager
7.8.TimerManager
7.9.非阻塞操作:Thrift基于libevent和TFramedTransport。
7.10.编译器
7.11.TFileTransport
8.Facebook的Thrift服务:
Facebook中已大量使用Thrift,包括搜索、日志、手机、广告和开发者平台。
9.总结:
使用Thrift可以让工程师们分而治之的将功能进行划分并可采用合适的语言类实现,而不用在编写重复的代码。