RPC框架之Thrift
目前流行的服务调用方式有很多种,例如基于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的更多相关文章
- rpc框架之 thrift连接池实现
接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...
- rpc框架之 thrift 学习 1 - 安装 及 hello world
thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.or ...
- RPC框架之Thrift分析(转)
一.简介 1.Thrift是Facebook开发的跨语言的RPC服务框架.随后贡献给Apache开源组织.成为RPC服务的主流框架. 2.特点: 优点: 跨语言,支持java.c/c ...
- rpc框架之 thrift 学习 2 - 基本概念
thrift的基本构架: 上图源自:http://jnb.ociweb.com/jnb/jnbJun2009.html 底层Underlying I/O以上的部分,都是由thrift编译器生成的代码, ...
- 开源RPC(gRPC/Thrift)框架性能评测
海量互联网业务系统只能依赖分布式架构来解决,而分布式开发的基石则是RPC:本文主要针对两个开源的RPC框架(gRPC. Apache Thrift),以及配合GoLang.C++两个开发语言进行性能对 ...
- Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架
本文首先介绍了什么是Apache Thrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thri ...
- 微博轻量级RPC框架Motan
Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...
- 一个简单的"RPC框架"代码分析
0,服务接口定义---Echo.java /* * 定义了服务器提供的服务类型 */ public interface Echo { public String echo(String string) ...
- 微博轻量级RPC框架Motan正式开源:支撑千亿调用
支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan. 微博轻量级RPC框架Motan正式开源 Motan 是微 ...
随机推荐
- bzoj1965
很明显,求方程x*2^m=L (mod n+1)的解(1<=x<=n) var n,m,l,x,y,p:int64; function quick(x:int64):int64; var ...
- bzoj3144
最小割解决最优值最突出的特点就是要将对象划分到两个集合中这题很明显,裸的最小割先把点连成一根根柱子,就是p(x,y,k)-->p(x,y,k+1)流量是P(x,y,k+1)的不和谐值然后s与p( ...
- 教程 打造OS X Mavericks原版 EFI Clover 引导安装
自从 Mavericks 10.9 发布DP版到现在的GM版以来,以前Clover引导原版InstallESD.dmg方式安装原版的方法已经不能使用,而且已经不能引导安装了,所以从GM版发布以前,终于 ...
- 用JavaScript(js)对时间格式化
Date.prototype.format =function(format) { var o = { "M+" : (this.getMo ...
- sharepoint2010网站根据权限隐藏ribbon
转:http://www.it165.net/design/html/201302/1734.html 项目要求让普通用户看不到"网站操作",为了解决该问题,我找了好几篇博客,但都 ...
- Red5 1.0.5安装过程记录
Red5从旧的服务器切换到了github上后,截至20150702仍未更新文档.为了搭建Red5开发环境,我像无头苍蝇一样乱转了很多博客和StackOverflow.藉此记录这次安装过程,希望能够帮助 ...
- HDU FatMouse's Speed 基本DP
题意:要求找到的体重递增,速度递减的老鼠,并且输出最长的长度数,而且输出各自的序列数.Special Judge 思路:先按体重由小到大排序,再找最长速度递减序列. 转移方程:mou[i].w> ...
- WCF入门到精通(二)——契约
第一次接触WCF,如有写的不对的地方有望大家指出来,谢谢!! 本篇文章主要说下WCF中的契约的种类.契约的种类.如何定义契约等内容. 契约是一种双边或多边的协议,是利益相关方就某个问题达成的一种共识, ...
- Laravel Quickstart
Installation Via Laravel Installer First, download the Laravel installer using Composer. composer gl ...
- 使用sessionStorage得一个坑
1.首先sessionStorage.setItem("isMybill" false) 2.使用的时候 sessionStorage.getItem('isMybill') / ...