RPC 的一些概念 | 青训营笔记

97 阅读3分钟

RPC 框架

基本概念

RPC(远程函数的调用)

在本地的函数调用中,程序是通过指针实现一个函数的调用,显然这种方式在远程调用中是不适用的,所以我们就必须要有一种方式能够使用远程的函数,对远程函数的调用就是 RPC

所以 RPC 就面临需要接解决的三个问题

  • 函数的映射
  • 将数据流进行转换形成字节流
  • 网络传输

1984年 Nelson 发表了关于 RPC 的过程的 5 个模型组成

  1. User
  2. User-Stub
  3. RPC-Runtime
  4. Server-Stub
  5. Server

这是五个模型之间的RPC调用的过程

20230210193531.png

RPC 的过程

  • IDL (interfa description language)
  • 生成代码
  • 编解码
  • 通信协议
  • 网络传输
20230210194528.png

我们通过 IDL 描述有关方法的签名信息,以便调用者进行使用,然后 编译工具对 IDL 文件进行一个编译,双方都依赖同一份 IDL ,然后对数据进行一个编码,双方通过约定的协议进行通信( 基于TCP/UDP )实现函数的调用

RPC 好处

  • 单一职责,利于团队的开发和维护
  • 灵活性高,易于扩展,资源的利用率高
  • 故障隔离,服务可靠性高

而 RPC 也面临着一些问题

  • 服务宕机的解决
  • 调用过程的网络异常,如何保证消息可靠到达
  • 突发性访问量加大如何处理

分区设计

编解码层

生成代码

Clien & Server 依赖的同一份 IDL 文件会根据不同的语言生成不同的语言的 GodeGen
20230210201907.png

数据格式

  • 语言的特定格式(对数据实现序列化)
  • 文本格式(Json XMl CSV 利于阅读的文本格式)
  • 二进制编码(具有跨语言&高性能:Thrift 的BinaryProtocol protobuf)

选型

  1. 兼容性 - 可以自动增加field,不影响当前存在的服务,提高系统的灵活性
  2. 通用性 - 支持跨平台 跨语言
  3. 性能 - 数据编码所需的时间以及空间情况

协议层

概念

  • 特殊结束字符 - 作为每个协议单元结束的标识
  • 变长协议 - 以定长加不定长的部分构成(定长内容描述不定长内容)

特殊字符

20230210203448.png

变长协议

20230210203528.png

协议包构成

20230210203847.png
  • legngth - 数据包大小(不包括自身)
  • HEADER MAGIC - 版本号标识(在协议解析时快速校验)
  • SEQUENCE NUMBER - 数据包的 seqID 可以使用在多路复用中,在单个链接中是递增的
  • HEADER SIZE - 头部的长度 从 14 字节开始计算到 PAYLOAD
  • PROTOCOL ID - 编码方式 - Binary & Compact
  • TRANSFORM ID - 压缩方式 -zlib & snappy
  • INFO ID - 传递一些元数据
  • PAYLOAD - 消息体内容

网络通信层

网络库

  1. 提供易用的 API - 对底层 socket API 进行封装,以及对连接的管理和事件的分发
  2. 支持tcp udp uds 等协议和异常处理的功能
  3. 在应用层减少buffer 的拷贝提升性能 高性能的定时器和对象池