RPC框架——这对我才疏学浅的来说还是第一次听说。本笔记就大致梳理以下这节课的收获。
RPC框架相关概念
RPC 又称远程过程调用(Remote Procedure Call),用于解决分布式系统中服务之间的调用问题。通俗地讲,就是开发者能够像调用本地方法一样调用远程的服务。
RPC本地调用和远程调用
- 本地调用:以调用calculate函数为例
- 远程调用:以支付服务需要调用支付函数为例。 客户端怎么把参数值传给远程的函数呢? 在本地用中,我机只需要开参执理体后让函自己去钱里行,但是在远程过用,客清跟服务情是不同的程,不看过存来递参。这的要客产说配参教先转成一个字节流,传给服务馈后,再犯把节流成自己能读取的格式。
RPC概念模型
最早在 Nelson 的论文中指出实现 RPC 的程序包括 5 个理论模型部分:
User
User-stub
RPCRuntime
Server-stub
Server
这 5 个部分的关系如下图所示:
这里 User 就是 Client 端。当 User 想发起一个远程调用时,它实际是通过本地调用 User-stub。 User-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。 远端 RPCRuntime 实例收到请求后交给 Server-stub 进行解码后发起向本地端 Server 的调用,调用结果再返回给 User 端。
一次RPC完整的过程
- IDL(Interface description language) :又件IDL 通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
- 生成代码:通过编译器工具把IDL 文件转换成语言对应的静态库
- 编解码:从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化
- 通信协议:规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数
- 网络传输:通常基于成熟的网络库走 TCP/UDP 传输
RPC的好处
- 1.单一职责,有利于分工协作和运维开发
- 2.可扩展性强,资源使用率更优
- 3.故障隔离,服务的整体可靠性更高
RPC可以解决哪些问题
- .1服务宕机,对方应该如何处理?
- 2.在调用过程中发生网络异常,如何保证消息的可达性?
- 3.请求量突增导致服务无法及时处理,有哪些应对措施?
分层设计
协议层
协议是双方确定的交流语义,比如: 我们设计一个字符串传输的协议它允许客户端发送一个字符串,服务端接收到对应的字符串。这个协议很简单,首先发送一4字节的消息总长度,然后再发送1字节的字符集charset长度,接下来就是消息的payload,字符集名称和字符串正文。
- 特殊结束符:过于简单,对于一个协议单元必须要全部读入才能够进行处理,除此之外必须要防上用户传输的数据不能同结束符相同,否则就会出现紊乱。
- HTTP 协议头就是以回车(CR)加换行(LF)符号席列结尾。
- 变长协议:一般都是自定义协议,有 header 和 payload 组成,会以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度,使用比较广泛。
协议层构造
- LENGTH: 数据包大小,不包含自身
- HEADER MAGIC: 标识版本信息,协议解析时候快速校验
- SEQUENCE NUMBER: 表示数据包的 seqID可用于多路复用,单连接内递增
- HEADER SIZE: 头部长度,从第14个字节开始计算一直到 PAYLOAD前
- PROTOCOL ID:编解码方式,有 Binary 和Compact 两种
- TRANSFORM ID: 压缩方式,如 zlib 和snappyINFO ID: 传递一些定制的 meta 信息
- PAYLOAD:消息体
网络通信层
Sockets API
套接字编程中的客户端必须知道两个信息: 服务器的 P 地址,以及端口号。
网络库
- 提供易用 API 封装底层 Socket API,连接管理和事件分发
- 功能 协议支持: tcp、udp 和 uds 等 优雅退出、异常处理等
- 性能 应用层 buffer 减少 copy 高性能定时器、对象池等
写在最后
本节课的很多概念对我来说还是比较抽象的,希望日后又机会实操来加深对其的认知。