Apache thrift 安装及使用

Posted 苏铭客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache thrift 安装及使用相关的知识,希望对你有一定的参考价值。

本篇介绍Apache thrift windows安装教程。

一.首先在Apache官网下载thrift 编译应用,戳这里下载 http://thrift.apache.org/download

    下载好windows 版本的exe文件。在c盘新建一个Thrift文件夹,将下载好的thrift-xxx.exe文件该名成 thrift.exe,放入Thrift文件夹中。

二.配置环境变量

    

 

 然后运行cmd命令,输入 thrift  -version。看到如下版本信息,则表示thrift 安装成功。

是不是很easy! 接下来就可以干正事了。

三.编写thrift脚本文件,生产对应语言的代码,此处我使用java作为案例。

namespace java com.zhj.thrift.server  // defines the namespace   

typedef i32 int  //typedefs to get convenient names for your types  
typedef i16 short
typedef i64 long

service HelloService{
    int add(1:int num1,2:int num2)
    short getShort(1:short value)
    long getLong(1:long value)
    string sayHello(1:string name)

}

保存该文件命名为:helloService.thrift。之后执行该文件会生成一个helloService接口的java代码.

四.找到上述文件的目录,执行该文件。执行后会在相同的目录下生成一个gen-java的包。里面就生产了helloService.java的一个类

五.新建一个Java 项目,将上述接口拷到项目中,并实现该接口。实现接口类如下:

package com.zhj.thrift.server.impl;

import org.apache.thrift.TException;
import com.zhj.thrift.server.HelloService;

public class HelloServiceImpl implements HelloService.Iface {

    @Override
    public int add(int num1, int num2) throws TException {
        return num1+num2;
    }

    @Override
    public short getShort(short value) throws TException {
        return (short) (value*2);
    }

    @Override
    public long getLong(long value) throws TException {
        Long l_value = value - 24*60*60*1000;
        return l_value;
    }

    @Override
    public String sayHello(String name) throws TException {
        return "hello " + name;
    }

}
View Code

需要引入三个jar包

libthrift-0.9.3 依赖包下载地址:http://repo1.maven.org/maven2/org/apache/thrift/libthrift/

 六.编写thrift服务端类,如下:

package com.zhj.thrift.server;

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;

import com.zhj.thrift.server.HelloService.Processor;
import com.zhj.thrift.server.impl.HelloServiceImpl;

public class HelloServiceServer {

    public static void main(String[] args) {
        try {
            // 设置服务器端口
            TServerSocket ts = new TServerSocket(9090);
            // 设置二进制协议工厂
            Factory protocolFactory = new TBinaryProtocol.Factory();
            //处理器关联业务实现
            Processor<HelloService.Iface> processor = new HelloService.Processor<HelloService.Iface>(new HelloServiceImpl());
            // 1. 使用单线程标准阻塞I/O模型
            TServer.Args simpleArgs = new TServer.Args(ts);
            simpleArgs.processor(processor);
            simpleArgs.protocolFactory(protocolFactory);
            TServer server = new TSimpleServer(simpleArgs);
            System.out.println("开启thrift服务器,监听端口:9090");
            server.serve();
            
             // 2. 使用线程池服务模型
           /* TThreadPoolServer.Args poolArgs = new TThreadPoolServer.Args(ts);
            poolArgs.processor(processor);
            poolArgs.protocolFactory(protocolFactory);
            TServer poolServer = new TThreadPoolServer(poolArgs);
            poolServer.serve();*/
           
        } catch (TTransportException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
View Code

七.编写thrift客户端类,如下:

package com.zhj.thrift.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;

import com.zhj.thrift.server.HelloService;

public class HelloServiceClient {

    public static void main(String[] args) {
        
        try {
            // 设置调用的服务地址-端口
            TTransport transport = new TSocket("127.0.0.1", 9090);
            //  使用二进制协议
            TProtocol protocol = new TBinaryProtocol(transport);
            // 使用的接口
            HelloService.Client client = new HelloService.Client(protocol);
            //打开socket
            transport.open();
            System.out.println("求和:"+client.add(100, 150));
            System.out.println(client.getLong(System.currentTimeMillis()));
            System.out.println(client.sayHello("李四"));
            System.out.println(client.getShort((short)10));
            
        } catch (TTransportException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
View Code

最后运行效果:

至此,简单的thrift服务发布和调用已实现,有不合理之处请小伙伴指点出来,thank you!

这篇只是简单介绍thrift客户端的调用的单向通信,接下来的文章将介绍thrift的双向通信,更贴近业务需求。

 

RSS:

Apache Thrift java版案例:http://thrift.apache.org/tutorial/java

Apache Thrift 详解:http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/

以上是关于Apache thrift 安装及使用的主要内容,如果未能解决你的问题,请参考以下文章

Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架

thrift的使用及遇到的问题

Apache Thrift学习之二(基础及原理)

Apache Thriftwindows下thrift的安装

Thrift框架-安装

Thrift框架-安装