目前流行的服务调用方式有很多种,例如基于SOAP消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等。其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。

Hessian是一款基于HTTP协议的RPC框架,采用的是二进制RPC协议,但是在JAVA中,Hessian的服务端需要使用Tomcat之类的容器,而它们的性能总是那么不如人意。

本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。

Thrift是为了解决Facebook各系统间大数据量的传输通信及系统之间语言环境不同需要跨平台的特性而产生的。

一、数据类型

Thrift 脚本可定义的数据类型包括以下几种类型:

1、基本类型:

(1)bool:布尔值,true 或 false,对应 Java 的 boolean

(2)byte:8 位有符号整数,对应 Java 的 byte

(3)i16:16 位有符号整数,对应 Java 的 short

(4)i32:32 位有符号整数,对应 Java 的 int

(5)i64:64 位有符号整数,对应 Java 的 long

(6)double:64 位浮点数,对应 Java 的 double

(7)string:未知编码文本或二进制字符串,对应 Java 的 String

2、结构体类型:

struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean

3、容器类型:

(1)list:对应 Java 的 ArrayList

(2)set:对应 Java 的 HashSet

(3)map:对应 Java 的 HashMap

4、异常类型:

exception:对应 Java 的 Exception

5、服务类型:

service:对应服务的类

二、协议

Thrift 可以让用户选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本 (text) 和二进制 (binary) 传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目 / 产品中的实际需求。常用协议有以下几种:

1、TBinaryProtocol —— 二进制编码格式进行数据传输  

使用方法:Factory proFactory = new TBinaryProtocol.Factory();

2、TCompactProtocol —— 高效率的、密集的二进制编码格式进行数据传输

使用方法:构建 TCompactProtocol 协议的服务器和客户端只需将 TBinaryProtocol 协议部分即可,替换成如下代码:TCompactProtocol.Factory proFactory = new TCompactProtocol.Factory();

3、TJSONProtocol —— 使用 JSON 的数据编码协议进行数据传输  

构建 TJSONProtocol 协议的服务器和客户端只需将中 TBinaryProtocol 协议部分即可,替换成如下代码:TJSONProtocol.Factory proFactory = new TJSONProtocol.Factory();

4、TSimpleJSONProtocol —— 只提供 JSON 只写的协议,适用于通过脚本语言解析

三、传输方式

常用的传输层有以下几种:

1、TSocket —— 使用阻塞式 I/O 进行传输,是最常见的模式;

2、TFramedTransport —— 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO

3、TNonblockingTransport —— 使用非阻塞方式,用于构建异步客户端;

四、服务端类型

常见的服务端类型有以下几种:

1、TSimpleServer —— 单线程服务器端使用标准的阻塞式 I/O;

2、TThreadPoolServer —— 多线程服务器端使用标准的阻塞式 I/O;

3、TNonblockingServer —— 多线程服务器端使用非阻塞式 I/O

参见:https://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/

http://dongxicheng.org/search-engine/thrift-framework-intro/

XXX.thrift文件中定义类一个service(ThriftCase),生成java代码之后将会变成一个接口,这些接口的作用是实现跨平台通信,但是真正的业务逻辑并未实现,所以,要做什么?怎么做?这些详细的设计应该由我们自己来实现。

代码参见:http://blog.163.com/scuqifuguang@126/blog/static/171370086201362273929684

RPC框架之Thrift的更多相关文章

  1. rpc框架之 thrift连接池实现

    接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...

  2. rpc框架之 thrift 学习 1 - 安装 及 hello world

    thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.or ...

  3. RPC框架之Thrift分析(转)

    一.简介 1.Thrift是Facebook开发的跨语言的RPC服务框架.随后贡献给Apache开源组织.成为RPC服务的主流框架.   2.特点:  优点:       跨语言,支持java.c/c ...

  4. rpc框架之 thrift 学习 2 - 基本概念

    thrift的基本构架: 上图源自:http://jnb.ociweb.com/jnb/jnbJun2009.html 底层Underlying I/O以上的部分,都是由thrift编译器生成的代码, ...

  5. 开源RPC(gRPC/Thrift)框架性能评测

    海量互联网业务系统只能依赖分布式架构来解决,而分布式开发的基石则是RPC:本文主要针对两个开源的RPC框架(gRPC. Apache Thrift),以及配合GoLang.C++两个开发语言进行性能对 ...

  6. Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架

    本文首先介绍了什么是Apache Thrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thri ...

  7. 微博轻量级RPC框架Motan

    Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...

  8. 一个简单的"RPC框架"代码分析

    0,服务接口定义---Echo.java /* * 定义了服务器提供的服务类型 */ public interface Echo { public String echo(String string) ...

  9. 微博轻量级RPC框架Motan正式开源:支撑千亿调用

    支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan. 微博轻量级RPC框架Motan正式开源 Motan 是微 ...

随机推荐

  1. Mapreduce-Partition分析

    Partition所处的位置 Partition位置 Partition主要作用就是将map的结果发送到相应的reduce.这就对partition有两个要求: 1)均衡负载,尽量的将工作均匀的分配给 ...

  2. [转] 网络流算法--Ford-Fulkerson方法及其多种实现

    网络流 转载自:http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html 在上一章中我们讨论的主题是图中顶点之间的最短路径,例如公 ...

  3. Automator一键生成所需的iOS 图片icon

    iOS到8了, 终于受不了它的各种尺寸的icon了. 写一个Finder服务来一键生成吧. 拖放几次再重复, 无技术含量, 但很有用. // 存放目录    ~/资源库/Services/

  4. SharePoint 2010 PowerShell 系列 之 备份、还原、部署 .WSP

    转:http://www.cnblogs.com/Fengger/archive/2012/08/24/2654093.html PowerShell系列目录 最近在部署测试环境,就顺便把PowerS ...

  5. Servlet3.0学习总结(四)——使用注解标注监听器(Listener)

    Servlet3.0提供@WebListener注解将一个实现了特定监听器接口的类定义为监听器,这样我们在web应用中使用监听器时,也不再需要在web.xml文件中配置监听器的相关描述信息了. 下面我 ...

  6. HDU 2191

    思路:简单动态规划,多重背包转化成0 1背包问题 #include<stdio.h> #include<string.h> int a[101][2001],rcw[2001] ...

  7. C#父类对象和子类对象之间的转化

    1. 子类到父类 Chinese c = new Chinese(); Person p1 = c;  //从变量c看是一个中国人,所以可以把人的标签贴上去 2. 父类到子类 Chinese c2 = ...

  8. javaNIO(转载)

    (一) Java NIO 概述 Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Chan ...

  9. Centos添加硬盘分区、挂载磁盘

    默认一个硬盘,新增硬盘识别为sdb.sdbc一次类推 1.查看磁盘信息 >fdisk -l #新磁盘为/dev/sdb,截图是已经分区完成了. 2.进入分区界面 >fdisk /dev/s ...

  10. 【解决】HDFS HA无法自动切换问题

    [解决]HDFS HA无法自动切换问题 原因: 最早设置为root互相登录,可是zkfc服务是hdfs账号运行的,没有权限访问到root的id_rsa文件.更改为hdfs账号免密钥登录恢复正常.   ...