Thrift安装

安装环境: Ubuntu 14.04

  • 安装依赖
sudo apt-get install libboost1.54-all-dev libevent-dev g++ bison libssl-dev
  • 安装thrift

下载最新的gz包: https://thrift.apache.org/download 写文档时,最新的thrift包为 thrift-0.9.3.tar.gz

# 解压
tar -xvzf thrift-0.9.3.tar.gz

# 配置
./configure

# 安装
sudo make & make install

最后,命令行中输入 thrift 显示如下的结果,则安装成功!如果没有安装成功,请check一下配置和安装过程,是否有错误,根据具体的错误google一下

Usage: thrift [options] file

Use thrift -help for a list of options
简单使用

thrift一个比较大的优势就是支持各种语言之间的RPC通信,因此接下来演示使用JAVA开发 Thrift的服务端,ruby开发客户端进行RPC通信过程。

设计.thrift文件,内容如下:
service TestService {
  string serviceTest(1:string echoStr),
  i32 add(1:i32, 2:i32)
}
生成各个语言的接口
thrift --gen java --gen rb testService.thrift

执行以上命令后,就会在当前文件夹生成如下的目录接口

baseDir
  |_testService.thrift
  |_gen_java
    |_TestService.java
  |_gen_rb
    |_test_service.rb
    |_test_service_constants.rb
    |_test_service_types.rb
实现java服务端
  • 引入libthrift.jar包,直接拷贝该jar包到你的项目或使用maven
<dependency>
  <groupId>org.apache.thrift</groupId>
  <artifactId>libthrift</artifactId>
  <version>0.9.3</version>
</dependency>
  • 实现 TestService.Iface
import org.apache.thrift.TException;

public class TestServiceImpl implements TestService.Iface {
    @Override
    public String serviceTest(String echoStr) throws TException {
        return "the echoStr is: " + echoStr;
    }

    @Override
    public int add(int one, int two) {
        return one + two;
    }
}
  • 配置服务
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.TNonblockingServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;

public class ThriftServer {
    public void startServer(int port) {
        try {
            TProcessor tProcessor = new TestService.Processor(new TestServiceImpl());

            TNonblockingServerSocket tNonblockingServerSocket = new TNonblockingServerSocket(port);

            TNonblockingServer.Args tnbArgs = new TNonblockingServer.Args(tNonblockingServerSocket);

            tnbArgs.processor(tProcessor);

            tnbArgs.transportFactory(new TFramedTransport.Factory());
            tnbArgs.protocolFactory(new TCompactProtocol.Factory());

            TServer server = new TNonblockingServer(tnbArgs);
            server.serve();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ThriftServer thriftServer = new ThriftServer();
        thriftServer.startServer(6666);
    }
}

通过运行ThriftServer就可以启动RPC java服务了

ruby客户端调用
  • 安装thrift gem包
gem install thrift
  • ruby脚本调用JAVA RPC服务
    
    $:.push('../gen-rb')
    require 'thrift'
    require 'test_service'

port = ARGV[0] || 6666

host = "127.0.0.1"

transport = Thrift::FramedTransport.new(Thrift::Socket.new(host, port)) protocol = Thrift::CompactProtocol.new(transport) client = MakeCoffeeService::Client.new(protocol)

transport.open()

result = client.add(1, 2) p result

str = client.serviceTest('test') p str



运行这段ruby脚本就可以调用java 的RPC服务了

####### 附上thirft可定义的数据类型

     基本类型:

        bool:布尔值,true 或 false,对应 Java 的 boolean
        byte:8 位有符号整数,对应 Java 的 byte
        i16:16 位有符号整数,对应 Java 的 short
        i32:32 位有符号整数,对应 Java 的 int
        i64:64 位有符号整数,对应 Java 的 long
        double:64 位浮点数,对应 Java 的 double
        string:未知编码文本或二进制字符串,对应 Java 的 String

    结构体类型:
        struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
    容器类型:
        list:对应 Java 的 ArrayList
        set:对应 Java 的 HashSet
        map:对应 Java 的 HashMap
    异常类型:
        exception:对应 Java 的 Exception
    服务类型:
        service:对应服务的类