`
gemantic
  • 浏览: 337471 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
一、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 文件
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
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
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!");
	}

}


php client
<?php
$GLOBALS['THRIFT_ROOT'] = '/home/tjiang/demo/thrift/lib/php/src';
require_once $GLOBALS['THRIFT_ROOT'].'/Thrift.php';
require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/THttpClient.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php';
include_once $GLOBALS['THRIFT_ROOT'].'/packages/TestThrift/TestThrift_types.php';
include_once $GLOBALS['THRIFT_ROOT'].'/packages/TestThrift/IndexNewsOperatorServices.php';
$data=array(
'id'=>'1',
'title'=>'demo-标题',
'content'=>'demo-内容',
'media_from'=>'hexun',
'author'=>'xiaodi667'
);
$thrif_server_url = '10.0.0.41';
$transport = new TSocket($thrif_server_url, 9813);
$transport->open();

$protocol = new TBinaryProtocol($transport);

$client= new IndexNewsOperatorServicesClient($protocol, $protocol);
$obj = new NewsModel($data);
$result = $client->indexNews($obj);

$transport->close();
?>



python client
#!/usr/bin/env python

#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#

import sys

from TestThrift.ttypes import NewsModel
from TestThrift.IndexNewsOperatorServices import Client

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

try:

  # Make socket
  transport = TSocket.TSocket('10.0.0.41', 9813)

  # Buffering is critical. Raw sockets are very slow
  transport = TTransport.TBufferedTransport(transport)

  # Wrap in a protocol
  protocol = TBinaryProtocol.TBinaryProtocol(transport)

  # Create a client to use the protocol encoder
  client = Client(protocol)

  # Connect!
  transport.open()

  client.deleteArtificiallyNews(123)
  
  newsModel=NewsModel()
  newsModel.id=123456
  newsModel.title="python Test"
  newsModel.content="client test  come from python";
  newsModel.media_from="xinhua08"
  
  client.indexNews(newsModel)
  
  #close
  transport.close()
except Thrift.TException, tx:
  print '%s' % (tx.message)


Csharp client
                TTransport transport = new TSocket("10.0.0.41", 9813);
                TProtocol protocol = new TBinaryProtocol(transport);
                IndexNewsOperatorServices.Client client = new IndexNewsOperatorServices.Client(protocol);

                transport.Open();
                NewsModel model = new NewsModel();
                model.Author = "jww";
                model.Title = "title";
                model.Content = "client   Come   From   CSharp";
                model.Id = 1;

                client.deleteArtificiallyNews(123);
                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++   .....




  • 大小: 66.3 KB
分享到:
评论
7 楼 L_Jackson 2016-07-22  
请问 这边有异步调用的例子吗
6 楼 string2020 2015-06-16  
代码看起来好乱
5 楼 loovejava 2015-05-01  
不错,对比挺好
4 楼 126top 2014-05-19  
3 楼 guochengduan 2011-10-19  
我要用flex调用thrift,,有那个哥给实现个加到thrift中去.
2 楼 biby 2011-10-19  
很好,加关注了,O(∩_∩)O~
1 楼 xiaodi667 2011-10-19  
绝对的好东西哟,居然有我的例子!

相关推荐

    通过thrift使用c++访问hbase

    下面将详细介绍如何在Linux和Windows系统上配置Thrift环境,以及如何使用C++通过Thrift访问HBase。 **一、Linux系统下Thrift安装** 1. **安装libevent**: 使用`./configure --prefix=/usr/local/libevent`配置,...

    Thrift架构介绍.docx

    它的核心在于使用接口定义语言(IDL)来定义远程过程调用(RPC)接口和数据类型,之后通过Thrift编译器生成对应多种编程语言的代码,这些代码负责实现RPC协议和传输层。 Thrift的整体架构分为四个主要层次: 1. **...

    thrift介绍与实践

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年设计并发布,后来成为Apache软件基金会的顶级项目。它旨在通过定义一种简单的接口定义语言(IDL)来解决分布式系统之间的通信问题,允许程序员在不同的...

    windows环境下thrift.exe的使用

    下面我们将详细介绍Thrift.exe的安装、使用以及相关的开发过程。 首先,我们需要获取Thrift的执行文件。在这个例子中,我们有两个版本的Thrift:thrift-0.9.0.exe和thrift-0.8.0.tar.gz。`.exe`文件是Windows下的可...

    thrift win7 安装与使用

    本文介绍如何在Windows环境下使用Visual Studio 2010进行Thrift的安装与使用。整个安装过程将绕过Cygwin或MinGW,仅依赖于Visual Studio 2010和从Thrift官网下载的源文件。适用于thrift-0.9.1.tar.gz和thrift-0.10.0...

    thrift环境配置方法

    为了使用 Thrift,需要配置好相关的环境,这篇文章将介绍 Thrift 环境配置的方法。 Thrift 环境配置的重要性 ------------------------- Thrift 是一个强大的 RPC 框架,但是在使用前需要配置好相关的环境。配置...

    thrift样例操作实例

    首先,`Thrift简介.docx`可能是关于Thrift的入门文档,介绍了Thrift的概念、特点和用途。Thrift的主要特点包括高效、类型安全以及支持多种编程语言,如Java、C++、Python等。它通过定义服务接口,使得不同语言之间...

    thrift介绍、各种server的比较、多接口服务实现

    Thrift 是一个高性能的跨语言服务开发框架,最初由 Facebook 开发并开源。它通过接口定义语言(IDL)来定义数据类型和服务,使得不同语言之间能够进行高效且可靠的通信。Thrift IDL 文件被编译成多种编程语言的代码...

    thrift环境搭建(内附thrift运行环境可执行程序、搭建说明文本)

    在本文中,我们将详细介绍如何搭建Thrift开发环境,并提供可执行程序和搭建说明文本。 1. **下载与安装** 首先,你需要从Thrift官方网站或Apache镜像站点下载适合你操作系统的最新版本的Thrift源代码包。解压后,...

    Thrift--JSClient

    1. **Thrift IDL**:介绍Thrift接口定义语言,它是如何定义服务接口和数据结构的,以及如何通过`thrift`编译器将这些定义转换为JavaScript代码。 2. **Thrift协议**:讲解Thrift的二进制传输协议,如何高效地序列化...

    thrift java build jar

    本文将详细介绍如何使用 Thrift 在 Java 环境下构建 `.jar` 文件,以便在不同的 Java 应用中使用 Thrift 生成的服务。 1. **安装 Thrift** 首先,你需要在本地安装 Thrift 编译器。访问 Thrift 官方网站...

    thrift vc2008版本静态库

    1. **Thrift 框架介绍**: - Thrift 是由Facebook开发并开源的,后来被Apache基金会接纳为顶级项目。 - 它最初设计用于解决内部系统间的大量数据通信问题,后来成为通用的RPC(远程过程调用)框架。 - Thrift ...

    linux下安装和测试thrift

    下面将详细介绍在Linux系统中如何安装和测试Thrift。 首先,确保你的Linux系统已经更新到最新版本,这可以通过运行`sudo apt-get update`(Ubuntu/Debian)或`yum update`(CentOS/RHEL)来完成。接下来,我们需要...

    Thrift入门简介

    通俗简单的介绍了什么是thrift,适用于thrift或RPC扫盲。

    thrift初级入门教程

    ### Thrift初级入门教程 #### 一、简介 Thrift 是由 Facebook 开发的一款软件库和一组代码...通过上述详细介绍,我们可以看到 Thrift 在类型系统、传输、协议、版本控制等方面的优势,以及它在实际应用中的强大功能。

    python通过thrift访问hbase.docx

    下面,我们将介绍如何使用 Python 通过 Thrift 访问 HBase。 首先,我们需要了解 HBase 的表结构。HBase 的表结构主要包括行键(Row Key)、列族(Column Family)和时间戳三个部分。行键是 HBase 中每个单元格的...

Global site tag (gtag.js) - Google Analytics