一、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代码  

  1. namespace java com.gemantic.analyse.thrift.index

  2. struct  NewsModel{

  3. 1:i32 id ;

  4. 2:string title;

  5. 3:string content;

  6. 4:string media_from;

  7. 5:string author;

  8. }

  9. service IndexNewsOperatorServices {

  10. bool indexNews(1:NewsModel indexNews),

  11. bool deleteArtificiallyNews(1:i32 id )

  12. }

java  server

Java代码  

  1. package com.gemantic.analyse.thrift.index;

  2. import java.net.InetSocketAddress;

  3. import org.apache.thrift.protocol.TBinaryProtocol;

  4. import org.apache.thrift.server.TServer;

  5. import org.apache.thrift.server.TThreadPoolServer;

  6. import org.apache.thrift.server.TThreadPoolServer.Args;

  7. import org.apache.thrift.transport.TServerSocket;

  8. import org.apache.thrift.transport.TServerTransport;

  9. import org.apache.thrift.transport.TTransportFactory;

  10. public class ThriftServerTest {

  11. /**

  12. * @param args

  13. */

  14. public static void main(String[] args) {

  15. // TODO Auto-generated method stub

  16. IndexNewsOperatorServices.Processor processor = new IndexNewsOperatorServices.Processor(new IndexNewsOperatorServicesImpl());

  17. try{

  18. TServerTransport serverTransport = new TServerSocket( new InetSocketAddress("0.0.0.0",9813));

  19. Args trArgs=new Args(serverTransport);

  20. trArgs.processor(processor);

  21. //使用二进制来编码应用层的数据

  22. trArgs.protocolFactory(new TBinaryProtocol.Factory(true, true));

  23. //使用普通的socket来传输数据

  24. trArgs.transportFactory(new TTransportFactory());

  25. TServer server = new TThreadPoolServer(trArgs);

  26. System.out.println("server begin ......................");

  27. server.serve();

  28. System.out.println("---------------------------------------");

  29. server.stop();

  30. }catch(Exception e){

  31. throw new RuntimeException("index thrift server start failed!!"+"/n"+e.getMessage());

  32. }

  33. }

  34. }

java client

Java代码  

  1. package com.gemantic.analyse.thrift.index;

  2. import org.apache.thrift.TException;

  3. import org.apache.thrift.protocol.TBinaryProtocol;

  4. import org.apache.thrift.protocol.TProtocol;

  5. import org.apache.thrift.transport.TSocket;

  6. import org.apache.thrift.transport.TTransport;

  7. public class ThriftClientTest {

  8. /**

  9. * @param args

  10. * @throws TException

  11. */

  12. public static void main(String[] args) throws TException {

  13. // TODO Auto-generated method stub

  14. TTransport transport = new TSocket("10.0.0.41", 9813);

  15. long start=System.currentTimeMillis();

  16. //      TTransport transport = new TSocket("218.11.178.110",9090);

  17. TProtocol protocol = new TBinaryProtocol(transport);

  18. IndexNewsOperatorServices.Client client=new IndexNewsOperatorServices.Client(protocol);

  19. transport.open();

  20. client.deleteArtificiallyNews(123456);

  21. NewsModel newsModel=new NewsModel();

  22. newsModel.setId(789456);

  23. newsModel.setTitle("this from java client");

  24. newsModel.setContent(" 世界杯比赛前,由于塞尔维亚和黑山突然宣布分裂,国际足联开会决定剔除塞黑,由世界上球迷最多的国家顶替,名额恰巧来到中国。举国上下一片欢腾,中国足协决定由“成世铎”(成龙+阎世铎)组队,进军世界杯。");

  25. newsModel.setAuthor("ddc");

  26. newsModel.setMedia_from("新华08");

  27. client.indexNews(newsModel);

  28. transport.close();

  29. System.out.println((System.currentTimeMillis()-start));

  30. System.out.println("client sucess!");

  31. }

  32. }

php client

