thrif开发指南
- 格式:docx
- 大小:106.19 KB
- 文档页数:8
一、About thrift
二、什么是thrift,怎么工作?
三、Thrift IDL
四、Thrift Demo
五、Thrift 协议栈以及各层的使用(java 为例)
六、与protocolbuffer的区别
一、About thrift
thrift是一种可伸缩的跨语言服务的发展软件框架。它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C + +,C#,Java,Python和PHP和Ruby结合。thrift是facebook开发的,我们现在把它作为开源软件使用。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言(来自百度百科)。
>>>最初由facebook开发用做系统内个语言之间的RPC通信。
>>>2007年由facebook贡献到apache基金,现在是apache下的opensource之一。
>>>支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务,跨越语言的C/S rpc 调用。
二、什么是thrift,怎么工作?
java rmi的例子,代码见附件,建立一个java rmi的流程 :
>>>定义一个服务调用接口。
>>>server端:接口实现---impl的实例---注册该服务实现(端口)---启动服务。
>>>client端:通过ip、端口、服务名,得到服务,通过接口来调用。
>>>rmi数据传输方式:java对象序列化。
Thrift 服务
>>>例同rmi ,需要定义通信接口、实现、注册服务、绑定端口……
>>>如何多种语言之间通信 ?
>>>数据传输走socket(多种语言均支持),数据再以特定的格式(String ),发送,接收方语言解析 。
Object ---> String ---> Object 。
问题:编码、解析完全需要自己做,复杂的数据结构会编码困难 .
Thrift 服务:thrift的中间编码层
>>>java Object ---> Thrift Object ---> php Object
>>>定义thrift的文件,由thrift文件(IDL)生成双方语言的接口、model ,在生成的model以及接口中会有解码编码的代码。
>>>thrift 文件例子
thrift-0.7.0.exe -r -gen java TestThrift.thrift 生成java 代码
thrift-0.7.0.exe -r -gen php TestThrift.thrift 生成php代码 thrift-0.7.0.exe -r -gen py TestThrift.thrift 生成python代码
thrift-0.7.0.exe -r -gen as3 TestThrift.thrift
生成as3代码
thrift-0.7.0.exe -r -gen
cpp TestThrift.thrift
生成C++代码
三、Thrift IDL
/tianhuilove/archive/2011/09/05/2167669.html
/thrift/
/thrift/ThriftTypes
四、Thrift Demo
Thrift
IDL
文件
Java代码
1. namespace java com.gemantic.analyse.thrift.index
2.
3. struct NewsModel{
4. 1:i32 id ;
5. 2:string title;
6. 3:string content;
7. 4:string media_from;
8. 5:string author;
9. }
10.
11. service IndexNewsOperatorServices {
12. bool indexNews(1:NewsModel indexNews),
13. bool deleteArtificiallyNews(1:i32 id )
14. }
java server
Java代码
1. package com.gemantic.analyse.thrift.index;
2.
3. import .InetSocketAddress;
4.
5. import org.apache.thrift.protocol.TBinaryProtocol;
6. import org.apache.thrift.server.TServer;
7. import org.apache.thrift.server.TThreadPoolServer;
8. import org.apache.thrift.server.TThreadPoolServer.Args;
9. import org.apache.thrift.transport.TServerSocket;
10. import org.apache.thrift.transport.TServerTransport; 11. import org.apache.thrift.transport.TTransportFactory;
12.
13. public class ThriftServerTest {
14.
15. /**
16. * @param args
17. */
18. public static void main(String[] args) {
19.
// TODO Auto-generated method stub
20. IndexNewsOperatorServices.Processor processor = new IndexNewsOperatorServices.Processor(new IndexNewsOperatorServicesImpl());
21. try{
22. TServerTransport serverTransport = new TServerSocket( new InetSocketAddress("0.0.0.0",9813));
23. Args trArgs=new Args(serverTransport);
24. trArgs.processor(processor);
25. //使用二进制来编码应用层的数据
26. trArgs.protocolFactory(new TBinaryProtocol.Factory(true, true));
27. //使用普通的socket来传输数据
28. trArgs.transportFactory(new TTransportFactory());
29. TServer server = new TThreadPoolServer(trArgs);
30. System.out.println("server begin ......................");
31. server.serve();
32. System.out.println("---------------------------------------");
33. server.stop();
34. }catch(Exception e){
35. throw new RuntimeException("index thrift server start failed!!"+"/n"+e.getMessage());
36. }
37. }
38.
39. }
java client
Java代码
1. package com.gemantic.analyse.thrift.index;
2.
3. import org.apache.thrift.TException;
4. import org.apache.thrift.protocol.TBinaryProtocol;
5. import org.apache.thrift.protocol.TProtocol;
6. import org.apache.thrift.transport.TSocket;
7. import org.apache.thrift.transport.TTransport; 8.
9. public class ThriftClientTest {
10.
11. /**
12. * @param args
13. * @throws TException
14. */
15. public static void main(String[] args) throws TException {
16. // TODO Auto-generated method stub
17. TTransport transport = new TSocket("10.0.0.41", 9813);
18. long start=System.currentTimeMillis();
19. // TTransport transport = new TSocket("218.11.178.110",9090);
20. TProtocol protocol = new TBinaryProtocol(transport);
21. IndexNewsOperatorServices.Client client=new IndexNewsOperatorServices.Client(protocol);
22. transport.open();
23.
24.
25. client.deleteArtificiallyNews(123456);
26. NewsModel newsModel=new NewsModel();
27. newsModel.setId(789456);
28. newsModel.setTitle("this from java client");
29. newsModel.setContent(" 世界杯比赛前,由于塞尔维亚和黑山突然宣布分裂,国际足联开会决定剔除塞黑,由世界上球迷最多的国家顶替,名额恰巧来到中国。举国上下一片欢腾,中国足协决定由“成世铎”(成龙+阎世铎)组队,进军世界杯。");
30. newsModel.setAuthor("ddc");
31. newsModel.setMedia_from("新华08");
32. client.indexNews(newsModel);
33. transport.close();
34. System.out.println((System.currentTimeMillis()-start));
35. System.out.println("client sucess!");
36. }
37.
38. }
php client
Php代码
1.
2. $GLOBALS['THRIFT_ROOT'] = '/home/tjiang/demo/thrift/lib/php/src';
3. require_once $GLOBALS['THRIFT_ROOT'].'/Thrift.php';
4. require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';
5. require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
6. require_once $GLOBALS['THRIFT_ROOT'].'/transport/THttpClient.php';