`
mj4d
  • 浏览: 302896 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

thrift:简单入门

    博客分类:
  • rpc
阅读更多

一、什么是thrift

Thrift的官网http://thrift.apache.org/download/。Thrift是由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势

 

二、安装

这里是windows下的安装过程

1、下载

主页下载最新的release包https://dist.apache.org/repos/dist/release/thrift/0.9.0/thrift-0.9.0.tar.gz

和windows下的编译文件,该文件负责将idl文件编译成各种语言的代码:https://dist.apache.org/repos/dist/release/thrift/0.9.0/thrift-0.9.0.exe

 

2、作为java的实现语言

如果是maven管理需要加入依赖:

<dependency>
  <groupId>org.apache.thrift</groupId>
  <artifactId>libthrift</artifactId>
  <version>0.9.0</version>
</dependency>

 

3、作为python的实现语言

在windows下需要语言安装python是必须的,同时需要有安装模块的工具,这里用setuptools:根据具体的平台找到相应的工具,这里用:http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11.win32-py2.7.exe#md5=57e1e64f6b7c7f1d2eddfc9746bbaf20下载后安装,将python安装目录下的script设置为windows的PATH变量,如

 接下来进入到解压后thrift的release包目录,如F:\thrift\thrift-0.9.0\lib\py,在命令控制台运行:

setup.py install

 即完成了安装

 

三、简单的实例

根据IDL语言编写thrift的描述文件Hello.thrift

namespace java org.java.codelib.thrift.sample

service Hello {
	i32 add(1:i32 para1, 2:i32 para2),
	void sayHello(1:string name);
}
  • 其中namespace指明了包结构,这里会生成的java包为org.java.codelib.thrift.sample
  • service相当于java中的接口描述,会将Hello生成具体语言的接口
  • add和sayHello声明了两个方法:其中add接收两个参数并返回结果,而sayHello接收string类型的参数,这里的参数类型string、i32等与java中的String、int类似

利用thrift-0.9.0.exe文件编译成java实现代码:

thrift-0.9.0.exe --gen java Hello.thrift

这样在目录下生成了gen-java的文件夹,包含了java的实现代码Hello.java

接下来需要实现Hello.java文件中的Hello.Iface 接口:

public class HelloImpl implements Hello.Iface {

    @Override
    public int add(int para1, int para2) throws TException {
        return para1 + para2;
    }

    @Override
    public void sayHello(String name) throws TException {
        System.out.println("Hello Thrift From " + name);
    }

}

 创建服务端代码:

public class HelloServiceServer {

    /**
     * @param args
     * @author Administrator
     * @date 2013-1-26
     */
    public static void main(String[] args) {
        try {
            // 设置服务端口为 7911 
            TServerSocket serverTransport = new TServerSocket(7911);
            // 设置协议工厂为 TBinaryProtocol.Factory 
            Factory proFactory = new TBinaryProtocol.Factory(true, true);
            // 关联处理器与 Hello 服务的实现
            Hello.Processor<HelloImpl> processor = new Hello.Processor<HelloImpl>(new HelloImpl());

            Args arg = new Args(serverTransport);
            arg.processor(processor);
            arg.protocolFactory(proFactory);
            TServer server = new TSimpleServer(arg);
            server.serve();
            System.out.println("Start server on port 7911...");
        } catch (TTransportException e) {
            e.printStackTrace();
        }
    }

}

 下面是客户端的代码:

public class HelloServiceClient {

    /**
     * @param args
     * @author Administrator
     * @date 2013-1-26
     */
    public static void main(String[] args) {
        TTransport transport;
        try {
            transport = new TSocket("localhost", 7911);
            TProtocol protocol = new TBinaryProtocol(transport);
            Hello.Client client = new Hello.Client(protocol);
            transport.open();
            System.out.println(client.add(12, 20));
            client.sayHello("robin");
            transport.close();
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
    }

}

 先运行服务端的代码,再运行客户端就可以在控制台看到相应的输出。这样就完成了一个thrift的简单实例

 

四、Thrift架构简介

 这是thrift的架构图:

 

  • 黄色部分是用户实现的业务逻辑,
  • 褐色部分是根据Thrift 定义的服务接口描述文件生成的客户端和服务器端代码框架,
  • 红色部分是根据Thrift 文件生成代码实现数据的读写操作。
  • 红色部分以下是 Thrift 的传输体系、协议以及底层 I/O 通信,使用 Thrift 可以很方便的定义一个服务并且选择不同的传输协议和传输层而不用重新生成代码

下面是thrift的网络协议栈:

+-------------------------------------------+
  | Server                                    |
  | (single-threaded, event-driven etc)       |
  +-------------------------------------------+
  | Processor                                 |
  | (compiler generated)                      |
  +-------------------------------------------+
  | Protocol                                  |
  | (JSON, compact etc)                       |
  +-------------------------------------------+
  | Transport                                 |
  | (raw TCP, HTTP etc)                       |
  +-------------------------------------------+
从上面可以看到,主要包括几个部分:
Transport 

常见的传输层有

TSocket —— 使用阻塞式 I/O 进行传输,是最常见的模式

TNonblockingTransport —— 使用非阻塞方式用于构建异步客户端

TNonblockingServerTransport serverTransport = new TNonblockingServerSocket(10005);
TCompactProtocol.Factory proFactory = new TCompactProtocol.Factory();
Hello.Processor<HelloImpl> processor = new Hello.Processor<HelloImpl>(new HelloImpl());

Args args = new org.apache.thrift.server.TNonblockingServer.Args(serverTransport);
args.processor(processor);
args.protocolFactory(proFactory);

TServer server = new TNonblockingServer(args);
System.out.println("Start server on port 10005 ...");
server.serve();

 

TFramedTransport —— 使用非阻塞方式按块的大小进行传输类似于 Java 中的 NIO。若使用 TFramedTransport 传输层,其服务器必须修改为非阻塞的服务类型。如服务端采用TnonblockingTransport见上面的代码,下面是客户端的写法:

TTransport transport = new TFramedTransport(new TSocket("localhost", 10005));
TProtocol protocol = new TBinaryProtocol(transport);

Hello.Client client = new Hello.Client(protocol);
transport.open();
client.add(12, 20);
client.sayHello("robin");
transport.close();

 

 

Protocol

协议定义了内存和网络传输格式之间的映射,也可理解为不同传输结构见的解码和编码的约定。在thrift中常用的有JSON, XML, plain text, compact binary 等。

1、  binary: 相当简单的二进制编码:将filed和对应的value合并在一起简单的二进制编码TBinaryProtocol

Server

// 设置协议工厂为 TBinaryProtocol.Factory 
Factory proFactory = new TBinaryProtocol.Factory(true, true);

Client

 

TProtocol protocol = new TBinaryProtocol(transport);

 

2、  compacthttps://issues.apache.org/jira/browse/THRIFT-110高效率的、密集的二进制编码格式进行数据传输

server

TCompactProtocol.Factory proFactory = new TCompactProtocol.Factory();

Client

TCompactProtocol protocol = new TCompactProtocol(transport);

 

3、  json

TJSONProtocol 使用 JSON 的数据编码协议进行数据传输与上面的一样:

TJSONProtocol.Factory proFactory = new TJSONProtocol.Factory();
TJSONProtocol protocol = new TJSONProtocol(transport);

Processor

一个Processor类似一个管道,主要处理输入输出流。在thrift中输入、输出流由Protocol对象来表示,Processor接口非常简单:

 

interface TProcessor {
    bool process(TProtocol in, TProtocol out) throws TException
}

 

Thrift服务的特定processor的实现在编译时(生成具体语言的代理实现)生成。Processor主要的流程是读取网络中传送的输入流,处理读取的stream(用户实现的handler)并将相应结构返回给调用方

Server

一个服务就是讲上述几个特性整合起来,具体的描述如下:

  • Create a transport
  • Create input/output protocols for the transport
  • Create a processor based on the input/output protocols
  • Wait for incoming connections and hand them off to the processor

 

 

分享到:
评论

相关推荐

    go-thrift:快速入门节俭

    一个简单的节俭文件。 一种服务扩展了另一种服务,并且存在异常。 目的是在尽可能小的空间内呈现出许多深奥的案例。 产生节俭服务 注意main.go顶部的//go:generate语句。 这是使用go generate运行的,并将为我们定义...

    thrift初级入门教程

    ### Thrift初级入门教程 #### 一、简介 Thrift 是由 Facebook 开发的一款软件库和一组代码生成工具,旨在加速高效且可扩展的后端服务的开发与实现。通过抽象出不同编程语言中最常用的部分,并将其封装进一个通用库...

    thrift入门学习教程

    ### Thrift入门学习教程 #### 一、Thrift概述 Thrift是由Facebook开发并在2007年贡献给Apache基金会的一款开源项目。它的主要目的是解决跨平台、跨语言的系统间大数据量传输通信问题。在早期,Facebook面临着系统...

    thrift开发入门java程序

    Thrift作为可伸缩的跨语言服务开发框架,网上的资源较少,这里是一个简单的入门小程序,文件中的mylib下包含了依赖的jar包,并且在file目录下放了一个简单的thrift文件和生成thrift-0.9.0.exe工具,直接使用 thrift-...

    thrift入门简介共22页.pdf.zip

    Thrift的目标是高效、简单、可扩展,适用于构建大型分布式系统中的服务通信。 在Thrift的核心概念中,主要有以下几个关键点: 1. **IDL(Interface Definition Language)**:Thrift使用自己的接口定义语言(IDL)...

    Thrift入门.docx

    1. TBinaryProtocol:简单易用的二进制格式,处理速度快,但不便于调试。 2. TCompactProtocol:紧凑的二进制格式,效率高且占用空间小。 3. TDebugProtocol:可读性高的文本格式,适用于调试。 4. TDenseProtocol:...

    Thrift入门简介

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

    Thrift入门及Java实例演示

    在"Thrift入门及Java实例演示"中,我们可以预期学习到以下核心知识点: 1. **Thrift IDL**:Thrift的接口定义语言类似于C++或Java的接口,用于定义服务、结构体、异常和枚举等。例如,你可以定义一个简单的服务,...

    thrift入门

    默认使用TBinaryProtocol,这是一种简单的二进制协议,适合高效的数据交换。 4. **服务模型**: Thrift提供了两种服务模型——阻塞式(Blocking)和服务端异步(Non-Blocking/Sync)。阻塞式服务在处理每个请求时...

    thrift开发入门,php客户端调用java服务方,实现跨语言调用

    压缩包分为三个部分,java工程(java的服务方,和java客户端) ...linux环境的服务方部署包以及脚本 其中myserver.tar.gz压缩包是linux环境的部署包, ...当然也可以直接导入java目录下的java工程,直接运行服务端更简单

    thrift样例操作实例

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

    C#使用Thrift2操作HBase数据库

    Thrift的编译器会生成客户端和服务端的代码,使得在C#中调用HBase服务变得简单。 接下来,为了在C#中使用Thrift2连接到HBase,你需要完成以下步骤: 1. **安装Thrift**: 首先,你需要在开发环境中安装Thrift工具,...

    Thrift的第一个例子

    通常,这样的博客文章会提供一个简单的Thrift入门教程,包括如何安装Thrift工具,定义Thrift IDL文件,以及如何生成和使用Java代码进行服务端和客户端的开发。 标签 "源码" 和 "工具" 提醒我们,Thrift涉及到编程...

    maven-thrift-client

    通过这种方式,`maven-thrift-client` 提供了一个快速入门的模板,帮助开发者高效地创建和管理基于 Thrift 的客户端应用程序。它使得在 Maven 项目中使用 Thrift 变得简单,降低了跨语言服务开发的门槛。

    Hadoop之Hbase从入门到精通.doc

    Hadoop之HBase从入门到精通 本文将详细介绍HBase技术,从基础概念到高级应用,旨在帮助读者快速掌握HBase技术。 一、HBase技术介绍 HBase是Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储...

    thrinatra:通过 Finatra、Spindle、Heroku 和 Bootstrap 使用 Thrift 和 Mongo 的简单 Scala Web 服务器模板

    特利纳特拉通过 Finatra、Spindle、Heroku 和 Bootstrap 使用 Thrift 和 Mongo 的简单 Scala Web 服务器模板入门 export THRINATRA_APP="thrinatra" # Put the name of your app heregit clone ...

    protobuf入门.pdf

    **protobuf入门知识点** protobuf,全称Protocol Buffers,是由Google开发的一种数据序列化协议,用于高效、跨平台地存储和传输结构化数据。它提供了一种语言中立、平台中立的方式来定义数据结构,可以将数据结构...

    hbase入门到精通

    ### HBase从入门到精通——关键技术点解析 #### 一、HBase技术概览 **HBase**(Hadoop Database)是一种分布式、可扩展的NoSQL数据库系统,它基于Google Bigtable论文的思想构建而成,并且作为Apache Hadoop生态...

    Hadoop之Hbase从入门到精通 .doc

    "Hadoop之Hbase从入门到精通" HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。HBase 是 Google Bigtable 的开源实现,类似 ...

    Hadoop之Hbase从入门到精通

    ### Hadoop之Hbase从入门到精通 #### HBase技术介绍与概述 HBase是一种分布式、高可靠性且高性能的列式存储系统,它基于Hadoop生态体系构建,并且能够支持大规模的数据存储需求。HBase的设计灵感来源于Google的...

Global site tag (gtag.js) - Google Analytics