Apache Thrift简介

       https://blog.csdn.net/zkp_java/article/details/81879577

       初学者只需参照:http://thrift.apache.org/,一个多小时就可以理解Thrift IDL文件的语法使用。

       Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。

Thrift包含一套完整的栈来创建客户端和服务端程序。顶层部分是由Thrift定义生成的代码。而服务则由这个文件客户端和处理器代码生成。在生成的代码里会创建不同于内建类型的数据结构,并将其作为结果发送。协议和传输层运行时库的一部分。有了Thrift,就可以定义一个服务或改变通讯和传输协议,而无需重新编译代码。除了客户端部分之外,Thrift还包括服务器基础设施来集成协议和传输,如阻塞、非阻塞及多线程服务器。栈中作为I/O基础的部分对于不同的语言则有不同的实现。

Thrift支持众多通讯协议Protocol:

  • TBinaryProtocol – 一种简单的二进制格式,简单,但没有为空间效率而优化。比文本协议处理起来更快,但更难于调试

  • TCompactProtocol – 更紧凑的二进制格式,处理起来通常同样高效。

  • TDebugProtocol – 一种人类可读的文本格式,用来协助调试。

  • TDenseProtocol – 与TCompactProtocol类似,将传输数据的元信息剥离。

  • TJSONProtocol – 使用JSON对数据编码。

  • TSimpleJSONProtocol – 一种只写协议,它不能被Thrift解析,因为它使用JSON时丢弃了元数据。适合用脚本语言来解析。

支持的传输协议有Transport

  • TFileTransport – 该传输协议会写文件。

  • TFramedTransport – 当使用一个非阻塞服务器时,要求使用这个传输协议。它按帧来发送数据,其中每一帧的开头是长度信息。

  • TMemoryTransport – 使用存储器映射输入输出。(Java的实现使用了一个简单的ByteArrayOutputStream。)

  • TSocket – 使用阻塞的套接字I/O来传输。

  • TZlibTransport – 用zlib执行压缩。用于连接另一个传输协议。

Thrift还提供众多的服务器Server:

  • TNonblockingServer – 一个多线程服务器,它使用非阻塞I/O(Java的实现使用了NIO通道)。TFramedTransport必须跟这个服务器配套使用。

  • TSimpleServer – 一个单线程服务器,它使用标准的阻塞I/O。测试时很有用。

  • TThreadPoolServer – 一个多线程服务器,它使用标准的阻塞I/O。

  • THsHaServer: THsHa引入了线程池去处理,其模型读写任务放到线程池去处理,Half-sync/Half-async处理模式,Half-async是在处理IO事件上(accept/read/write io),Half-sync用于handler对rpc的同步处理;

     

Thrift的技术栈

Thrift对软件栈的定义非常的清晰, 使得各个组件能够松散的耦合, 针对不同的应用场景, 选择不同是方式去搭建服务。

Thrift软件栈分层从下向上分别为:传输层(Transport Layer)、协议层(Protocol Layer)、处理层(Processor Layer)和服务层(Server Layer)。

传输层(Transport Layer):传输层负责直接从网络中读取和写入数据,它定义了具体的网络传输协议;比如说TCP/IP传输等。

协议层(Protocol Layer):协议层定义了数据传输格式,负责网络传输数据的序列化和反序列化;比如说JSON、XML、二进制数据等。

处理层(Processor Layer):处理层是由具体的IDL(接口描述语言)生成的,封装了具体的底层网络传输和序列化方式,并委托给用户实现的Handler进行处理。

服务层(Server Layer):整合上述组件,提供具体的网络线程/IO服务模型,形成最终的服务。

thrift IDL文件
thrift IDL不支持无符号的数据类型,因为很多编程语言中不存在无符号类型,thrift支持一下几种基本的数据类型

byte: 有符号字节
i16: 16位有符号整数
i32: 32位有符号整数
i64: 63位有符号整数
double: 64位浮点数
string: 字符串
此外thrift还支持以下容器类型:

list: 一系列由T类型的数据组成的有序列表,元素可以重复;
set: 一系列由T类型的数据组成的无序集合,元素不可重复;
map: 一个字典结构,Key为K类型,Value为V类型,相当于java中的HashMap;
thrift容器中元素的类型可以是除了service之外的任何类型,包括exception

thirft支持struct类型,目的就是讲一些数据聚合在一起,方便传输管理,struct定义形式如下:

struct People {
    1:string name;
    2:i32 age;
    3:string gender;
}
thrift支持枚举类型,定义形式如下:

enum Gender {
    MALE,
    FEMALE
}

thrift支持自定义异常类型exception,异常定义形式如下:

exception RequestException {
    1:i32 code;
    2:string reason;
}

thrift定义服务相当于Java中创建接口一样,创建的service经过代码生thrift代码生成工具编译后就会生成客户端和服务端的框架代码,service的定义形式如下:

service HelloWorldService {
    // service中可以定义若干个服务,相当于Java Interface中定义的方法
    string doAction(1:string name, 2:i32 age);
}

thrift支持给类型定义别名,如下所示:

typedef i32 int
typedef i64 long

thrift也支持常量的定义,使用const关键字:

const i32 MAX_RETRIES_TIME = 10;
const string MY_WEBSITE = "http://facebook.com";

thrift支持命名空间,命名空间相当于Java中的package,主要用于组织代码,thrift使用关键字namespace定义命名空间,格式是namespace 语言名 路径,如下示例所示:

namespace java com.test.thrift.demo

thrift也支持文件包含,相当于CPP中的include,Java中的import,使用关键字include:

include "global.thrift"

#、//、/**/都可以作为thrift文件中的注释。

thrift提供两个关键字required和optional,分别用于表示对应的字段是必填的还是可选的(推荐尽量使用optional),如下所示:

struct People {
    1:required string name;
    2:optional i32 age;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值