Thrift那点事

来源:互联网 发布:python requests 重试 编辑:程序博客网 时间:2024/06/07 12:57

Thrift那点事

本博文不是Thrift启蒙和Hello World,如果有需要请绕道开车Thrift官网
http://thrift.apache.org,而是旨在对Thrift学完后似懂非懂的一个整理和总结。希望能帮到正处于这个水深火热阶段的同学们。

  • Thrift的用途
  • Thrift的五大金刚
  • facebook的Swift

Thrift的用途

既然大家已经初步学习过了Thrift,Thrift到底是什么也大概知道了,最强悍的也就是跨语言的rpc,而我之所以学习这个主要还是公司内部的分布式服务主要的传输方式是Thrift。可能会有同学去跟dubbo这些做比较,其实Thrift自身在分布式上没有什么优势,它没有像dubbo那样有注册中心、服务发现和一些监控。Thrift就是通过定义一个用自己的语言描述的公用的服务(Thrift文件),然后又能提供-gen生成各种语言去生成服务和调用服务。

Thrift的五大金刚

五大金刚是我自己定的,网上并没有相关说法,只是方便自己记忆api和熟悉流程。五大金刚分别是:
Transport
Protocol
Processor
Client
TServer

Transport传输层

主要分两个维度:服务端客户端

  • 服务端的父类TServerTransport
    分为阻塞TServerSocket和非阻塞TNonblockingTransport(这是个抽象类,实现是TNonblockingServerSocket)。
    所以从实现上来看都是XXServerSocket,这样好记点。

  • 客户端的父类是TTransport,同样也会分阻塞和非阻塞,
    更有分不同传输形式的,比如TSocket面向socket编程的,而THttpClient就是http协议传输,TFileTransport则是文件传输的。
    这里的TSocket是同步阻塞的,也就是传统的IO,而TFrameTransport是同步非阻塞的,相当于NIO,还有TNonblockingTransport是异步非阻塞的,相当于AIO。后两者都是非阻塞的,所以都要对应服务端的TNonblockingServerTransport

Protocol协议

传输的协议,在thrift中提供的协议不多,主要分为两种:文本传输(如json、compact压缩)和二进制传输(binary)。
这里很容易疑惑和混淆,强调一点,无论是文本传输还是二进制传输,最终他们都会根据设定的编码方式(如UTF-8)转换成相应的二进制字节,然后再传输!
那???这两个有什么区别。文本传输和二进制传输的唯一区别在于换行符的处理。二进制是不管,而文本(之所以叫文本就是要看的,当然要处理换行)处理换行符要根据操作系统默认的编码方式,在unix下是2个字节,但是在dos是4个字节,在使用如ftp下载文件时候,转换到不同的操作系统会根据系统编码自动加入或者去除2个字节。所以文本内容在不同操作之间传输一定要用文本传输,因为用二进制根本就不会去转换,那么到不同操作系统后就无法识别。如果是对于二进制文件,如图片、视频、可执行文件,就一定要用二进制传输,想象自己的图片在别的系统里面加了几个字节。。。(⊙o⊙)…你确定还能用?当然了,这一切都是站在不同操作系统的基础上做的,而过是同样的操作系统,不会有这些困惑

Processor

处理器嘛,在thrift自动生成java文件中,IFace,Client和Processor是最重要的静态内部类。这个Processor就是服务端在实现具体接口逻辑的,然后在服务端启动的时候告诉服务器,这个接口要这么处理!所以,这个客户端根本不需要用到。

Client

客户端。。。所以服务端根本不用理这里。这个是在客户端调用服务时候用的,内部的方法都包含了我们在接口里面定义的所有method,所以客户端传好相应的参数后,直接client上调用。

TServer

这个也是服务端党的,跟TServerTransport对应的,其实就是processor+Transport+protocol的一个组合,就是强行把这三者联合在一起使用,对外提供服务TServer.serve();主要的有三个TServer:

  • TSimpleServer 单线程阻塞IO,这个也在测试那里玩玩
  • TThreadServer 多线程阻塞IO
  • TNonblockingServer 这个当然是多线程非阻塞IO了

facebook的Swift

有代码洁癖的可能会不爽thrift自动生成的那个近千行的java文件了,而且在编程上对传输的结构不是很明晰,经常要回去看thrift文件。所以可以采用facebook的开源项目swift,在thrift上进行了改良,使用@ThriftServer、@ThriftStruct等注解要描述一个java对象,而且还提供了maven插件可以自动生成。