目录
Thrift 框架总体概述
Thrift 基础架构详解
Thrift 框架实现原理
以方法调用String getStr(String str1,Strin str2)为例描述Thrift 框架实现原理
Thrift支持的数据传输格式、数据传输方式和服务模型以及Thrift可定义的数据类
Thrift 框架总体概述
Thrift实际上是实现了C/S(客户/服务器模式)模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服务)便可以了。其中protocol(协议层, 定义数据传输格式,可以为二进制或者XML等)和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。
Thrift 基础架构详解
(1)最上层是用户自行实现的业务逻辑代码,属于业务逻辑层
(2)第二层,thrift编译自动生成的代码,主要用于结构化数据的解析,发送和接收。TServer主要任务是高效的接收客户端的请求,并将请求转发给processor处;processor负责对客户端的请求作出响应,包括RPC请求转发,调用参数解析和用户逻辑调用,返回值写回等处理
(3)TProtocol是用于数据类型的解析,将结构化数据转化为字节流给TTransport进行传输,属于协议层
(4)TTransport是与底层传输密切相关的传输层,负责以字节流的方式接收和发送消息体,属于传输层
(5)底层I/O负责实际的数据传输,包括socket,文件和压缩数据流等
如图所示:
Thrift 框架实现原理
Thrift调用过程中,Thrift客户端和服务器之间主要用到传输层类、协议层类和处理类三个主要的核心类,这三个类的相互协作共同完成rpc的整个调用过程。在调用过程中将按照以下顺序进行协同工作:
(1)将客户端程序调用的函数名和参数传递给协议层(TProtocol),协议层将函数名和参数按照协议格式进行封装,然后封装的结果交给下层的传输层。此处需要注意:要与Thrift服务器程序所使用的协议类型一样,否则Thrift服务器程序便无法在其协议层进行数据解析;
(2)传输层(TTransport)将协议层传递过来的数据进行处理;此处也需要注意:要与Thrift服务器程序所采用的传输层的实现类一致,否则Thrift的传输层也无法将数据进行逆向的处理;
(3)Thrift服务器通过传输层(TTransport)接收网络上传输过来的调用请求数据,然后将接收到的数据进行逆向的处理,例如传输层的实现类TFramedTransport就是将“数据长度+数据内容”形式的网络数据,转成只有数据内容的形式,然后再交付给Thrift服务器的协议类(TProtocol);
(4)Thrift服务端的协议类(TProtocol)将传输层处理之后的数据按照协议进行解封装,并将解封装之后的数据交个Processor类进行处理;
(5)Thrift服务端的Processor类根据协议层(TProtocol)解析的结果,按照函数名找到函数名所对应的函数对象;
(6)Thrift服务端使用传过来的参数调用这个找到的函数对象;
(7)Thrift服务端将函数对象执行的结果又交给协议层;
(8)Thrift服务器端的协议层将函数的执行结果进行协议封装;
(9)Thrift服务器端的传输层将协议层封装的结果进行处理,然后发送给Thrift客户端程序;
(10)Thrift客户端程序的传输层将收到的网络结果进行逆向处理,得到实际的协议数据;
(11)Thrift客户端的协议层将数据按照协议格式进行解封装,然后得到具体的函数执行结果,并将其交付给调用函数;
以方法调用String getStr(String str1,Strin str2)为例描述Thrift 框架实现原理Thrift支持的数据传输格式、数据传输方式和服务模型以及Thrift可定义的数据类
(1)支持的传输格式
TBinaryProtocol – 二进制格式.
TCompactProtocol – 压缩格式
TJSONProtocol – JSON格式
TSimpleJSONProtocol –提供JSON只写协议, 生成的文件很容易通过脚本语言解析。
TDebugProtocol – 使用易懂的可读的文本格式,以便于debug
(2) 支持的数据传输方式
TSocket -阻塞式socker
TFramedTransport – 以frame为单位进行传输,非阻塞式服务中使用。
TFileTransport – 以文件形式进行传输。
TMemoryTransport – 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream。
TZlibTransport – 使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。
(3)支持的服务模型
TSimpleServer – 简单的单线程服务模型,常用于测试
TThreadPoolServer – 多线程服务模型,使用标准的阻塞式IO。
TNonblockingServer – 多线程服务模型,使用非阻塞式IO
Thrift可定义的数据类型:
基本类型:
bool:布尔值,true 或 false,对应 Java 的 Boolean
byte:8 位有符号整数,对应 Java 的 byte
i16:16 位有符号整数,对应 Java 的 short
i32:32 位有符号整数,对应 Java 的 int
i64:64 位有符号整数,对应 Java 的 long
double:64 位浮点数,对应 Java 的 double
string:未知编码文本或二进制字符串,对应 Java 的 String
结构体类型:
struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个JavaBean
容器类型:
list:对应 Java 的 ArrayList
set:对应 Java 的 HashSet
map:对应 Java 的 HashMap
异常类型:
exception:对应 Java 的 Exception
服务类型:
service:对应服务的类
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)