Apache Thrift - 1 - 简介

之前没有用过RPC相关的框架,只是使用过WebService进行远程通信。

一开始在选择技术的时候的时候,考虑的是Thrift 和 阿里的Dubbo , 后来选择了Thrift,因为Thrift跨语言好一些。公司有一些程序,是使用C++、Python写的,必须兼容。

阿里的Dubbo框架更侧重服务治理


下面开始贴上以前在公司,做的笔记...参考了网上的资料,资料的网址当时没有记录,就不写了....


Apache Thrift 

远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发

所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势

Thrift 允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言

注 : 编译器是指thrift-0.9.0.exe


另 : 

a. 最初由facebook开发用做系统内多个语言之间的RPC通信 。 

b. 2007年由facebook贡献到apache基金 ,现在是apache下的opensource之一 。 

c. 支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务 ,跨越语言的C/S   rpc  调用 。 


Thrift 如何工作

1. 定义一个服务调用接口

2. Server端 : 接口实现 ----- impl的实现 ----- 注册该服务实现(端口) ---- 启动服务

3. Client端 : 通过IP , 端口 , 服务名 得到服务 , 通过接口调用.

数据传输方式 : Java对象序列化.



Thritf架构

Thrift包含一个完整的堆栈结构用于构建客户端和服务端

1. 黄色部分 : 用户实现业务逻辑

2. 褐色部分 : 根据Thrift定义的服务接口描述文件生成的客户端和服务端代码框架.

3. 红色部分 : 根据Thrift文件生成代码实现数据的读写操作.

4. 红色部分以下是 : Thrift的传输体系 / 协议 以及 底层I/O通信 

5. 使用Thrift可以很方便的定义一个服务并且选择不同的传输协议和传输层而不用重写代码.

6. Thrift 服务器包含用于绑定协议和传输层的基础架构,它提供阻塞、非阻塞、单线程和多线程的模式运行在服务器上,可以配合服务器 / 容器一起运行,可以和现有的 J2EE 服务器 /Web 容器无缝的结合



Thrift 数据类型

1. 基本类型

          i. bool:布尔值,true 或 false,对应 Java 的 boolean

          ii. byte:8 位有符号整数,对应 Java 的 byte

          iii. i16:16 位有符号整数,对应 Java 的 short

          iv. i32:32 位有符号整数,对应 Java 的 int

          v. i64:64 位有符号整数,对应 Java 的 long

          vi. double:64 位浮点数,对应 Java 的 double

          vii. string:未知编码文本或二进制字符串,对应 Java 的 String


2. 结构体类型

          i. struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean


3. 容器类型

          i. List : 对应Java中的ArrayList

          ii. Set : 对应Java中的HashSet

          iii. Map : 对应Java中的HashMap


4. 异常类型

          i. Exception : 对应Java中的Exception


5. 服务类型

          i. Service : 对应服务的类.



Thrift协议

Thrift 可以让用户选择客户端与服务端之间传输通信协议的类别.

在传输协议上总体划分为文本 (text) 和二进制 (binary) 传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目 / 产品中的实际需求。

在实际开发中, 服务端协议与客户端协议必须保持一致,否则会出现异常.


常用协议有以下几种 :

          1. TBinaryProtocol : 二进制编码格式进行数据传输.


          2. TCompactProtocol : 高效,密集的二进制编码格式进行数据传输.

          i. 构建方法 : 

                    1) TCompactProtocol.Factory proFactory = new TCompactProtocol.Factory();

                    2) TCompactProtocol protocol = new TCompactProtocol(transport);


          3. TJSONProtocol : 使用JSON的数据编码协议进行数据传输.

          i. 构建方法 : 

                    1) TJSONProtocol.Factory proFactory = new TJSONProtocol.Factory();

                    2) TJSONProtocol protocol = new TJSONProtocol(transport);

* TBinaryProtocol – 二进制编码格式进行数据传输。
* TCompactProtocol – 这种协议非常有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
* TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
* TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
* TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。



Thrift服务端类型

常见的服务端类型有以下几种 : 

1. TSimpleServer : 单线程服务器端使用标准的阻塞式IO

i. 构建方法 : 

TServerSocket serverTransport = new TServerSocket(7911); 
TProcessor processor = new Hello.Processor(new HelloServiceImpl()); 
TServer server = new TSimpleServer(processor, serverTransport); 
System.out.println("Start server on port 7911..."); 
server.serve();



2. TThreadPoolServer : 多线程服务器端使用标准的阻塞式IO

TNonblockingServer : 多线程服务器端使用非阻塞式IO

* TSimpleServer - 单线程服务器端使用标准的堵塞式I/O。
* TThreadPoolServer - 多线程服务器端使用标准的堵塞式I/O。
* TNonblockingServer – 多线程服务器端使用非堵塞式I/O,并且实现了Java中的NIO通道。


多线程版本
server端
TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(Integer.valueOf(config.getServer_port()));
Thrift_WhoisServer.Processor processor = new Thrift_WhoisServer.Processor(new WhoisServerImpl());
Factory protoFactory = new TBinaryProtocol.Factory(true, true);
TServer server = new THsHaServer(new Args(serverTransport).workerThreads(config.getServer_pool_size()).processor(processor).protocolFactory(protoFactory));

client端
transport = new TSocket(serverIp, serverPort, timeOut);
TFramedTransport t = new TFramedTransport(transport);
TProtocol protocol = new TBinaryProtocol(t);
client = new Thrift_WhoisServer.Client(protocol);
transport.open();



Thrift与其他传输方式相比较

xml与JSON相比体积太大,但是xml传统,也不算复杂。
json 体积较小,新颖,但不够完善。
thrift 体积超小,使用起来比较麻烦,不如前两者轻便,但是对于1.高并发、2.数据传输量大、3.多语言环境, 满足其中2点使用 thrift还是值得的。




Thrift的安装使用

thrift.exe我上传不了csdn,大家,可以去官网下载...

1.下载thrift-0.9.2 .exe文件命名为thrift .exe放在c盘下的一个Thtift文件夹中。

2. 环境变量的设置



3. 测试




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值