这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
RPC 指的是远程过程调用 (Remote Procedure Call),是一种通信技术,允许运行在不同主机上的程序通过网络进行通信。RPC 使得远程的程序调用(RPC)看起来像是本地的函数调用,因此简化了网络通信的开发。
在 RPC 架构中,客户端发送请求到服务端,服务端执行相应的过程并返回结果。与此同时,RPC 在两端隐藏了所有的通信细节,使得程序员可以专注于解决业务问题,而不需要关心通信的细节。
本地函数调用通过将数据压入栈中,然后通过函数指针进入被调用函数,最后将计算出来的结果再放入栈中,由调用函数从栈中读取。
func calculate(a, b int) int {
return a * b
}
func main() {
var a = 2
var b = 3
res := calculate(a, b)
fmt.Println(res)
return
}
远程函数调用的话,和本地函数调用类似,只不过这里获取数据是通过其他的服务来获得的。
RPC 需要解决的问题:
- 函数映射
- 数据转换成字节流
- 网络传输
一次完整的 RPC 调用包括以下几个步骤:
- 客户端请求:客户端发送一个请求到服务端,请求执行某个远程过程。
- 编码请求:请求被编码成适合网络传输的格式,并通过网络发送到服务端。
- 解码请求:服务端接收请求并对其进行解码,以便识别请求的内容。
- 执行请求:服务端执行请求中指定的远程过程,并生成结果。
- 编码结果:服务端编码结果,以适合网络传输。
- 发送结果:服务端将编码的结果通过网络发送回客户端。
- 解码结果:客户端接收并解码结果。
RPC 相关的几个概念:
-
lDL(Interface description language) 文件:DL 通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
-
生成代码:通过编译器工具把 DL 文件转换成语言对应的静态库
-
编解码:从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化
-
通信协议:规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据
-
网络传输:通常基于成熟的网络库走 TCP/UDP 传输
RPC 的好处:
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
RPC 可能带来的问题:
- 服务宕机,对方应该如何处理?
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?