Apache Thrift软件框架用于跨语言的服务开发,通过代码编译引擎可生成C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、OCaml和Delphi等各种语言的服务交互框架。
Thrift服务交互框架是通过中间描述语言(IDL)生成,IDL被Thrift代码编译器编译为包含预定义数据结构和服务接口的各种目标语言。
Thrift IDL提供了所支持对象的类型描述,Thrift类型为编程人员提供一种公共的语言描述,而无需关心各种语言本身的实现方式。
Thrift类型包括:
- 基础类型:bool、byte、i16、i32、i64、double和string
- 特殊类型:binary
- 结构体:定义普通对象,类似于OOP的类,但不能被继承
- 容器类:list、set、map
- 异常:功能上类似于结构体,但继承于目标语言的基础异常
- 服务:服务定义类似于OOP中的接口定义
Thrift网络调用栈
+-----------------------------------------+
--Server(单线程、事件驱动)--
+-----------------------------------------+
--Processor(编译器生成)--
+-----------------------------------------+
--Protocol(JSON、压缩等)--
+-----------------------------------------+
--Transport(TCP、HTTP等)--
+-----------------------------------------+
- Transport
传输层提供从网络中读写的简单抽象。传输接口暴露的方法有:open、close、read、write、flush。
除了Transport接口外,Thrift还有ServerTransport接口,它主要用于Server端为新连接创建新的传输对象,方法有:open、listen、accpet和close。
- Protocol
Protocol主要用于定义数据类型在编码和解码时的方式,常用的协议有: binary(简单二进制编码)、compact、json。
- Processor
Processor封装了从输入流读取数据和把数据写到输出流的过程。输入和输出流由Protocol对象表示。
- Server
Server把上面描述的所有对象整合在一起
->创建transport
->创建输入/输出protocols
->创建基于输入/输出的Processor
->等待进来的连接,并且处理它们
Thrift使用Java示例
- JavaServer端代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
import *.*; //此处省略
public class JavaServer{
//过程实现
public static MyHandler handler;
//过程调用处理器
public static My.Processor processor;
public static void main(String[] args){
try {
handler = new MyHandler();
processor = new My.Processor(handler);
//创建简单线程运行对象
Runnable simple = new Runnable(){
public void run(){
simple(processor);
}
}
//启动线程
new Thread(simple).start();
} catch (Exception e){
e.printStackTrace():
}
}
public static void simple(My.Processor processor){
try {
//根据指定端口创建传输对象
TServerTransport serverTransport = new TServerSocket( 9090 );
//使用Transport初始化Processor,使用Processor初始化Server
TServer server = new TSimpleServer( new Args(serverTransport).processor(processor));
System.out.println( "Starting the simple server..." );
//使服务对外可用
server.serve();
} catch (Exception e){
e.printStackTrace();
}
}
}
|
- JavaClient端代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import *.*; //此处省略
public class JavaClient{
public static void main(String[] args){
if (args.length != 1 ){
System.exit( 0 );
}
try {
TTransport transport;
if (args[ 0 ].contains( "simple" )){
//创建Socket连接
transport = new TSocket( "localhost" , 9090 );
//打开连接
transport.open();
}
//根据Socket创建二进制传输协议
TProtocol protocol = new TBinaryProtocol(transport);
//获取客户端对象
My.Client client = new My.Client(protocol);
//调用客户端的sayHello方法
client.sayHello( "java" );
//关闭传输对象
transport.close();
} catch (TException e){
e.printStackTrace();
}
}
}
|
参考文献: