Remote Procedure Call

特点

RPC 与 HTTP 并不是并列关系,RPC 是远程过程调用的规约,可以用 HTTP 进行信息的传输。

RPC 的主要目的是做到不同服务间调用方法像同一服务间调用本地方法一样。

大致流程是编码(protobuf),传输,接收,解码

优点

  1. 用的是 HTTP2.0,只需要一个 TCP 协议就可以使得服务器和客户端在这个 TCP 协议的多个双向 Stream 上并发地传输数据
  2. 用了 protobuf,二进制并且比 json 更小

论文架构

Client, Client-Stub, RPC-Runtime, Server-Stub, Server

一次 RPC 从调用者、客户端桩和运行时,经网络到服务端运行时、服务端桩与被调用者的往返流程
Birrell 与 Nelson 描述的 RPC 组件及一次调用的交互流程。

实现

RPC 调用端与服务端通过生成代码、编码器、协议和传输层完成请求与响应的结构
RPC 框架中生成代码、编码、协议与传输层的职责关系。

IDL (Interface description language)

Descript the interface.

TLV 编码

  • Tag:类型
  • Length:长度
  • Value:值(也可以是 TLV 结构)
Thrift BinaryProtocol 将字符串、整数和列表编码为类型、字段编号、长度与值组成的字节序列
Thrift BinaryProtocol 的字段编码与字节布局。

GenCode

Translate the IDL to different programming language.

Need decode and encode logic.

兼容性——增加新的字段不影响现有服务

通用性——跨平台跨语言

性能——空间时间维度,编码后的数据大小和编码时长

Encode

Conv code to byte.

Protocol

Necessary data and metadata

  0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f
+----------------------------------------------------------------+
| 0|                          LENGTH                             |
+----------------------------------------------------------------+
| 0|       HEADER MAGIC          |            FLAGS              |
+----------------------------------------------------------------+
|                         SEQUENCE NUMBER                        |
+----------------------------------------------------------------+
| 0|     Header Size(/32)        | ...
+---------------------------------

                  Header is of variable size:
                   (and starts at offset 14)

+----------------------------------------------------------------+
|         PROTOCOL ID  (varint)  |   NUM TRANSFORMS (varint)     |
+----------------------------------------------------------------+
|      TRANSFORM 0 ID (varint)   |        TRANSFORM 0 DATA ...
+----------------------------------------------------------------+
|         ...                              ...                   |
+----------------------------------------------------------------+
|        INFO 0 ID (varint)      |       INFO 0  DATA ...
+----------------------------------------------------------------+
|         ...                              ...                   |
+----------------------------------------------------------------+
|                                                                |
|                              PAYLOAD                           |
|                                                                |
+----------------------------------------------------------------+

LENGTH: 数据包大小,不包含自身

HEADER MAGIC:标识版本信息,协议解析时快速校验

SEQUENCE NUMBER:表示数据包的 seqlD,可用于多路复用,单连接内递增 HEADER SIZE:头部长度,从第 14 个字节开始计算一直到 PAYLOAD 前 PROTOCOL ID:编解码方式,有 Binary 和 Compact 两种 TRANSFORM ID:压缩方式,如 zlilb 和 snappy INFO ID:传递一些定制的 meta 信息 PAYLOAD:消息体

Network Transfer

Application Layer
Sockets API
TCP/UDP
IP
Driver
Physical Layer
客户端依次调用 socket、connect、write、read、close,服务端依次调用 socket、bind、listen、accept、read、write、close 的 Socket API 流程
TCP 客户端与服务端的 Socket API 调用顺序。

reference

https://ddia.vonng.com/#/ch4?id=%e6%9c%8d%e5%8a%a1%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e6%b5%81%ef%bc%9arest%e4%b8%8erpc