RPC是什么
定义
在分布式环境中,像调用本地方法一样调用远程方法。RPC 这个概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出。在 Nelson 的论文 "Implementing Remote Procedure Calls" 中指出实现 RPC 的程序包括 5 个部分:
- User
- User-stub
- RPCRuntime
- Server-stub
- Server
这里的stub就是proxy,负责做一些协议相关的处理。
这里 user 就是 client 端,当 user 想发起一个远程调用时,它实际是通过本地调用 user-stub。user-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。远端 RPCRuntime 实例收到请求后交给 server-stub 进行解码后发起本地端调用,调用结果再返回给 user 端。
由于是跨主机调用,就带来了几个新的问题:
- Call Id的映射:客户端和服务端如何对要调用的代码达成一致。一种常用的方法是客户端和服务端需要维护一份调用方法和Call Id之间的映射,当客户端调用指定方法时,如 remoteFunctionA(),找出对应的id,发送给服务端,服务端收到后再根据id查下对应的函数,并且执行对应的代码。
- 序列化和反序列化:客户端和服务端需要通过网络传输数据,而且服务端和客户端使用的语言可能不一样,这时就需要使用双方都认可的协议进行序列化或反序列化。
- 网络传输:远程调用发生在网络中,客户端和服务端的连接,数据的传输都需要网络,而且由于网络的不确定性,需要做各种处理如熔断、容错等。
不过有很多的RPC框架帮我们做了这些,使调用者像调用本地方法一样,如Dubbo、Thrift、gRpc等。