Remote Procedure Calls(RPC)
目录
- Remote Procedure Calls(RPC)
- 基本概念
- 维基百科:
- 历史和起源
- 消息传递
- 英文教程
- 阅读笔记
- 简书博客:什么是RPC?
- 微服务-API网关-协议转换(泛化调用)
- grpc
- 参考文献
基本概念
维基百科:
在分布式计算中,远程过程调用(RPC)是指计算机程序使进程(子进程)在不同的地址空间(通常在共享网络的另一台计算机上)执行时,其编码方式就像是正常的(本地)过程调用,而无需程序员为远程交互明确编码细节。即,无论子继承是正在执行的程序是本地程序还是远程程序,程序员都编写基本相同的代码。在面向对象的编程范例中,RPC由远程方法调用表示(RMI)。RPC模型意味着一定程度的位置透明性,即调用过程无论是本地的还是远程的,在很大程度上是相同的,但是通常它们是不相同的,因此可以将本地调用与远程调用区分开。远程呼叫通常比本地呼叫慢几个数量级,并且可靠性较差,因此区分它们很重要。
简单地说,现存的多机网络数据通信方式无非都是TCP/IP协议下的通讯,在应用层这一级存在Http和websocket,或者面向物联网的MQTT。如果是Http协议则通常是一个http异步请求,常见的是restful api形式;如果是websocket则是一个长连接通讯。应用层传输的数据可能是blob(二进制大文件)或者字节流,或者字符串。
而RPC应用到现在的RMI则是远程调用本地的方法和函数,不知道我的理解对不对。
维基百科和不少博客描述了RPC的实现过程,但是具体的实现方式都有自己的差异,本文只是整理方便笔者以后自己阅读。
历史和起源
请求-响应协议可追溯到1960年代后期的早期分布式计算,作为网络操作模型的远程过程调用的理论建议可追溯到1970年代,而实际实现可追溯到1980年代初。布鲁斯·杰伊·尼尔森(Bruce Jay Nelson)在1981年创造了“远程过程调用”一词。
最早的实际实现之一是1982年,Brian Randell及其同事在UNIX计算机之间建立了纽卡斯尔连接。Unix上第一个流行的RPC实现是Sun的RPC(现在称为ONC RPC),用作网络文件系统(NFS)的基础。
在1990年代,随着面向对象编程的普及,远程方法调用(RMI)的替代模型被广泛实现,例如在通用对象请求代理体系结构(CORBA,1991)和Java远程方法调用中。随着互联网的兴起,RMI的受欢迎程度随之下降,尤其是在2000年代。
消息传递
RPC是一种请求-响应协议。RPC由客户端启动,客户端将请求消息发送到已知的远程服务器,以使用提供的参数执行指定的过程。远程服务器将响应发送到客户端,然后应用程序继续其过程。在服务器处理呼叫时,除非客户端向服务器发送异步请求(例如XMLHttpRequest),否则客户端将被阻塞(客户端等待直到服务器完成处理再恢复执行)。各种实现中有许多变体和微妙之处,从而导致各种不同(不兼容)的RPC协议。
远程过程调用和本地调用之间的重要区别是,由于不可预测的网络问题,远程调用可能会失败。同样,调用者通常必须处理此类故障,而不知道远程过程是否真正被调用。