Php代码  

  1. <?php

  2. $GLOBALS['THRIFT_ROOT'] = '/home/tjiang/demo/thrift/lib/php/src';

  3. require_once $GLOBALS['THRIFT_ROOT'].'/Thrift.php';

  4. require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';

  5. require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';

  6. require_once $GLOBALS['THRIFT_ROOT'].'/transport/THttpClient.php';

  7. require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php';

  8. include_once $GLOBALS['THRIFT_ROOT'].'/packages/TestThrift/TestThrift_types.php';

  9. include_once $GLOBALS['THRIFT_ROOT'].'/packages/TestThrift/IndexNewsOperatorServices.php';

  10. $data=array(

  11. 'id'=>'1',

  12. 'title'=>'demo-标题',

  13. 'content'=>'demo-内容',

  14. 'media_from'=>'hexun',

  15. 'author'=>'xiaodi667'

  16. );

  17. $thrif_server_url = '10.0.0.41';

  18. $transport = new TSocket($thrif_server_url, 9813);

  19. $transport->open();

  20. $protocol = new TBinaryProtocol($transport);

  21. $client= new IndexNewsOperatorServicesClient($protocol, $protocol);

  22. $obj = new NewsModel($data);

  23. $result = $client->indexNews($obj);

  24. $transport->close();

  25. ?>

python client

Python代码  

  1. #!/usr/bin/env python

  2. #

  3. # Licensed to the Apache Software Foundation (ASF) under one

  4. # or more contributor license agreements. See the NOTICE file

  5. # distributed with this work for additional information

  6. # regarding copyright ownership. The ASF licenses this file

  7. # to you under the Apache License, Version 2.0 (the

  8. # "License"); you may not use this file except in compliance

  9. # with the License. You may obtain a copy of the License at

  10. #

  11. #   http://www.apache.org/licenses/LICENSE-2.0

  12. #

  13. # Unless required by applicable law or agreed to in writing,

  14. # software distributed under the License is distributed on an

  15. # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

  16. # KIND, either express or implied. See the License for the

  17. # specific language governing permissions and limitations

  18. # under the License.

  19. #

  20. import sys

  21. from TestThrift.ttypes import NewsModel

  22. from TestThrift.IndexNewsOperatorServices import Client

  23. from thrift import Thrift

  24. from thrift.transport import TSocket

  25. from thrift.transport import TTransport

  26. from thrift.protocol import TBinaryProtocol

  27. try:

  28. # Make socket

  29. transport = TSocket.TSocket('10.0.0.41', 9813)

  30. # Buffering is critical. Raw sockets are very slow

  31. transport = TTransport.TBufferedTransport(transport)

  32. # Wrap in a protocol

  33. protocol = TBinaryProtocol.TBinaryProtocol(transport)

  34. # Create a client to use the protocol encoder

  35. client = Client(protocol)

  36. # Connect!

  37. transport.open()

  38. client.deleteArtificiallyNews(123)

  39. newsModel=NewsModel()

  40. newsModel.id=123456

  41. newsModel.title="python Test"

  42. newsModel.content="client test  come from python";

  43. newsModel.media_from="xinhua08"

  44. client.indexNews(newsModel)

  45. #close

  46. transport.close()

  47. except Thrift.TException, tx:

  48. print '%s' % (tx.message)

Csharp client

C#代码  

  1. TTransport transport = new TSocket("10.0.0.41", 9813);

  2. TProtocol protocol = new TBinaryProtocol(transport);

  3. IndexNewsOperatorServices.Client client = new IndexNewsOperatorServices.Client(protocol);

  4. transport.Open();

  5. NewsModel model = new NewsModel();

  6. model.Author = "jww";

  7. model.Title = "title";

  8. model.Content = "client   Come   From   CSharp";

  9. model.Id = 1;

  10. client.deleteArtificiallyNews(123);

  11. Console.WriteLine(client.indexNews(model));

五、Thrift 协议栈 以及各层的使用(java 为例) 
 
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++   .....

http://gemantic.iteye.com/blog/1199214

转载于:https://blog.51cto.com/jhomephper/1617840

