Thirft

一、About thrift
二、什么是thrift,怎么工作?
三、Thrift IDL
四、Thrift Demo
五、Thrift 协议栈 以及各层的使用(java 为例)
六、与protocolbuffer的区别

一、About thrift
thrift是一种可伸缩的跨语言服务的发展软件框架。它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C + +,C#,Java,Python和PHP和Ruby结合。thrift是facebook开发的,我们现在把它作为开源软件使用。thrift允许你定 义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言(来自百度百 科)。

最初由facebook开发用做系统内个语言之间的RPC通信 。
2007年由facebook贡献到apache基金 ,现在是apache下的opensource之一 。
支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务 ,跨越语言的C/S rpc 调用 。

二、什么是thrift,怎么工作?

java rmi的例子,代码见附件,建立一个java rmi的流程 :

定义一个服务调用接口 。
server端:接口实现---impl的实例---注册该服务实现(端口)---启动服务。
client端:通过ip、端口、服务名,得到服务,通过接口来调用 。
rmi数据传输方式:java对象序列化 。

Thrift 服务

例同rmi ,需要定义通信接口、实现、注册服务、绑定端口……
如何多种语言之间通信 ?
数据传输走socket(多种语言均支持),数据再以特定的格式(String ),发送,接收方语言解析 。
Object ---> String ---> Object 。

问题:编码、解析完全需要自己做 ,复杂的数据结构会编码困难 .

Thrift 服务 :thrift的中间编码层

java Object ---> Thrift Object ---> php Object
定义thrift的文件 ,由thrift文件(IDL)生成 双方语言的接口、model ,在生成的model以及接口中会有解码编码的代码 。
thrift 文件例子
thrift-0.7.0.exe -r -gen java TestThrift.thrift 生成java 代码
thrift-0.7.0.exe -r -gen php TestThrift.thrift 生成php代码
thrift-0.7.0.exe -r -gen py TestThrift.thrift 生成python代码
thrift-0.7.0.exe -r -gen as3 TestThrift.thrift 生成as3代码
thrift-0.7.0.exe -r -gen cpp TestThrift.thrift 生成C++代码

三、Thrift IDL

   http://www.cnblogs.com/tianhuilove/archive/2011/09/05/2167669.html

   http://wiki.apache.org/thrift/
      
   http://wiki.apache.org/thrift/ThriftTypes

四、Thrift Demo
Thrift IDL 文件
Java代码

namespace java com.gemantic.analyse.thrift.index  
  
struct  NewsModel{  
1:i32 id ;  
2:string title;  
3:string content;  
4:string media_from;  
5:string author;  
}  
  
service IndexNewsOperatorServices {  
bool indexNews(1:NewsModel indexNews),  
bool deleteArtificiallyNews(1:i32 id )  
}  

java  server
Java代码  

package com.gemantic.analyse.thrift.index;  
  
import java.net.InetSocketAddress;  
  
import org.apache.thrift.protocol.TBinaryProtocol;  
import org.apache.thrift.server.TServer;  
import org.apache.thrift.server.TThreadPoolServer;  
import org.apache.thrift.server.TThreadPoolServer.Args;  
import org.apache.thrift.transport.TServerSocket;  
import org.apache.thrift.transport.TServerTransport;  
import org.apache.thrift.transport.TTransportFactory;  
  
public class ThriftServerTest {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        IndexNewsOperatorServices.Processor processor = new IndexNewsOperatorServices.Processor(new IndexNewsOperatorServicesImpl());  
        try{  
            TServerTransport serverTransport = new TServerSocket( new InetSocketAddress("0.0.0.0",9813));  
            Args trArgs=new Args(serverTransport);  
            trArgs.processor(processor);  
            //使用二进制来编码应用层的数据  
            trArgs.protocolFactory(new TBinaryProtocol.Factory(true, true));  
            //使用普通的socket来传输数据  
            trArgs.transportFactory(new TTransportFactory());  
            TServer server = new TThreadPoolServer(trArgs);  
            System.out.println("server begin ......................");  
            server.serve();  
            System.out.println("---------------------------------------");  
            server.stop();  
        }catch(Exception e){  
            throw new RuntimeException("index thrift server start failed!!"+"/n"+e.getMessage());  
        }  
    }  
  
}  
java client
Java代码  

package com.gemantic.analyse.thrift.index;  
  
import org.apache.thrift.TException;  
import org.apache.thrift.protocol.TBinaryProtocol;  
import org.apache.thrift.protocol.TProtocol;  
import org.apache.thrift.transport.TSocket;  
import org.apache.thrift.transport.TTransport;  
  
public class ThriftClientTest {  
  
    /** 
     * @param args 
     * @throws TException  
     */  
    public static void main(String[] args) throws TException {  
        // TODO Auto-generated method stub  
        TTransport transport = new TSocket("10.0.0.41", 9813);  
        long start=System.currentTimeMillis();  
//      TTransport transport = new TSocket("218.11.178.110",9090);  
        TProtocol protocol = new TBinaryProtocol(transport);  
        IndexNewsOperatorServices.Client client=new IndexNewsOperatorServices.Client(protocol);  
        transport.open();  
  
          
        client.deleteArtificiallyNews(123456);  
        NewsModel newsModel=new NewsModel();  
        newsModel.setId(789456);  
        newsModel.setTitle("this from java client");  
        newsModel.setContent(" 世界杯比赛前,由于塞尔维亚和黑山突然宣布分裂,国际足联开会决定剔除塞黑,由世界上球迷最多的国家顶替,名额恰巧来到中国。举国上下一片欢腾,中国足协决定由“成世铎”(成龙+阎世铎)组队,进军世界杯。");  
        newsModel.setAuthor("ddc");  
        newsModel.setMedia_from("新华08");  
        client.indexNews(newsModel);  
        transport.close();  
        System.out.println((System.currentTimeMillis()-start));  
        System.out.println("client sucess!");  
    }  
  
}  

五、Thrift 协议栈 以及各层的使用(java 为例)

thirft.png

1、model interface
服务的调用接口以及接口参数model、返回值model
2、Tprotocol 协议层
将数据(model)编码 、解码 。
3、Ttramsport 传输层
编码后的数据传输(简单socket、http)
5、Tserver
服务的Tserver类型,实现了几种rpc调用(单线程、多线程、非阻塞IO)

六、与protocolbuffer的区别
http://liuchangit.com/development/346.html

http://stackoverflow.com/questions/69316/biggest-differences-of-thrift-vs-protocol-buffers

区别:

  • 1、Another important difference are the languages supported by default. protobuf: Java, C++, Python Thrift: Java, C++, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, Ocaml
    支持语言不同,thrift支持着更多的语言 。
  • 2、Thrift supports ‘exceptions 。
    thrift支持服务的异常 。
  • 3、Protocol Buffers much easier to read 。Protobuf API looks cleaner, though the generated classes are all packed as an inner classes which is not so nice.
    Protocol Buffers 在文档方面比thrift丰富,而且比thrift简单 。
  • 4、Protobuf serialized objects are about 30% smaller then Thrift.
    Protocol Buffers在序列化/反序列化、传输上性能更优 。
  • 5、RPC is another key difference. Thrift generates code to implement RPC clients and servers wheres Protocol Buffers seems mostly designed as a data-interchange format alone.
    thrift提供了一套完整的rpc服务实现(多线程socket、非阻塞的socket....)
  • 6、And according to the wiki the Thrift runtime doesn't run on Windows.
    thrift 对有些语言在windows上不支持:C++ .....
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容