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第一个示例

第一步:引入thrift依赖包compile group: 'org.apache.thrift', name: 'libthrift', version: '0.9.3'第二步:创建配置文件Hell...
  • u010397369
  • u010397369
  • 2017年05月04日 15:38
  • 307

Thrift入门及Java实例演示

目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java)  thrift生成...
  • liuxilil
  • liuxilil
  • 2017年02月08日 11:02
  • 432

Windows下QT使用Thrift的样例

  • 2017年08月23日 15:29
  • 9.51MB
  • 下载

linux下,qt creator + thrift + qwt安装与部署

一.部署qt creator环境 1.下载qt源文件:qt-opensource-linux-x64-5.2.1.run,安装。 2.打开qt creator,会发现,没有反应。解决方法:用程序包...
  • u010875632
  • u010875632
  • 2014年07月09日 13:41
  • 861

dubbo_rpc包中thrift协议的使用过程

今天学习的是rpc包中的thrift协议的使用过程,以下是简单的调用步骤,在这里记录一下并做了点简单的说明。 1、首先初始化Protocol类 Protocol protocol = Extens...
  • qiaojiahe
  • qiaojiahe
  • 2015年10月21日 11:05
  • 1925

Thrift在Android上的客户端实现

Thrift在Android平台的客户端实现 RPC在Android平台的应用
  • YoungHong1992
  • YoungHong1992
  • 2017年06月26日 17:42
  • 689

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

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

Thrift下Java客户端与服务器端的开发

1创建Thrift文件 Thrift文件与编程语言无关,用于定义数据类型和服务接口,然后生成用来构建RPC客户和服务器所需的全部代码。 1.1编写testJava.thrift [html]...
  • z69183787
  • z69183787
  • 2016年05月06日 17:12
  • 1449

由浅入深了解Thrift(三)——Thrift server端的几种工作模式分析

http://blog.csdn.net/houjixin/article/details/42779915 五、  Thrift服务器端几种工作模式分析与总结 Thrift为...
  • sunmenggmail
  • sunmenggmail
  • 2015年07月09日 16:05
  • 13107

Apache Thrift设计概要

Apache Thrift设计概要 1. Overview Apache Thrift 的可赞之处是实现了跨超多语言(Java, C++, Go, Python,R...
  • chenglinhust
  • chenglinhust
  • 2015年07月24日 00:54
  • 632
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:thrift使用实例
举报原因:
原因补充:

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