什么是RPC?
RPC (Remote Procedure Call Protocal),远程过程调用协议

RPC
RPC, 远程过程调用直观说法就是A通过网络调用B的过程方法。
-
RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
-
RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯) RPC 是一个请求响应模型。
-
客户端发起请求,服务器返回响应(类似于Http的工作方式)RPC在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
什么是thrift
thrift是Facebook公布的一款开源跨语言的RPC框架.本质上thrift是一种接口描述语言和二进制通信协议 , 设计的初衷就是为了实现跨越语言的服务调用服务。
thrift的跨语言特型
thrift通过一个中间语言IDL(接口定义语言)来定义RPC的数据类型和接口,这些内容写在以.thrift结尾的文件中,然后通过特殊的编译器来生成不同语言的代码,以满足不同需要的开发者,生成的代码中不但包含目标语言的接口定义,方法,数据类型,还包含有RPC协议层和传输层的实现代码.
我们使用的代码都是使用Thrift自动为我们生成出来的,说白了,就是我们只需要根据业务逻辑定义好 .thrift 文件,通过这个它的编译器编译这个配置文件,并且使用告诉编译器为我们生成什么语言的代码就ok了,Thrift 框架会自动的将双方通信的编解码的逻辑生成在给我们的代码中,还包含对socket的封装,整体是一条龙的服务
Thrift 的架构体系

- Code: 就是我们的自己的业务代码
- Service.Client: 用来和服务端通信的客户端对象
- write()/read() : 这是Thrift为我们自动生成的代码, 底层封装了通过socket对数据的传输逻辑
- TProtocol: 协议层, 在这一层中规定了数据传输使用的哪种协议
- TTransport: 传输层: 在这一层中规定了数传输的格式,比如需不需要进行压缩
- Underlying IO : 数据在网络中的IO交互
Thrift语法
基本类型
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类型
其他类型
结构体(struct)
thrift支持struct类型,目的是将一些数据聚合在一起,方便传输管理,struct定义如下
struct People {
1: string name;
2: i32 age;
3: string sex;
}
枚举(enum)
枚举的定义形式和Java的Enum类似,例如:
enum Sex {
RED,
BLUE
}
异常(exception)
thrift支持自定义异常
exception RequestException {
1: i32 code;
2: string reason;
}
服务(Service)
thrift定义的服务相当于Java中创建Interface一样,创建的Service经过代码生成命令后会生成客户端与服务端的框架代码,定义形式如下
service HelloWordService {
// service中定义的函数,相当于Java interface中定义的函数
string doAction(1: string name, 2: i32 age);
}
类型定义
thrift支持类似C++一样的typedef 定义,注意末尾没有逗号或者分号,比如
typedef i32 Integer
typedef i64 Long
常量(const)
thrift使用const关键字定义常量,末尾的分号是可选的,可有可无
const i32 MAX_RETRIES_TIME = 10
命名空间(namespace)
thrift的命名空间相当于Java中的package,主要目的是组织代码。格式为
namespace <语言> <包的位置>
eg:namespace java.com.test.thrift
文件包含
thrift支持文件包含,相当于C/C++中的include,使用关键字include定义
include "global.thrift"
注释
thrift注释方式支持shell风格的注释,支持C/C++风格的注释,即#和//开头的语句都单当做注释,/**/包裹的语句也是注释。
可选与必选
thrift提供两个关键字required,optional,分别用于表示对应的字段时必填的还是可选的。例如:
struct People {
1: required string name;
2: optional i32 age;
}
表示name是必填的,age是可选的。