先从一个简单的Hello Thrift开始了解Thrift的工作原理和流程。
Hello.thrift
声明了一个service Hello,它有一个方法 hello,参数是一个string,返回值也是一个String
namespace java com.whp.demo.thrift
service Hello {
string hello(1:string para)
}
编译生成Java模板代码
然后调用thrift生产java版本的模板代码(也可以称为胶水代码),会在当前目录下生产一个gen-java的目录,里面根据namespace生产对应package level的java文件:com.whp.demo.thrift.Hello.java
里面包含如下几个关键接口、类:
1.Iface:service的接口文件
2.AsyncIface: Iface的异步版本,需要传入一个Callback handler
3.Client:调用端的模板代码,它实现了Iface接口。它是调用服务端接口的桥梁。需要指定Protocol
4.Processor:service的代理类
5.AsyncProcessor: servcie的代理类的异步实现
6.TServer.Args:? 即Server的参数类。用于包装processor、protocol、transPort
可以看出模板代码封装了客端调用代码Client(同步和异步),服务器端Processor(同步和异步),IFace(同步和异步),服务器端初始化参数。
调用(Client)端?
初始化Transport(设置端口,timeout时间),Protocol(可以是binary,compact,json三种实现)。Client封装了服务接口的调用。
Transport transport =new TSocket("localhost",9898,30000);
TProtocol protocol =new TBinaryProtocol(transport);
Hello.Client client =new Hello.Client(protocol);
transport.open();
String result = client.hello("Thrift");
服务器(Server)端
包含server的模式: 可以Simple(单线程),TThreadPoorServer, TThreadedSelectorServer
以及processor, transport, protocol的设置
TProcessor tProcessor =new Hello.Processor(new HelloServiceImpl());
TServerSocket serverTransPort = new TServerSocket(9898);
TServer.Args tArgs =new TServer.Args(serverTransPort);
tArgs.processor(tProcessor);
tArgs.protocolFactory(new TBinaryProtocol.Factory());
TServer server =new TSimpleServer(tArgs);
server.serve();
关于Server,Processor,Protocol,Transport的层级关系可以参考初识Thrift。
例子代码在这里:MyThrift
接下来会分析不同的Server、Processor、Protocol对用场景