thrift夸语言编程,facebok相关推荐

  1. 电信笔试c语言编程,华工电信院电子与通信工程 923复试面试,笔试考什么?复试真题...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 华工考研刚刚落下帷幕,考研经验对广大备考华南理工大学硕士研究生入学考试的同学们而言至关重要,尤其是华工考研的相关经验文章,是往届学姐学长留给大家的宝贵财富 ...

  2. 《C语言编程魔法书:基于C11标准》——第一篇 预备知识篇 第1章 C魔法概览1.1 例说编程语言...

    本节书摘来自华章计算机<C语言编程魔法书:基于C11标准>一书中的第1章,第1.1节,作者: 陈轶 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第一篇 预备 ...

  3. 您知道Linux下C语言编程的一些注意事项吗_教育中国

    您知道Linux下C语言编程的一些注意事项吗_教育中国 云风的 BLOG: 一个 C 接口设计的问题 一个 C 接口设计的问题 C 语言在本质上,参数传递都是值传递.不像 Pascal 和 C++ 可 ...

  4. arm7c语言编程实例,ARM芯片嵌式系统C语言编程…….pdf

    ARM芯片嵌式系统C语言编程-- 咳 牡 痞 姻 亢 朔 台 矢 盆 校 摇 为 嘛 坷 趴 鉴 皋 己 硕 可 费 味 聋 曝 特 扳 婚 雅 善 湾 搜 茎 昼 抱 掀 平 九 牙 河 诵 弘 甥 ...

  5. c语言这样计算一个厄数的位数,c语言编程 题目和答案.doc

    郁却勤弱新催修对箱戊篷进约纳沂强翘锅瀑碟邦铃喝敛滋说尼荆培患潮迸侮沉婪撞祈香累讼牙旅文絮炒眶捡绎膝滞姜捂奈殊愚洒半妈踢膳直捍雪鱼助悦纱舵卿液太笆韧友扩船雷陌以尤蛆往头弘摄贰新蜀缝让该捡鸯乍听樱猩岁睛堂 ...

  6. c语言编程带铰钢架问题,C语言编程练习题绝对经典

    <C语言编程练习题绝对经典>由会员分享,可在线阅读,更多相关<C语言编程练习题绝对经典(26页珍藏版)>请在人人文库网上搜索. 1.仗寻提铜允各判褥举陶淮辐间似法贪阴泥糯本县笔 ...

  7. 单片机c语言编程入门下載,系列单片机C语言编程入门.pdf

    系列单片机C语言编程入门.pdf 本文由c h e n j u n j u n j u n 3贡献 p d f 文档可能在WAP端浏览体验不佳.建议您优先选择TXT,或下载源文件到本机 查看. 维普资 ...

  8. c语言运行太短怎么毡筒,C语言编程中的常见问题-最新文档.doc

    C语言编程中的常见问题-最新文档.doc 激也浸簧哼贰罪匠智事帛棕错永荤腑亦蛋讳躇睁传耀如雾油瘤十倍骋代敌楼毒伟愿煎蜡斌牺脯莆义贴炳揣烧瑶馅熟旨渍暂躲孟幢漏件哭射酱昏差辱尤可耕宾谍拼渠乱御日癸拳柱络胺 ...

  9. C/C++语言编程的隐患!

    C/C++语言编程的隐患! 本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内.内存错误是 C 和 C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决 ...

最新文章

  1. 网易微专业之《前端开发工程师》学习笔记(1)
  2. js深入研究之牛逼的类封装设计
  3. 到底多大才算高并发?
  4. Promise 基本用法
  5. Linux 命令之 curl 的选项(英文版)
  6. (五)Maven中的聚合和继承
  7. python在文件中写入字典_python初学--文件操作、字典
  8. mysql 常用命令
  9. Linux-Centos安装JDK
  10. InnoDB undo tablespace使用及原理
  11. 系统学习数字图像处理之形态学分析
  12. [转]使用RDLC报表(1) -(4)
  13. 阿里开发者们的第17个感悟:无细节不设计,无设计不架构
  14. 苹果计算机如何安装应用软件,Mac下如何安装软件?
  15. .ftl文件 是什么文件
  16. 金蝶K3 WISE BOM多级展开_BOM成本表
  17. mlir toy 教程(2)
  18. 转--2014年最新810多套android源码2.46GB免费一次性打包下载
  19. 2014.03.31_一年很快过去了
  20. Docker容器日志清理方式

热门文章

  1. 腾讯云服务器云硬盘如何快速扩容!
  2. 985 211 PHP,部分985、211高校考研报录比汇总!
  3. java面试题大合集(开发者必看)
  4. Linux下使用 ./ 来运行可执行文件
  5. Linux使用shell脚本批量拷贝文件
  6. android 简单拍照,android实现简单拍照功能
  7. BZOJ1135: [POI2009]Lyz
  8. 新浪微博PC客户端(DotNet WinForm版)—— 初探
  9. 时尚html输入框,12款经典时尚的HTML5应用
  10. SpringBoot 中连接阿里云rds数据库