Excerpted from https://thinkerou.com/post/rpc-guide/
- RPC 是 Remote Procedure Call 的缩写, 即远程过程/函数调用
- RPC 用于进程间或跨网络通讯
- RPC 具有很好的横向扩展能力, 更适合网络/分布式环境通讯
RPC 主要涉及到的角色有:
- Client
- Client Stub
- Server
- Server Stub
详细原理请原理图进行查看(注:图片来源于参考资料4)。
根据该原理图可知,完成一次 RPC 需要经历这样几个步骤:
1)Client 以本地调用方式调用服务
2)Client Stub 接收调用后将方法、参数等组装成能够进行网络传输的消息体(编码)
3)Client Stub 找到服务地址,并将消息发送到服务端
4)Server Stub 收到消息后进行解析(解码)
5)Server Stub 根据解码结果调用本地的服务
6)本地服务执行并将结果返回给 Server Stub
7)Server Stub 将返回结果打包成消息并发送给 Client(编码)
8)Client Stub 接收到消息,并进行解析(解码)
9)Client 得到最终结果完成调用
- 调用者 (只管发出请求, 而不需要关心是谁如何去完成)
- 被调用者 (只负责完成请求, 而不需要关心是谁需要该数据)
- 调用者和被调用者的中间代理(RPC调用框架)
- 数据打包方式
- 数据传输方式
根据前述可以大致了解 RPC 的原理、流程了,那么具体完成一个 RPC 框架需要做些什么?会有哪些难点?如何解决?等等。
结合最近在阅读的 gRPC 框架和参考资料,列出后续在阅读 gRPC 框架时需要解决、总结的问题:
- gRPC 如何做到透明化远程服务调用?
- gRPC 如何对消息进行编码和解码?
- 消息数据结构使用 Proto Buffer
- 序列化反序列化
- gRPC 如何进行网络通信?
- 使用什么网络通信模型,NIO?BIO?or other?
- RequestID
后续准备结合 zookeeper 或者 etcd 和 gRPC 来研究,尽请期待。