RPC学习 | 青训营笔记

60 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

RPC相对于本地函数调用要解决的问题

  1. 函数映射
  2. 数据转换成字节流
  3. 网络传输

函数映射: 在本地调用中函数体是直接通过函数指针来确定的,调用哪个方法,编译器自动帮我们调用它相应的函数指针。但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以函数需要有一个自己的ID,在RPC调用时需要附上这个ID,还需要有个ID和函数的映射表,通过ID找到对应的函数并执行。

数据转换成字节流: 在本地调用中,只需要把参数压到栈里,然后让函数去栈里读取。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。

网络传输: 保证高效稳定地传输数据

一次RPC地完整过程

IDL文件:IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信

生成代码: 通过编译器工具把IDL文件转换成语言对应的静态库

编解码: 从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化

通信协议: 规范了数据在网络中的传输内容和格式,除必须的请求/响应数据外,通常还会包含额外的元数据

网络传输: 通常基于成熟的网络库使用TCP/UDP传输

RPC的好处

  1. 单一职责,有利于分工协作和运维开发
  2. 可扩展性强,资源使用率更优
  3. 故障隔离,服务的整体可靠性更高

RPC带来的问题

  1. 服务宕机,对方应该如何处理?
  2. 在调用过程中发生网络异常,如何保证消息的可达性?
  3. 请求量突增导致服务无法及时处理,有哪些应对措施?

RPC框架用来解决上述问题