thrift 笔记

简单 Server

Thrift 是做 RPC 服务的,所以服务端基本上就是 Thrift 里面最重要的模块。

前一节我们通过 Thrift IDL 已经定义并且通过 Thrift 编译器已经生成好 Thrift 的 RPC 接口了。

在提供 RPC 服务前,先要实现该接口:

public class UserServiceImpl implements UserService.Iface {

    @Override
    public User getUserById(long id) throws org.apache.thrift.TException {
        User user = new User();
        user.setId(id);
        user.setUsername("DASHU");
        user.setIsVip(false);
        Car car = new Car();
        car.setId(id);
        car.setName("DASHU car");
        user.setCar(car);
        return user;
    }

    @Override
    public Car getCarById(long id) throws org.apache.thrift.TException {
        Car car = new Car();
        car.setId(id);
        car.setName("DASHU car");
        return car;
    }

}

有了接口实现,那么就可以开启 Thrift 服务了,下面是 Thrift 里面的一个 SimplaServer:

public class Server {

    public static void main(String[] args) throws TTransportException {
        // 新建处理接口
        TProcessor tprocessor = new UserService.Processor<UserService.Iface>(
                new UserServiceImpl());
        // 简单包装了 socket 的链接
        TServerSocket serverTransport = new TServerSocket(8989);
        // 服务器构造参数
        TServer.Args tArgs = new TServer.Args(serverTransport);
        tArgs.processor(tprocessor);
        tArgs.protocolFactory(new TBinaryProtocol.Factory());
        // 简单的单线程服务模型,一般用于测试
        TServer server = new TSimpleServer(tArgs);
        server.serve();
    }

}

代码一开始定义了一个处理器(TProcessor),该处理器是负责把 Thrift 的远程输入调用接口实现返回结果。

然后定义了传输通道(Transport)以及编码工厂(TBinaryProtocol)。这两个对象负责把入参和出参通过传输通道并且按照一定的编码来读取和输出。

最后开启一个简单的 ThriftServer(TSimpleServer)。

links