您的位置:

Thrift框架详解

一、Thrift框架好用吗?

Apache Thrift是一个跨语言的服务化框架,由Facebook开发。旨在为不同的语言提供一个一致的RPC框架,可以实现无缝的跨语言调用。Thrift框架优点有以下几点:

1、跨语言支持:
Thrift支持多种编程语言,包括Java、C++、Python、PHP等等。在开发过程中,通过定义IDL(接口定义语言)来定义接口,Thrift会将IDL自动生成对应语言的代码。这样多个语言之间进行交互时,只需要通过定义好的IDL即可。

2、性能较高:
在RPC调用方面,Thrift可以提供比传统web service更快的访问速度。Thrift使用了二进制协议,相比于文本协议,序列化和反序列化的效率更高。同时Thrift还采用了高性能的NIO(New I/O)模型,可以轻松处理大量请求。

3、灵活性和扩展性:
Thrift框架中的IDL是可扩展的,在架构会发生变化的情况下,Thrift可以简单的完成服务定义的变化,支持多种服务模式,例如单线程/多线程、阻塞/非阻塞等多种模式。

二、Thrift框架buffer和frame

Thrift的socket传输协议,是基于buffer的,不过,Thrift对socket传输协议进行了封装,使用时,一般不直接使用它,而是使用协议的上层封装:frame。 frame的作用是用指定长度的帧包装消息。

Thrift使用了两种基本的数据结构:TBufferedTransport和TFramedTransport。

TBufferedTransport是为了提高IO效率,对各种Socket通信方式进行了一个节流控制优化。在socket客户端、服务端连接之间通过一个buffer,把数据通过一一吞吐的方式渐进式地传输,这种流式传输方式避免了对非堵塞IO的高频调用,对使用基于堵塞线程池的服务器程序有较好的优化效果。

TFramedTransport则是指每个请求都带上一个长度参数,每次请求通过一个整块的数据包传输,带有长度前缀的数据包接收起来比单纯的buffer好使得多。

三、Thrift框架和Netty

当然Thrift框架也可以作为Netty网络应用框架的一部分,使得Java本地应用能够分布式用户访问,即服务端为Java原生应用,提供基于RPC调用的远程访问方式,Thrift+Cassandra的架构也采用了Netty的框架。

Thrift框架可以和Netty框架在下层组件上打通,用Netty提供网络协议的支持,使得服务器集群分布式运行,能够完全控制客户端与服务端的传输数据,具有高吞吐量和低延迟等优势,提供程序的可扩展性,实现了高效的通信。

四、Thrift框架还有人用吗?

随着分布式服务架构在互联网领域的广泛应用,RPC框架也在逐渐普及,当然,Thrift框架也被越来越多的用户所熟知和应用。当前的很多大型互联网公司或电商平台,都在使用Thrift框架,例如Facebook、Twitter、阿里巴巴、搜狐、快手、京东等等。相信在现在和未来很长时间内,Thrift框架都会占据重要的位置。

五、Thrift框架和Truffle框架

Truffle框架是JavaScript脚本语言的一个新型编译技术,基于GraalVM虚拟机使用的一款可嵌入语言的直接编译器框架,它能够将多种脚本解释器语言转换为符合统一JVM运行时的字节码。而Thrift框架最大特点就是支持多种语言的RPC服务调用,两者有些类似。Truffle的执行引擎可以集成在Thrift框架中,是很多人推崇的技术组合。

六、Thrift意思

Thrift单词本身的意思是“剪短”,或者可以解释为“省略多余的部分”。换句话说,Thrift意在提高通信效率,去除不必要的部分,用最少的字节传递尽可能多的信息。

七、Thrift的技术架构有哪些?

Thrift框架的主要技术架构包括:IDL定义、代码生成、数据结构、数据传输协议、数据编码器解码器和服务端和客户端的通信框架。

IDL定义:
Thrift定义的IDL很类似于传统的接口定义语言,不过扩展了一些数据类型,以支持多种语言的数据类型,当然,定义的IDL也具有兼容性。

// Thrift IDL,定义了一种数据类型
namespace java com.example

struct Person {
  // 定义 Person 结构体,结构体中有3个字段
  1: i64 id
  2: string name
  3: string email
}

代码生成:
在定义好IDL之后,Thrift可以根据IDL自动生成对应语言的代码文件,方便应用之间的集成和调用。

数据结构:
Thrift支持多种数据类型,例如基础数据类型、常规数据类型、结构体、异常、枚举、集合、映射等等。

数据传输协议:
Thrift使用二进制传输,相比于文本协议,二进制协议转换效率更高。

数据编码器解码器:
Thrift通过序列化和反序列化实现传输,需要编码器和解码器实现这些功能。

// Java 代码示例,编码器和解码器的定义
// 实现TProtocol接口
public class TBinaryProtocol extends TProtocol {
  // 编码逻辑
  public void writeI32(int i32) { … }

  // 解码逻辑
  public int readI32() { … }

  …
}

服务端和客户端通信框架:
Thrift支持多种服务模式,例如单线程/多线程、阻塞/非阻塞等多种模式。在使用Thrift建立服务端或客户端时,需要确定通信框架的具体实现。

// Java 代码示例,Thrift 服务端通信框架的具体实现
public class HelloServiceImpl implements HelloService.Iface {
  // 实现 HelloService.Iface 接口
  public String hello(String name) {
    return "Hello " + name;
  }
}

TProcessor processor = new HelloService.Processor(new HelloServiceImpl());

TServerTransport serverTransport = new TServerSocket(9090);
TServer server = new TThreadPoolServer(processor, serverTransport);

server.serve();