【Thrift】Thrift框架原理

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


参考文献:
  1. http://thrift.apache.org/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值