Thrift 的原理和使用

发布于 2021-02-14 18:42:56 字数 2499 浏览 1413 评论 0

Thrift 是一个跨语言的服务部署框架,最初由 Facebook 于2007年开发,2008 年进入 Apache 开源项目。Thrift 通过 IDL(Interface Definition Language,接口定义语言)来定义RPC(Remote Procedure Call,远程过程调用)的接口和数据类型,然后通过thrift编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现。

Thrift 架构

TProtocol(协议层),定义数据传输格式,例如:

TBinaryProtocol:二进制格式;
TCompactProtocol:压缩格式;
TJSONProtocol:JSON格式;
TSimpleJSONProtocol:提供JSON只写协议, 生成的文件很容易通过脚本语言解析;
TDebugProtocol:使用易懂的可读的文本格式,以便于debug

TTransport(传输层),定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。

TSocket:阻塞式socker;
TFramedTransport:以frame为单位进行传输,非阻塞式服务中使用;
TFileTransport:以文件形式进行传输;
TMemoryTransport:将内存用于I/O,java实现时内部实际使用了简单的ByteArrayOutputStream;
TZlibTransport:使用zlib进行压缩, 与其他传输方式联合使用,当前无java实现;

Thrift 支持的服务模型

TSimpleServer:简单的单线程服务模型,常用于测试;
TThreadPoolServer:多线程服务模型,使用标准的阻塞式IO;
TNonblockingServer:多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式);

Thrift实际上是实现了C/S模式,通过代码生成工具将thrift文生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在Thirft文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后客户端调用服务,服务器端提服务便可以了。

一般将服务放到一个.thrift文件中,服务的编写语法与C语言语法基本一致,在.thrift文件中有主要有以下几个内容:变量声明(variable)、数据声明(struct)和服务接口声明(service, 可以继承其他接口)。

Thrift 语法

Thrift文件支持shell命令,因此thrift是可执行的。

Thrfit支持shell注释风格(#),也支持C/C++语言中单行(//)或者多行(/* */)注释风格

数据类型

1、基本类型

bool,布尔型,1个字节;
byte,有符号单字节;
i16,有符号16位整型;
i32,有符号32位整型;
i64,有符号64位整型;
double,64位浮点数;
string,字符串;
binary,字节数组;

注意:thrift 不支持无符号整型。

2、容器

map<t1,t2>,字典;
list<t1>,列表;
set<t1>,集合;

注意:容器中的元素类型可以是除了service 以外的任何合法thrift类型(包括结构体和异常)。

3、结构体 struct

Thrift结构体在概念上同C语言结构体类型—-一种将相关属性聚集(封装)在一起的方式;

在面向对象语言中,thrift结构体被转换成类。

struct Work { 1: i32 num1 = 0, 2: i32 num2, 3: Operation op, 4: optional string comment, }

结构体中,每个字段包含一个整数ID,数据类型、字段名,和一个可选的默认值。

字段还可以声明为"optional",当该字段没有设置的时候,不会被序列化输出;

规范的struct定义中的每个域均会使用required或者optional关键字进行标识。如果required标识的域没有赋值,thrift将给予提示。如果optional标识的域没有赋值,该域将不会被序列化传输。如果某个optional标识域有缺省值而用户没有重新赋值,则该域的值一直为缺省值。

4、异常 exception

异常在语法和功能上类似于结构体,只不过异常使用关键字exception而不是struct关键字声明。但它在语义上不同于结构体,当定义一个RPC服务时,开发者可能需要声明一个远程方法抛出一个异常。

exception InvalidOperation { 1: i32 what, 2: string why }

5、服务 service

在流行的序列化/反序列化框架(如 protocol buffer)中,Thrift是少有的提供多语言间RPC服务的框架。

Thrift 编译器会根据选择的目标语言为 server 产生服务接口代码,为 client 产生桩代码。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

6118422078

文章 0 评论 0

Bonjour°[大白

文章 0 评论 0

別甾虛僞

文章 0 评论 0

qq_FynBW0

文章 0 评论 0

浅笑依然

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文