前端初识RPC

2,104 阅读4分钟

什么是RPC?

RPC (Remote Procedure Call Protocal),远程过程调用协议

RPC

RPC, 远程过程调用直观说法就是A通过网络调用B的过程方法。

  1. RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。

  2. RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯) RPC 是一个请求响应模型。

  3. 客户端发起请求,服务器返回响应(类似于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是可选的。