目前流行的服务调用方式有很多种,例如基于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. 操作系统杂谈 mac 和linux windows若干概念

    Mac: vmware 安装:1.方式一通过FreeBSD方式用 darwin.iso引导加载dmg安装 2.通过制作cdr /iso  vmware安装mac插件 mac有 macpe 使用open ...

  2. js 获取服务器控件

    大致是HtmlControl被服务器发送到页面ID不变,比如<div id="a" runat="sever"></div> WebCo ...

  3. c语言时间库函数#include<time.h>

    日期与时间函数<time.h> 头文件<time.h>中说明了一些用于处理日期和时间的类型和函数.其中的一部分函数用于处理当地时间,因为时区等原因,当地时间与日历时间可能不相同 ...

  4. C#使用SOAP调用Web Service

    程序代码 using System;using System.IO;using System.Net;using System.Text; namespace ConsoleApplication1{ ...

  5. import project后,出现Unable to get system library for the project

    import project 后,出现Unable to get system library for the project. 这是因为在import 一个项目的时候,没有指定android sdk ...

  6. aspx页面记住密码

    界面 点击登录按钮的代码 protected void btnLogin_Click(object sender, EventArgs e) { if (remember_long.Checked) ...

  7. 用Oracle的TRIM函数去除字符串首尾指定字符

    去掉首尾空格 SELECT TRIM(' abc '), ltrim(' abc '), rtrim(' abc ') FROM dual; 去掉首尾的其他字符 SELECT /*TRIM(';a;b ...

  8. libcurl断点下载

    开发需要写了一个处理curl 下载的c++类,内含有多个静态方法和实例方法,写在这里留给有需求的同学 头文件 CURLHelper.h enum CURLHelperStateType { CURLH ...

  9. 安装protobuf及相关的lua生成器

    1.google code 需要用到的水星:http://mercurial.selenic.com/ 2.protobuf地址 https://code.google.com/p/protobuf/ ...

  10. tool

    数据结构,堆栈基本原理; 数组,堆栈,结构体等系列,数据结构间区别联系; 在此我就不饶了,直接上大白话(我总认为干些实事,比扯淡强....),故事虚构,若有雷同,请你下方留言; ruiy讲的,所跑的托 ...