先從一個簡單的Hello Thrift開始了解Thrift的工作原理和流程祖搓。
Hello.thrift
聲明了一個service Hello,它有一個方法 hello湖苞,參數(shù)是一個string拯欧,返回值也是一個String
namespace java com.whp.demo.thrift
service Hello {
string hello(1:string para)
}
編譯生成Java模板代碼
然后調(diào)用thrift生產(chǎn)java版本的模板代碼(也可以稱為膠水代碼),會在當前目錄下生產(chǎn)一個gen-java的目錄财骨,里面根據(jù)namespace生產(chǎn)對應(yīng)package level的java文件:com.whp.demo.thrift.Hello.java
里面包含如下幾個關(guān)鍵接口镐作、類:
1.Iface:service的接口文件
2.AsyncIface: Iface的異步版本,需要傳入一個Callback handler
3.Client:調(diào)用端的模板代碼隆箩,它實現(xiàn)了Iface接口该贾。它是調(diào)用服務(wù)端接口的橋梁。需要指定Protocol
4.Processor:service的代理類
5.AsyncProcessor: servcie的代理類的異步實現(xiàn)
6.TServer.Args:? 即Server的參數(shù)類捌臊。用于包裝processor杨蛋、protocol、transPort
可以看出模板代碼封裝了客端調(diào)用代碼Client(同步和異步)理澎,服務(wù)器端Processor(同步和異步)逞力,IFace(同步和異步),服務(wù)器端初始化參數(shù)糠爬。
調(diào)用(Client)端?
初始化Transport(設(shè)置端口寇荧,timeout時間),Protocol(可以是binary执隧,compact砚亭,json三種實現(xiàn))。Client封裝了服務(wù)接口的調(diào)用殴玛。
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");
服務(wù)器(Server)端
包含server的模式: 可以Simple(單線程),TThreadPoorServer, TThreadedSelectorServer
以及processor, transport, protocol的設(shè)置
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();
關(guān)于Server添祸,Processor滚粟,Protocol,Transport的層級關(guān)系可以參考初識Thrift刃泌。
例子代碼在這里:MyThrift
接下來會分析不同的Server凡壤、Processor署尤、Protocol對用場景