PRC:远程服务调用,也是一种网络协议,使用TCP连接实现,类似HTTP。
Thrift是一种RPC框架,开发人员通过编写IDL定义两个服务之间的接口,然后通过Thrift自动生成代码(包括网络服务端和客户端,通信对象),即开发人员只需要编写业务相关代码,无需关心数据的通信的过程。
Thrift的底层数据序列化使用的是Google的Protobuf。
结构
Thrift的客户端和服务端需要配置相关参数:
- Transport:对网络的抽象,服务器端需要传入Socket对象,客户端需要知道服务端的ip+端口号
- Protocol:客户端和服务端相互通信的协议类型
- Processor:业务处理逻辑,即RPC调用方法的内部实现,只有服务端需要。
语法
基本数据类型
thrift不支持无符号类型,因为很多编程语言不存在无符号类型
- byte:有符号字节
- i16:16位有符号整数
- i32:32位有符号整数
- i64:64位有符号整数
- double:64位浮点数
- string:字符串类型
容器类型
集合黄总的元素可以是除了service之外的任何类型
- list<T>:一系列由T类型的数据组成的有序列表,元素可以重复
- set<T>:一系列由T类型的数据组成的无序集合,元素不可重复
- map<K, V>:一个字典结构,key为K类型,value为V类型
结构体
结构体对应Java中的对象
struct LoginRequest {
1: string name;
2: string password="thrifty"; // 可以设置参数默认值
}
枚举
enum Sex {
RED,
BLUE
}
异常
exception RequestException {
1: i32 code;
2: string reason;
}
服务
RPC调用的服务,服务中的方法就是RPC调用的方法
service HelloWordService {
// 传入参数可以是基本数据类型,或者是自定义的对象struct
// 返回值可以是基本数据类型,或者是自定义的对象struct
// 可以抛出异常
LoginResponse login(1: LoginRequest request) throws (1:RequestException qe);
}
类型定义
typedef i32 Integer
typedef i64 Long
全局常量
thrift的常量是全局常量,即thrift会生成 一个常量类,包含所有常量
const i32 MAX_RETRIES_TIME = 10;
// 生成结果
@SuppressWarnings({
"cast", "rawtypes", "serial", "unchecked", "unused"})
public class Constants {
public static final int MAX_RETRIES_TIME = 10;
}
命名空间
命名空间即java中的包
namespace <语言> <包的位置>