在介绍 Thrift 架构前,先了解下一般 RPC 框架的组成结构
RPC 组成结构
包括服务器端发布和调用处理组件,网络 IO 组件,协议编解码组件,客户端调用组件,客户端代理组件等等
Thrift 架构
各部分解释可看图中英文,释义补充:
1,用户自定义类型序列化方式将在通过 IDL 生成的代码中实现,实际也是根据 struct 中的各个 field 调用 TProtocol 的基础类型序列化实现
2,RPC stub 中已经提供了 Service Client,其作用是构造 Thrift 调用参数,发起调用,解析结果;而白色部分需用户自己写的 Client 是实例化 TProtocol,TTransport 组件,设置业务参数,通过调用 Service Client 发起请求
Thrift 组件
TProtocol 协议和编解码组件
TTransport IO 传输组件
TProcessor 服务调用处理组件
TServer,服务器网络 IO
IDL 服务描述组件,负责生产跨平台客户端
IDL 服务描述语言
IDL 语法
namespace定义包名
struct定义服务接口的参数,返回值使用到的类结构.如果接口的参数都是基本类型,则不需要定义 struct
service定义接口
支持的数据类型
bool 布尔型
byte 8位整数
i16 16位整数
i32 32位整数
i64 64位整数
double 双精度浮点数
string 字符串
binary 字节数组
list<i16> List集合,必须指明泛型
map<string, string> Map类型,必须指明泛型
set<i32> Set集合,必须指明泛型
生成的类包括 5 部分
接口类型,默认名称都是 Iface.这个接口类型被服务器和客户端共同使用.服务器端使用它来做顶层接口,编写实现类.客户端代码使用它作为生成代理的服务接口.会自动生成同步调用和异步调用的两个接口.
客户端类型,一个同步调用的客户端 Client,一个异步调用的客户端 AsyncClient
Processor,用来支持方法调用,每个服务的实现类都要使用 Processor 来注册,这样最后服务器端调用接口实现时能定位到具体的实现类.
方法参数的封装类,以 "方法名_args" 命名
方法返回值的封装类,以 "方法名_result" 命名
来源: https://juejin.im/entry/5a606d80f265da3e5b32da62