介绍
有 Facebook 开发的远程服务调用框架采用接口描述语言定义并创建服务,支持可拓展的跨语言服务开发,所包含的代码生成引擎尅一在多种语言中,如 C++,Java,Pyhon,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,Smalltalk 等创建搞笑的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。
Thrift 架构
图中黄色部分是用户实现的业务逻辑,褐色部分是根据 Thrift 定义的服务接口描述文件生成的客户端和服务器端代码框架,红色部分是根据 Thrift 文件生成代码实现数据的读写操作。红色部分以下是 Thrift 的传输体系、协议以及底层 I/O 通信,使用 Thrift 可以很方便的定义一个服务并且选择不同而传输协议和传输层而不用重新生成代码。
优缺点
优点
- One-stop shop,相对于 protobuf,序列化和 RPC 支持一站式解决,如果是 protobuf,还需要考虑 RPC 框架。
protobuf
google 开源的一个项目,主要用于数据存储、传输协议格式等场合。也是一个二进制协议,主要用来序列化。
- 特性丰富
- RPC 和序列化性能不
- 有很多开源项目的周边支持 都是 thrift
...
缺点
- 没有官方文档
- Thrift 序列化二进制不可读,调试相对困难
- Thrift 的序列化和框架紧耦合,无法支持向持久层直接读写数据,所以不适合做数据持久化协议
- RPC 在 0.6.1 升级到 0.7.0 是不兼容的
- buf fix 和更新不积极,维护成本过高
...
Thrift 和 Protobuf 运用场景
Thrift
对于需求为高性能,分布式的 RPC 服务,Thrift 支持众多语言和丰富的数据类型,并对于数据字段的增删具有较强的兼容性,所以非常适合公司内部 SOA 的标准 RPC 框架
Protobuf
Protobuf 具有广泛的用户基础,空间开销小一级高解析性是其亮点,非常适合于公司内部的对性能要求高的 RPC 调用。Protobuf 提供了标准的 IDL 以及对应编译器,其 IDL 文件是参与各方的非常强的业务约束,另外,Protobuf 与传输层无关,采用 Http 具有良好的跨防火墙的访问属性。由于其解析性能好,序列化后数据量相对少,非常适合应用层对象的持久化场景。
IDL 接口描述语言
Interactive Data Language
这是一种描述语言,也是一个中间语言,IDL 一个使命就是规范和约束,规范使用类型,提供跨语言特性。通过工具分析 IDL 文件,生成各种语言代码