本文共 2320 字,大约阅读时间需要 7 分钟。
1 简介
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送响应信息,然后等待下一个调用信息,最后,客户端调用进程接收响应信息,获得进程结果,然后调用执行继续进行。thrift的全名叫做Apache thrift,是一款软件开发RPC框架,可以很高效地实现跨语言的RPC服务。thrift最初生于Facebook,在2007年由Facebook正式开源出来,2008年由Apache软件基金会开始负责项目孵化至今。其他的RPC框架还有protobuf、Avro、MessagePack等。
2 安装并查看版本
下载thrift-0.11.0.tar.gz,编译安装,有些依赖包的问题google搜索可以解决,目前0.12.0稳定版已经发布。$ thrift --versionThrift version 0.11.03 thrift中数据类型 包括基础类型、结构、容器、异常、服务等几个部分 1 基础类型 (1)bool:布尔类型(true或false) (2)byte:8位有符号整数 (3)i16:16位有符号整数 (4)i32:32位有符号整数 (5)i64:64位有符号整数 (6)double:64位浮点数 (7)string:文本字符串,使用UTF-8编码
2 容器
(1)list容器:一个元素可重复的有序列表。会被转换成C++中的vector,Java中的ArrayList,脚本语言中的数组等。 (2)set容器:一个元素不可重复的无序集合。会转换成C++中的set,Java中的HashSet、Python中的Set等。(熟悉PHP的同学可能会问“PHP并不支持set类型,怎么办”,在PHP语言中,thrift会将set容器转换成List。) (3)map容器:一个含有多个key:value键值对的结构。会被转换成C++中的map,Java中的HashMap,PHP中的关联数组,Python/Ruby中的dictionary等。3 结构体
结构体类型,在形式上和C/C++中的结构体类型非常相似,就是一些类型的组合。 thrift接口文件中的结构体类型,都会被转换成一个独立的类(Class)。类的属性。便是结构体中的各个类型,而类的方法便是对这些类型进行处理的相关函数。例如:struct UserGradeInfo { 1: required string UserName = “Anonymous”; 2: required i16 UserGrade = 0;}
结构体中每一个域都有一个正整数标识符,这个标识符并不要求连续,但一旦定义,不建议再进行修改。
另外,每个域前都会有required或optional的限定,前者表示是必填域,后者则表示是可选域。域是可以有默认值的,比如上例中的“Anonymous”和0。 (1)如果一个域设置了required,但是在实际构造结构体时又没有给这个域赋值,那么thrift会认为这是一个异常。 (2)如果一个域设置为optional且在构造结构体时没有给这个域赋值,那么在使用这个结构体时,就会忽略掉这个optional的域。4 异常
除了使用exception来替代struct以外,“异常”这个类型,在语法上和刚才介绍过的结构体的用法是完全一致的。但是从语义上讲,exception和struct却大相径庭。exception是在远程调用发生异常时用来抛出异常用的。5 服务
服务的定义,与面向对象技术中定义一个接口很类似,而这些接口其实就是纯虚函数。thrift编译工具会根据服务的定义来产生相应的方法和函数。 每个服务,都包括了若干个函数,每个函数包括了若干参数和一个返回值(返回值可以是void)。 (小技巧:返回值为void的函数,你可以在函数名前加上oneway标识符,将此函数以异步模式执行,这样在调用此函数后,函数会立即返回。) 对于返回void的函数,thrift仍然会确保函数返回,这样就表示这个函数已被正确执行,且服务器端已有返回信息了。但是如果给void的函数前加上oneway,那么此函数的返回只能表示数据已经进入传输层,并不能表示服务器端已经收到并返回了数据。4 优缺点
优点
支持非常多的语言绑定 thrift文件生成目标代码,简单易用 消息定义文件支持注释 数据结构与传输表现的分离,支持多种消息格式 包含完整的客户端/服务端堆栈,可快速实现RPC 支持同步和异步通信 稳定,高效缺点
基本没有官方文档 bug fix和更新不积极 高低版本之间存在兼容性问题参考文档
http://thrift.apache.org/http://diwakergupta.github.io/thrift-missing-guide/https://blog.csdn.net/sunmenggmail/article/details/46818147