框架|Thrift 探秘

Posted 是非经过不知难

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了框架|Thrift 探秘相关的知识,希望对你有一定的参考价值。



Thrift本身是Facebook开源的一个RPC框架,主要用于客户端与服务端的开发。

1

RPC是什么?


首先 RPC的全称是:Remote Procedure Call,翻译之后就是“远程过程调用”。


顾名思义,远程,即非本地,也就是调用发起方与响应方并不在一起;过程,可以理解为功能执行,这一过程不仅包括功能的实现,也包括序列化、解码、IO等等,凡是能想到的需要的都可以包括在内;调用,即找到对方并完成整个过程。Thrift本身作为一个框架,对于解决RPC中遇到的问题提供了一种方案。




2

Thrift的使用


环境:JDK 1.8.0_251           

           Mac16pro 10.15.4 (19E287)




安装:

  无脑 brew install thrift 注意过程可能比较耗时,下载可能失败,重试就OK了




编写thrift文件:
        如下图所示,简单编写了一个thrift文件,用于生成client和server
框架|Thrift 探秘



调用命令生成demo:

 thrift --gen java testThrift.thrift,会在当前目录下生成gen-java目录,你要的那些代码就在这个目录里面




编写Client和Server:

除此之外,还需要编写ClientServer的代码,类似于Socket通信,但无需自己进行监听和处理请求。

Server端:

框架|Thrift 探秘

Client端:

框架|Thrift 探秘




启动Server、Client:

观察到通信结果如下:

框架|Thrift 探秘

框架|Thrift 探秘




3

代码分析

可以看到生成的HelloWorld里主要有以下几个类:


框架|Thrift 探秘


我们从HelloWorldService看起,其具体的内容如下:

框架|Thrift 探秘


其中Iface接口是服务端进行任务处理的函数声明,提供异步的AsyncIface接口,也声明了同样的函数,但提供了带callback的接口,接口中只有之前在.ft文件中定义的处理函数接口。



Client是Thrift提供的客户端的实现,主要的函数如下图所示:


1.提供了一个工厂类,用于构造client对象
2.提供了两种构造函数,可以为输入输出指定不同的传输层协议
3.xx函数(xx是你写的方法名)这个函数相当于在远程调用时包的一层,把下面4中所述的两个函数包起来
4.send_xxx,recv_xxx这两个函数是真正执行远程调用的函数



Client的异步实现AsyncClient的内容如下:

1.也是提供了一个工厂类,与上面类似
2.提供了一种构造函数
3.xx函数,这个与上面也差不多,但是通过一个内部类(4中的类)实现函数调用
4.xxxx_call这个类是Async独有的,其中write_args方法主要用于一些必要参数的写入,然后调用get_result来实现真正的远程调用



Processor类本质是一个Map,负责实现函数名称-》函数的映射,也有对应的异步类AsyncProcessor,区别只是异步的需要回调函数。



xxx_args主要是参数的一些setget等, xxx_result主要是对结果的处理。 这两个类中方法都比较多, 主要是参数的一些setget等, 除此之外最重要的就是read和write,根据设置的协议和模式读写数据。




4

通信过程


整个通信过程类似于网络的七层协议中的拆包与装包过程,所以双方必须保证各个层的协议一致才能正确通信,其中协议类主要为TProtocol的子类,传输层为TTransport的子类最终所有的数据都会被封装成TMessage的方式进行传输,TMessage由三部分组成:名称、类型、序列号。


整个通信过程如下图所示:







以上是关于框架|Thrift 探秘的主要内容,如果未能解决你的问题,请参考以下文章

rpc服务框架thrift介绍

RPC框架之Thrift架构及源码解读

RPC框架之Thrift架构及源码解读

Thrift框架-安装

Thrift框架-安装

RPC框架 - thrift 服务端