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端代码
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端代码

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();
}
}
        }

参考文献:

  1. http://thrift.apache.org/