thrift使用实例

转载 2015年07月06日 17:57:26

thrift是一个RPC框架,最初由Facebook开发,后来移交apache组织管理。这里用thrift写了一个最简单的例子,服务器和客户端都用java,供大家参考。

0. 下载thrift

首先需要下载thrift编译器,它把thrift定义编译成对应语言。在thrift官网上有下载http://thrift.apache.org/download
这里我下载的是
Thrift compiler for Windows (thrift-0.9.2.exe)

1. 定义接口

test.thrift:

service TestService {
    void log(1:string text);

    i32 add(1:i32 a,2:i32 b);
}

总体上看,thrift接口定义文件与c++语言是比较类似的。有几点需要注意的说明一下:

  1. 接口都定义在service中
  2. 函数的参数需要标示出他们的位置,否则在生成代码时会有警告:
    No field key specified for text, resulting protocol may have conflicts or not be backwards compatible!
    
  3. thrift定义了一套类型系统:
    • bool: A boolean value (true or false)
    • byte: An 8-bit signed integer
    • i16: A 16-bit signed integer
    • i32: A 32-bit signed integer
    • i64: A 64-bit signed integer
    • double: A 64-bit floating point number
    • string: A text string encoded using UTF-8 encoding

2. 生成代码

thrift官方支持如下这些语言,你自己也可以让自己的语言支持thrift,官网有相关文档

  • Actionscript 3.0
  • C++
  • CSharp
  • D
  • Delphi
  • Go
  • Graphviz
  • Haxe Framework
  • Haskell
  • Java
  • Javascript
  • Node.js
  • OCaml
  • Perl
  • PHP
  • Python
  • Ruby

这里我使用的是java语言。在test.thrift的目录运行命令:

thrift -r --gen java test.thrift

就会在当前目录生成一个gen-java文件夹,其中有一个TestService.java

3. 下载thrift的java库

thrift对每个支持的语言都实现了支持库,官网上只提供了源码,需要自己编译,这里我们直接去maven仓库上下载。
这里推荐一个网站mvnrepository,可以搜索java库,而且有对应的maven,ant,gradle代码可以直接复制使用。
搜索thrift可以找到这个页面:
http://www.mvnrepository.com/artifact/org.apache.thrift/libthrift/0.9.2

可以写一个ant和ivy脚本:
build.xml:

<project xmlns:ivy="antlib:org.apache.ivy.ant" name="ThriftTest" default="resolve">
    <target name="resolve">
        <ivy:retrieve />
    </target>
</project>

ivy.xml:

<ivy-module version="2.0">
    <info organisation="" module="ThriftTest"/>
    <dependencies>
        <dependency org="org.apache.thrift" name="libthrift" rev="0.9.2"/>
        <dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.7"/>
    </dependencies>
</ivy-module>

在当前目录运行ant,就会在lib目录中下载thrift以及它所依赖的库。

commons-codec-1.6.jar
commons-logging-1.1.1.jar
httpclient-4.2.5.jar
httpcore-4.2.4.jar
libthrift-0.9.2.jar
libthrift-0.9.2-javadoc.jar
log4j-1.2.17.jar
servlet-api-2.5.jar
slf4j-api-1.5.8.jar
slf4j-api-1.7.7.jar
slf4j-log4j12-1.7.7.jar
slf4j-log4j12-1.7.7-javadoc.jar
slf4j-log4j12-1.7.7-sources.jar

注意一点:把slf4j-api-1.5.8.jar删掉,这里我们该用新版的sl4j

你也可以下载我打包的lib(下载地址)

4. 新建eclipse工程

新建eclipse工程,并把TestService.java复制进来,还有lib目录也复制进来。
在eclipse中刷新工程,点开lib目录,把所有jar加入build path:

5. 编写Handler类

你需要实现之前定义的接口,java语言中的做法是实现xxx.Iface,xxx是你定义的service名。

TestServiceHandler.java

import org.apache.thrift.TException;
public class TestServiceHandler implements TestService.Iface{

    @Override
    public void log(String text) throws TException {
        System.out.println(text);
    }

    @Override
    public int add(int a, int b) throws TException {
        return a+b;
    }
}

6. 编写Server

Server.java:

import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TServer.Args;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportException;

public class Server {

    public static void main(String[] args) {
        TestServiceHandler handler = new TestServiceHandler();
        TestService.Processor<TestServiceHandler> processor = new TestService.Processor<TestServiceHandler>(handler);

        try {
            TServerTransport serverTransport = new TServerSocket(8080);
            TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));

            server.serve();
        } catch (TTransportException e) {
            e.printStackTrace();
        }
    }
}

7. 编写Client

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;
import org.apache.thrift.transport.TTransportException;

public class Client {
    public static void main(String[] args) {
        TTransport transport = new TSocket("localhost", 8080);
        try {
            transport.open();
            TProtocol protocol = new TBinaryProtocol(transport);

            TestService.Client client = new TestService.Client(protocol);
            client.log("begin");
            System.out.println(client.add(1,2));

        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
    }
}

8. 运行

先运行Server,然后运行Client,可以看到Server的控制台输出begin,Client控制台输出3

参考资料

  • Apache Thrift - Java



转自:http://www.mushanblog.com/blog/thrift-demo

相关文章推荐

Thrift 实例 Helloworld

参考资料: thrift.apache.org http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ http://mingx...
  • hgd250
  • hgd250
  • 2012年12月13日 16:42
  • 7197

thrift一个例子

我用的是c++,所以我举一个c++的例子,简单说一下thrift的使用入门。例子描述是这样的:我们将学生信息(学号,姓名,性别,年龄)由客户端发送到服务端。实现这个例子,我们大致要做以下几部分事情:(...

Thrift 原理与使用实例

一、Thrift 框架介绍 1、前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言(ID...

Thrift入门及Java实例

一、概述 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang...

Intellij idea中gradle设置多源文件目录

问题描述Intellij idea开发工具来开发Java工程的时候,通常会使用ant、maven、groovy、gradle等工具来管理项目依赖。我在工程中使用了较新的gradle作为管理工具。但是在...
  • nisxiya
  • nisxiya
  • 2015年03月09日 10:16
  • 6210

thrift的enum:根据value取得name

今天看thrift生成的xxx_type.h文件时,看到关于enum的一个map(长的类似这样_XXX_VALUES_TO_NAMES),记录了值与字符串之间的关系。 它是干吗的?举个简单例子,假如...

thrift系列 - 快速入门

1.简介            Thrift是当前流行的RPC框架之一,它有强大的代码生成引擎,可以跨语言,轻松解决程序间的通信问题。 本文旨在帮助大家快速入门,若想深入原理,请参见thrift官网...
  • hrn1216
  • hrn1216
  • 2016年04月28日 15:47
  • 22540

thrift示例及性能测试

1     简介 Thrift是一个跨语言的服务部署框架,最初由facebook开发用做系统内各语言之间的RPC(Remote Procedure Call Protocol,远程过程调用协议通信),...

Eclipse 部署Thrift 实例 & 服务模型实例演示(java)

一:Eclipse 部署Thrift 实例   注:需要1:工具包thrift-0.9.0.ext (下载地址http://download.csdn.net/detail/xyw_eliot...

thrift java eclipse

1. 下载 thrift https://thrift.apache.org/download 我是windows环境 http://www.apache.org/dyn/closer.cgi?pat...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:thrift使用实例
举报原因:
原因补充:

(最多只允许输入30个字)