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 是微 ...
随机推荐
- NOI2008 志愿者招募
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1859 Solved: 1169[Submit][Stat ...
- POJ 1062 昂贵的聘礼 解题报告
本题不难,但是笔者贡献了30多次Submit……就像Discuss讨论的一样,细节决定成败,WA了肯定有理由. 贴代码,Dijkstra+优先队列. #include <cstdio> # ...
- oracle的exp、imp命令
1.EXP a>完全模式 full=y EXP USER/PASSWORD@DB (AS ROLE) BUFFER=64000 FILE=C:\FULL.DMP FULL=Y b>用户模式 ...
- haproxy配置直接重定向url
在邮件列表看到有个人问haproxy能否在接到一个请求时选择一个后端服务器,然后301重定向url .主要原因是他有5个1G的出口,这样就能充分利用其带宽.测试了一下是可以的 frontend fre ...
- Using the Task Parallel Library (TPL) for Events
Using the Task Parallel Library (TPL) for Events The parallel tasks library was introduced with the ...
- NGINX(二)内存池
ngxin中为了加快内存分配的速度,引入了内存池, 大块申请, 减少分配次数, 小块分割, 极大的提高了内存申请速度, 另外一个用途就是省去了很多内存管理的任务,因为这里没有提供内存释放的功能,也就是 ...
- 万科北京区域V-learn发布 系V-LINK产品系中首批产品
继今年4月发布了V-LINK万科社区服务商2.0升级版本后,万科北京区域再次迎来了品牌大动作.近日,北京万科正式发布“V-LINK”产品系中的首批产品“V-learn”相关战略. 全品类教育模式 据介 ...
- 数据结构:二级指针与Stack的数组实现
[简介] Stack,栈结构,即传统的LIFO,后进先出,常用的实现方法有数组法和链表法两种.如果看过我上一篇文章<数据结构:二级指针与不含表头的单链表>,一定会看到其中的关键在于,利用v ...
- [转]ASP.NET MVC 入门5、View与ViewData
view在MVC模式中与用户进行最直接的接触,它负责数据的呈现.这里要注意一点就是,view只是负责数据的呈现,所以我们应该要尽量让view中不涉及业务逻辑的处理. 我们来添加一个Blog首页的vie ...
- ACM2030_机内码
/* 汉字统计 问题说明 统计给定文本文件中汉字的个数. 输入 输入文件首先包含一个整数Ñ,表示测试实例的个数,然后是Ñ段文本. 产量 对于每一段文本,输出其中的汉字的个数,每个测试实例的输出 ...