thrift使用实例

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值