Apache Thrift:跨语言 RPC 的老兵

Thrift 在 GitHub 上有 10,926 个 Star。

这是 Apache 基金会维护的一套跨语言 RPC 框架,2007 年在 Facebook 内部诞生,至今还在跑。核心能力很集中:用一套 IDL 写好服务契约,然后自动生成 28 种编程语言的客户端和服务端代码。

1、 解决什么问题

不同语言写的服务之间要互相调用,最常见的麻烦是:每种语言的序列化方式不同,传输协议不同,接口约定也不同。A 团队用 Java 写了个服务,B 团队想用 Python 调,光是对齐数据格式就得折腾一阵。

Thrift 的做法是定义一个 .thrift 文件,里面声明数据结构和服务接口,然后用 Thrift 编译器(C++ 写的)生成各语言的代码。生成的代码自带传输层和序列化层的抽象,调用方和被调用方不需要关心对方用的什么语言。

这套流程跑通之后,跨语言调用就跟调本地函数差不多。你写好 .thrift 文件,跑一下编译器,拿到生成的代码往项目里一扔,客户端和服务端就能通信了。

正文顶部截图

2、 架构长什么样

Thrift 的架构分四层:传输层、协议层、处理器层和服务器层。每一层都可以单独替换。传输层支持 TCP、Unix Socket、HTTP 等;协议层有二进制、紧凑、JSON 等多种格式。

这种分层设计的好处是灵活。你可以用二进制协议跑内网高性能通信,也可以切到 JSON 协议对接 Web 前端,上层业务代码不用改。实际项目里最常见的搭配是二进制协议加 TCP 传输,延迟低、吞吐高,适合服务间高频调用。

3、 版本兼容

Thrift 在设计上专门处理了客户端和服务端版本不同步的情况。服务端升级了接口,老版本的客户端照样能正常调用;新的客户端也可以请求旧版服务。字段编号机制保证了新旧版本的数据结构可以共存,新增字段不影响旧的读取逻辑。这在微服务架构里比较实用,发布节奏不同的服务之间不用强制同时上线。

README区域截图

4、 安装和使用

从源码构建:

./bootstrap.sh
./configure
make
sudo make install

各语言的库也可以通过包管理器安装,Java 用 Maven,Python 用 pip,具体参见各语言 lib 目录下的说明。

定义一个 Thrift 接口文件:

namespace java com.example
service UserService {
    string getUser(1: i32 userId)
}

用编译器生成代码,再在业务里引入即可。

项目源码里还自带了 tutorial 目录,从零跑一遍基本流程不费劲。测试方面,make check 跑全部语言的单元测试,make cross 跑跨语言的互操作测试,CI 上直接用就行。

5、 适合什么场景

  • 多语言微服务之间的内部 RPC 通信
  • 需要强类型接口约定的分布式系统
  • 已有 Java、Go、Python、C++ 等混合技术栈的团队
  • 对序列化性能有要求、需要二进制协议的场景

Thrift 不算新潮,但它解决的问题至今还在。跨语言调用这件事,有成熟的方案比追新工具更省心。

需要二进制协议的场景

Thrift 不算新潮,但它解决的问题至今还在。跨语言调用这件事,有成熟的方案比追新工具更省心。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