thrift使用实例

来源:互联网 发布:arm单片机仿真软件 编辑:程序博客网 时间:2024/05/02 14:07

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.jarcommons-logging-1.1.1.jarhttpclient-4.2.5.jarhttpcore-4.2.4.jarlibthrift-0.9.2.jarlibthrift-0.9.2-javadoc.jarlog4j-1.2.17.jarservlet-api-2.5.jarslf4j-api-1.5.8.jarslf4j-api-1.7.7.jarslf4j-log4j12-1.7.7.jarslf4j-log4j12-1.7.7-javadoc.jarslf4j-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://thrift.apache.org/tutorial/java


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

0 0
原创粉丝点击