Apache Thrift学习入门及Java实例演示


=Start=

缘由:

传统的HTTP[S]方式的接口QPS/TP99还是太低了,在数据量大、QPS高的地方不用thrift是处理不过来了。之前只是在学习了解RPC的时候简单了解过Apache Thrift,但没有实际写过代码的话印象还是不够深刻,所以在这里整理、记录一下在参考「Apache Thrift学习之一(入门及Java实例演示)」进行测试时的过程,一方面是加深记忆,另一方面是方便以后参考。

正文:

参考解答:
  • 概述
  • 下载配置[神坑]
  • 基本概念
    1. 数据类型
    2. 服务端编码基本步骤
    3. 客户端编码基本步骤
    4. 数据传输协议
  • 实例演示(Java)
    1. Thrift生成代码
    2. 实现接口Iface
    3. TSimpleServer服务模型
    4. TThreadPoolServer 服务模型
    5. TNonblockingServer 服务模型
    6. THsHaServer服务模型
    7. 异步客户端

==

[一]、概述

Apache Thrift 是由 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。Thrift是由Facebook开发的,并在2008年捐给了Apache基金会,成为了一个孵化器项目。

  • Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎。
  • Thrift是一个驱动层接口,它提供了用于客户端使用多种语言实现的API。
  • Thrift是个代码生成库,支持的客户端语言包括C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 。它的目标是为了各种流行的语言提供便利的RPC调用机制,而不需要使用那些开销巨大的方式,比如SOAP。

要使用Thrift,就要使用一个语言中立的服务定义文件,描述数据类型和服务接口。这个文件会被用作引擎的输入,编译器生成代码为每种支持的语言生成RPC客户端代码库。这种静态生成的设计让它非常容易被开发者所使用,而且因为类型验证都发生在编译期而非运行期,所以代码可以很有效率地运行。

Thrift的设计提供了以下这些特性:
1、语言无关的类型
因为类型是使用定义文件按照语言中立的方式规定的,所以它们可以被不同的语言分析。比如,C++的结构可以和Python的字典类型相互交换数据。
2、通用传输接口
不论你使用的是磁盘文件、内存数据还是socket流,都可以使用同一段应用代码。
3、协议无关
Thrift会对数据类型进行编码和解码,可以跨协议使用。
4、支持版本
数据类型可以加入版本信息,来支持客户端API的更新。

[三]、基本概念

1.数据类型

  • 基本类型:
    • 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:utf-8编码的字符串,对应 Java 的 String
  • 结构体类型:
    • struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
  • 容器类型:
    • list:对应 Java 的 ArrayList
    • set:对应 Java 的 HashSet
    • map:对应 Java 的 HashMap
  • 异常类型:
    • exception:对应 Java 的 Exception
  • 服务类型:
    • service:对应服务的类

2.服务端编码基本步骤:

  • 实现服务处理接口impl
  • 创建TProcessor
  • 创建TServerTransport
  • 创建TProtocol
  • 创建TServer
  • 启动Server

3.客户端编码基本步骤:

  • 创建Transport
  • 创建TProtocol
  • 基于TTransport和TProtocol创建 Client
  • 调用Client的相应方法

4.数据传输协议

  • TBinaryProtocol : 二进制格式.
  • TCompactProtocol : 压缩格式
  • TJSONProtocol : JSON格式
  • TSimpleJSONProtocol : 提供JSON只写协议, 生成的文件很容易通过脚本语言解析

Tips:客户端和服务端的协议要一致!

==

一点感想:「异步」的快速response在Storm中真的是太给力了!

参考链接:

=END=

,

《“Apache Thrift学习入门及Java实例演示”》 有 2 条评论

  1. 哪个互联网公司使用 facebook thrift 做底层架构,实现高性能、可扩展的web应用?引入thrift之后的优缺点是什么?
    https://www.zhihu.com/question/20189791
    `
    对于早中期的互联网公司,从山寨版走向”Everything is a service”的方案,thrift是一个很好的,开箱即用的一站式解决方案,不需要自行做改造或者适配,性能也很优秀,没有太多摸索和踩坑的成本。

    缺点么,和其他facebook开源的项目都有类似的问题,只管拉不管擦:
    1. 基本没有官方文档,使用参考可以看看有人专门写的这个 Thrift: The Missing Guide
    2. RPC在 0.6.1 升级到 0.7.0 是不兼容的!这个对于早于 0.6.1 开始使用的用户来说是个大坑
    3. bug fix和更新不积极,好在序列化和RPC服务都不是太复杂的问题,需要考量的设计问题不多,自己维护patch的成本不高,如果我没有记错的话,0.6.1的java的ThreadPool Server是会有Thread死亡之后的Thread泄露问题的
    4. Facebook今年说,我们开源了一个新的performance更好的 fbthrift,你说你该用apache thrift还是fbthrift呢?
    `

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注