thrift 笔记

Thrift IDL

Thrift IDL ( Thrift interface description language )是 Thrift 用来定义 Thrift 在传输过程中的实体以及接口的描述语言。

本次 HelloWorld 要定义两个实体,一个是 User 实体,另外一个是 Car 实体,以及一个 UserService 接口。具体 IDL 如下:

namespace java com.mizhichashao.test.testthrift.thrift

/**
 * Car 实体
 */
struct Car {
    1:i64 id;
    2:string name;
}

/**
 * User 实体
 */
struct User {
    1:i64 id;
    2:bool isVip;
    3:string username;
    4:Car car;
}

/**
 * UserService
 */
service UserService {
    User getUserById(1:i64 id);
    Car getCarById(1:i64 id);
}

定义好 IDL,要下载 Thrift 编译器,下载完改名为 thrift.exe(个人习惯原因),并且放到path或者当前目录中。

输入:

thrift -gen java userService.thrift

然后该目录下就会有一个 gen-java 目录,里面有生成的 Thrift 代码(一个有三个类:User.java、Car.java、UserService.java)。

因为生成的 Thrift 代码包含了大量的 Thrift 逻辑代码,所以在这里就不展示了,在这里贴一些 UserService 的代码片段:

public class UserService {

  public interface Iface {

    public User getUserById(long id) throws org.apache.thrift.TException;

    public Car getCarById(long id) throws org.apache.thrift.TException;

  }

  public interface AsyncIface {

    public void getUserById(long id, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;

    public void getCarById(long id, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;

  }
 
  ...
 
}

这两个内部接口分别是 UserService 的同步和异步接口定义。我们在此例中,主要实现的是同步接口。

links