Thrift 框架

Thrift 框架,第1张

目录

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请求转发,调用参数解析和用户逻辑调用,返回值写回等处理

3TProtocol是用于数据类型的解析,将结构化数据转化为字节流给TTransport进行传输,属于协议层

4TTransport是与底层传输密切相关的传输层,负责以字节流的方式接收和发送消息体,属于传输层

5)底层I/O负责实际的数据传输,包括socket,文件和压缩数据流等

如图所示:

 

Thrift 框架实现原理

Thrift调用过程中,Thrift客户端和服务器之间主要用到传输层类、协议层类处理类三个主要的核心类,这三个类的相互协作共同完成rpc的整个调用过程。在调用过程中将按照以下顺序进行协同工作:

1)将客户端程序调用的函数名和参数传递给协议层(TProtocol),协议层将函数名和参数按照协议格式进行封装,然后封装的结果交给下层的传输层。此处需要注意:要与Thrift服务器程序所使用的协议类型一样,否则Thrift服务器程序便无法在其协议层进行数据解析;

2)传输层(TTransport)将协议层传递过来的数据进行处理;此处也需要注意:要与Thrift服务器程序所采用的传输层的实现类一致,否则Thrift的传输层也无法将数据进行逆向的处理;

3Thrift服务器通过传输层(TTransport)接收网络上传输过来的调用请求数据,然后将接收到的数据进行逆向的处理,例如传输层的实现类TFramedTransport就是将“数据长度+数据内容”形式的网络数据,转成只有数据内容的形式,然后再交付给Thrift服务器的协议类(TProtocol);

(4)Thrift服务端的协议类(TProtocol)将传输层处理之后的数据按照协议进行解封装,并将解封装之后的数据交个Processor类进行处理;

(5)Thrift服务端的Processor类根据协议层(TProtocol)解析的结果,按照函数名找到函数名所对应的函数对象;

(6)Thrift服务端使用传过来的参数调用这个找到的函数对象;

(7)Thrift服务端将函数对象执行的结果又交给协议层;

(8)Thrift服务器端的协议层将函数的执行结果进行协议封装;

(9)Thrift服务器端的传输层将协议层封装的结果进行处理,然后发送给Thrift客户端程序;

(10)Thrift客户端程序的传输层将收到的网络结果进行逆向处理,得到实际的协议数据;

11Thrift客户端的协议层将数据按照协议格式进行解封装,然后得到具体的函数执行结果,并将其交付给调用函数;

以方法调用String getStr(String str1,Strin str2)为例描述Thrift 框架实现原理

 

Thrift支持的数据传输格式、数据传输方式和服务模型以及Thrift可定义的数据类

1)支持的传输格式

TBinaryProtocol二进制格式.

TCompactProtocol压缩格式

TJSONProtocol – JSON格式

TSimpleJSONProtocol提供JSON只写协议, 生成的文件很容易通过脚本语言解析。

TDebugProtocol使用易懂的可读的文本格式,以便于debug

2) 支持的数据传输方式

TSocket -阻塞式socker

TFramedTransportframe为单位进行传输,非阻塞式服务中使用。

TFileTransport以文件形式进行传输。

TMemoryTransport将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream

TZlibTransport使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。

3)支持的服务模型

TSimpleServer简单的单线程服务模型,常用于测试

TThreadPoolServer多线程服务模型,使用标准的阻塞式IO

TNonblockingServer多线程服务模型,使用非阻塞式IO

Thrift可定义的数据类型:

基本类型:

bool:布尔值,true false,对应 Java Boolean

byte8 位有符号整数,对应 Java byte

i1616 位有符号整数,对应 Java short

i3232 位有符号整数,对应 Java int

i6464 位有符号整数,对应 Java long

double64 位浮点数,对应 Java double

string:未知编码文本或二进制字符串,对应 Java String

结构体类型:

struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个JavaBean

容器类型:

list:对应 Java ArrayList

set:对应 Java HashSet

map:对应 Java HashMap

异常类型:

exception:对应 Java Exception

服务类型:

service:对应服务的类

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/884936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存