Apache Thrift - 可伸缩的跨语言服务开发框架

前两天被面到Thrift,回答的不是很好,赶紧整理下

使用介绍

Thrift是高效的、支持多种编程语言的远程服务调用的框架
目前公司主要的序列化,RPC服务都基于Thrift,包括内部的广告 投放引擎,数据处理系统,其实和Web相关的部分不多,只有少量的Web前端的服务调用调用后端的Thrift RPC服务,更多的RPC还是广告投放引擎和后端数据策略模块之间的互相通信。

已有常见消息方式缺点:

基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等用到的数据传输方式包括 XML,JSON 等.然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。

Thrift特点

1.Thrift支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,
2.序列化数据默认采用二进制格式。当然也支持自定义协议
3.优秀的效率
4.有很多开源项目的周边支持都是thrift的,hbase提供thrift服务,hive,spark sql,cassandra等一系列对外的标准服务接口都是thrift的以支持多语言。

还有哪些RPC框架

protobuf、Avro、MessagePack等,如果你有兴趣,可以搜索一下他们,也有利于你更好的了解RPC这个领域的发展情况。

Thrift 架构

Thrift 包含一个完整的堆栈结构用于构建客户端和服务器端。下图描绘了 Thrift 的整体架构。

Apache Thrift - 可伸缩的跨语言服务开发框架_第1张图片
图 1. 架构图

如图所示,图中黄色部分是用户实现的业务逻辑,褐色部分是根据 Thrift 定义的服务接口描述文件生成的客户端和服务器端代码框架,红色部分是根据 Thrift 文件生成代码实现数据的读写操作。红色部分以下是 Thrift 的传输体系、协议以及底层 I/O 通信,使用 Thrift 可以很方便的定义一个服务并且选择不同的传输协议和传输层而不用重新生成代码。
Thrift 服务器包含用于绑定协议和传输层的基础架构,它提供阻塞、非阻塞、单线程和多线程的模式运行在服务器上,可以配合服务器 / 容器一起运行,可以和现有的 J2EE 服务器 /Web 容器无缝的结合。

数据类型

Thrift 脚本可定义的数据类型包括以下几种类型:
基本类型:
bool:布尔值,true 或 false,对应 Java 的 boolean
byte:8 位有符号整数,对应 Java 的 byte
i16:16 位有符号整数,对应 Java 的 short
i32:32 位有符号整数,对应 Java 的 int
i64:64 位有符号整数,对应 Java 的 long
double:64 位浮点数,对应 Java 的 double
string:未知编码文本或二进制字符串,对应 Java 的 String
结构体类型:
struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
容器类型:
list:对应 Java 的 ArrayList
set:对应 Java 的 HashSet
map:对应 Java 的 HashMap
异常类型:
exception:对应 Java 的 Exception
服务类型:
service:对应服务的类

协议

TBinaryProtocol —— 二进制编码格式进行数据传输
TCompactProtocol —— 高效率的、密集的二进制编码格式进行数据传输
TJSONProtocol —— 使用 JSON 的数据编码协议进行数据传输
TSimpleJSONProtocol —— 只提供 JSON 只写的协议

传输层

TSocket —— 使用阻塞式 I/O 进行传输,是最常见的模式
TFramedTransport —— 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO。若使用 TFramedTransport 传输层,其服务器必须修改为非阻塞的服务类型
TNonblockingTransport —— 使用非阻塞方式,用于构建异步客户端

NULL 问题

在 Thrift 中,直接调用一个返回 null 值的方法会抛出 TApplicationException 异常。为了处理返回 null 值情况,我们要捕获该异常,并进行相应的处理

借鉴

https://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/
http://m.blog.csdn.net/article/details?id=50478712
http://blog.jobbole.com/107828/?utm_source=tuicool&utm_medium=referral

你可能感兴趣的:(Apache Thrift - 可伸缩的跨语言服务开发框架)