Thrift学习
Thrift
Thrift
是一个轻量级、跨语言的远程服务调用框架,最初由Facebook
开发,后面进入Apache
开源项目。它通过自身的IDL
中间语言, 并借助代码生成引擎生成各种主流语言的RPC
服务端/客户端模板代码。
Thrift
支持多种不同的编程语言,包括C++
、Java
、Python
、PHP
、Ruby
等,本系列主要讲述基于Java
语言的Thrift
的配置方式和具体使用。
Thrift 技术栈
Thrift
对软件栈的定义非常的清晰, 使得各个组件能够松散的耦合, 针对不同的应用场景, 选择不同是方式去搭建服务。
Thrift
软件栈分层从下向上分别为:传输层(Transport Layer
)、协议层(Protocol Layer
)、处理层(Processor Layer
)和服务层(Server Layer
)。
- 传输层(
Transport Layer
):传输层负责直接从网络中读取和写入数据,它定义了具体的网络传输协议;比如说TCP/IP
传输等。 - 协议层(
Protocol Layer
):协议层定义了数据传输格式,负责网络传输数据的序列化和反序列化;比如说JSON
、XML
、二进制数据等。 - 处理层(
Processor Layer
):处理层是由具体的IDL
(接口描述语言)生成的,封装了具体的底层网络传输和序列化方式,并委托给用户实现的Handler
进行处理。 - 服务层(
Server Layer
):整合上述组件,提供具体的网络线程/IO服务模型,形成最终的服务。
Thrift的特性
(一) 开发速度快
通过编写RPC
接口Thrift IDL
文件,利用编译生成器自动生成服务端骨架(Skeletons
)和客户端桩(Stubs
)。从而省去开发者自定义和维护接口编解码、消息传输、服务器多线程模型等基础工作。
- 服务端:只需要按照服务骨架即接口,编写好具体的业务处理程序(
Handler
)即实现类即可。 - 客户端:只需要拷贝
IDL
定义好的客户端桩和服务对象,然后就像调用本地对象的方法一样调用远端服务。
(二) 接口维护简单
通过维护Thrift
格式的IDL(接口描述语言)文件(注意写好注释),即可作为给Client
使用的接口文档使用,也自动生成接口代码,始终保持代码和文档的一致性。且Thrift
协议可灵活支持接口的可扩展性。
(三) 学习成本低
因为其来自Google Protobuf
开发团队,所以其IDL
文件风格类似Google Protobuf
,且更加易读易懂;特别是RPC
服务接口的风格就像写一个面向对象的Class
一样简单。
初学者只需参照:thrift.apache.org/,一个多小时就可以理解Thrift IDL
文件的语法使用。
(四) 多语言/跨语言支持
Thrift
支持C++
、 Java
、Python
、PHP
、Ruby
、Erlang
、Perl
、Haskell
、C#
、Cocoa
、JavaScript
、Node.js
、Smalltalk
等多种语言,即可生成上述语言的服务器端和客户端程序。
对于我们经常使用的Java
、PHP
、Python
、C++
支持良好,虽然对iOS
环境的Objective-C
(Cocoa
)支持稍逊,但也完全满足我们的使用要求。
(五) 稳定/广泛使用
Thrift
在很多开源项目中已经被验证是稳定和高效的,例如Cassandra
、Hadoop
、HBase
等;国外在Facebook
中有广泛使用,国内包括百度、美团小米、和饿了么等公司。
对比HTTP
和 http 相比,同属于应用层,走 tcp 协议。Thrift 优势在于发送同样的数据,request包 和 response包 要比 http 小很多,在整体性能上要优于 http 。
Thrift学习
如果使用thrift框架来调用别人的服务,则必须要知道别人写的.thrift文件.
.thrift文件,其实就是你要访问的服务的一份说明书,里面会定义服务的名称,以及该服务中的函数,以及函数的入参有几个,每个参数的数据类型是什么,参数的名称是啥,还有返回值的数据类型。
Thrift实例
以python+thrift为例
环境准备:
- 从官网上下载 windows 版的 thrift.exe:http://archive.apache.org/dist/thrift/0.9.3/ (我这里用的是0.9.3版本)
- python版本:Python 3.7.1
- pip3 install thrift
- 首先使用 thrift 之前需要定义一个 .thrift 格式的文件,比如 test.thrift
1 | service Transmit { |
- 然后运行命令:
thrift-0.9.3.exe -gen py test.thrift
生成 python 代码
1 | thrift-0.9.3.exe -gen py test.thrift |
- 然后将生成的 python 代码 和 文件,放到新建的 python 项目中。完成后先运行服务器代码,启动服务
- 服务端代码 server.py:
1 | import json |
- 客户端代码调用服务,以python调用为例
1 | import sys |
参考
- 转载