thrift linux使用教程,Thrift框架快速入门

Thrift介绍

1.什么是thrift?

thrift早期由facebook内部团队开发,主要用于实现跨语言间的方法调用,属于远程方法调用的一种,后开源纳入apache中,成为了apache thrift项目。

thrift允许定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

2.什么是RPC?

RPC (Remote Procedure Call Protocol),远程过程调用协议。

b31944d1b1196a6e53494c18b34ad7b6.png

简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法并得到返回的结果。

RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯) RPC 是一个请求响应模型。

客户端发起请求,服务器返回响应(类似于Http的工作方式) RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。

Thrift栈结构

add3303cae745fdce7ecbfc799223aa2.png

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:对应服务的类

生成thrift的java代码

http://thrift.apache.org/download

43386f452a4112e04b1c72646c83145d.png

69978c8d85b1e8eb8b104676ee90cbd9.png

d3e83149b02036a14fd989c88269560f.png

Hello.java内容

(1)异步客户端类AsyncClient和异步接口AsyncIface

(2)同步客户端类Client和同步接口Iface,Client类继承自TServiceClient,并实现了同步接口Iface;Iface就是根据thrift文件中所定义的接口函数所生成;Client类是在开发Thrift的客户端程序时使用,Client类是Iface的客户端存根实现, Iface在开发Thrift服务器的时候要使用,Thrift的服务器端程序要实现接口Iface。

(3)Processor类,该类主要是开发Thrift服务器程序的时候使用,该类内部定义了一个map,它保存了所有函数名到函数对象的映射,一旦Thrift接到一个函数调用请求,就从该map中根据函数名字找到该函数的函数对象,然后执行它;

(4)参数类,为每个接口函数定义一个参数类,例如:为接口helloInt产生一个参数类:helloInt_args,一般情况下,接口函数参数类的命名方式为:接口函数名_args;

(5)返回值类,每个接口函数定义了一个返回值类,例如:为接口helloInt产生一个返回值类:helloInt_result,一般情况下,接口函数返回值类的命名方式为:接口函数名_result;

参数类和返回值类中有对数据的读写操作,在参数类中,将按照协议类将调用的函数名和参数进行封装,在返回值类中,将按照协议规定读取数据。

Client

bc5fa07ff813af019bb40d9d679a17ca.png

Iface

43c1fe340a116e241f7fe1fad54f87f5.png

HelloServiceImpl

918471733c183454f77a0610ab30933b.png

调用过程

Thrift调用过程中,Thrift客户端和服务器之间主要用到传输层类、协议层类和处理类三个主要的核心类,这三个类的相互协作共同完成rpc的整个调用过程

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

(2)    传输层(TTransport)将协议层传递过来的数据进行处理,例如传输层的实现类TFramedTransport就是将数据封装成帧的形式,即“数据长度+数据内容”,然后将处理之后的数据通过网络发送给Thrift服务器;此处也需要注意:要与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客户端的协议层将数据按照协议格式进行解封装,然后得到具体的函数执行结果,并将其交付给调用函数;

服务端

8b975b1601420c22713a384e5aad2b78.png

客户端

8275420b3b2f530cda3b0d7c0caa714c.png

输出结果

0cab354ed102aa3607931e0d730ffde0.png

3e125bda56406266f7f491fc19479d66.png

协议和传输方式

Thrift 可以让用户选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本 (text) 和二进制 (binary) 传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目 / 产品中的实际需求。常用协议有以下几种:

TBinaryProtocol:是Thrift的默认协议,使用二进制编码格式进行数据传输,基本上直接发送原始数据

TCompactProtocol:压缩的、密集的数据传输协议,基于Variable-length quantity的zigzag 编码格式

TJSONProtocol:以JSON (JavaScript Object Notation)数据编码协议进行数据传输

TDebugProtocol:常常用以编码人员测试,以文本的形式展现方便阅读

常用的传输层有以下几种:

TSocket —— 使用阻塞式 I/O 进行传输,是最常见的模式

TFramedTransport —— 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO

TNonblockingTransport —— 使用非阻塞方式,用于构建异步客户端

TServerSocket:非阻塞型 socket,用于服务器端,accecpt 到的 socket 类型都是 TSocket(即阻塞型 socket)

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值