RPC(远程函数调用)
远程函数调用用途大致就是,方法在这个服务端,执行函数的函数体在远程服务器上,该怎么告诉机器调用这个方法。(RPC的概念模型)
其中RPC要解决这几个问题
(以支付举例)
-
函数映射
如果想让支付服务调用付款函数,而不是充值等其他服务,那么就要让这些函数有各自的ID,而且还得有二者的关系表,这样才能通过ID找到对应的函数 -
数据转换成字节流
那么找到了对应的函数,又该如何去把参数发给远程的函数呢?本地调用是压到栈里直接去读;远程调用时,服务端和客户端是不同的进程,不能通过内存来传递参数,这时候就把客户端参数转换成字节流,传给服务端后,再从字节流转到能读取的格式(序列化和反序列化) -
网络传输
找服务,传参数,这两个操作都是在网络上进行的,那么我们怎么在网络上进行高效稳定的传输数据呢? 网络传输层把调用的ID和反序列化后的参数传输给服务端,再把算好的结果序列化传给客户端。
一次RPC的完整过程
-
IDL文件
首先,远程调用时我们不知道对方的方法及其参数的样子,所以需要有一种方式来确定两方的标准,这个描述文件就是IDL
-
生成代码
通过编译工具把IDL文件转换成语言对应的静态库
-
编解码
从内存中表示字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化 -
通信协议
规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据 -
网络传输
通常居于成熟的网络库走TCP/UDP传输
RPC的好处
单一职责,有利于分工协作和运维开发(开发,部署,运维独立)
可扩展性强,资源使用率更优
故障隔离,服务的整体可靠性更高(模块化)
RPC的问题
服务宕机,对方应该如何处理
在调用过程中发生网络异常,如何保证消息的可达性
请求量徒增导致服务无法及时处理,有哪些应对措施