文章部分描述来自参考资料
RPC
什么是RPC
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。现在业界有很多开源的优秀 RPC 框架,例如 Spring Cloud、Dubbo、Thrift 等。
RPC 工作原理
Client像调用本地服务似的调用远程服务;
-
Client stub接收到调用后,将方法、参数序列化
-
客户端通过sockets将消息发送到服务端
-
Server stub 收到消息后进行解码(将消息对象反序列化)
-
Server stub 根据解码结果调用本地的服务
本地服务执行(对于服务端来说是本地执行)并将结果返回给Server stub
-
Server stub将返回结果打包成消息(将结果消息对象序列化)
-
服务端通过sockets将消息发送到客户端
-
Client stub接收到结果消息,并进行解码(将结果消息反序列化)
客户端得到最终结果。
RPC 调用分以下两种:
同步调用:客户方等待调用执行完成并返回结果。
异步调用:客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。
异步和同步的区分在于是否等待服务端执行完成并返回结果。
实现一个RPC框架需要考虑的问题
-
应该如何部署服务框架到客户端
- 服务框架自身部署的问题
- 实现自己的框架所依赖的jar包与应用自身依赖包jar包的冲突问题
-
各个服务提供者消费时间差异的问题,使用负载均衡 (A1消费得快 ,A2消费得慢)
-
多机房问题
-
client 端的流控处理
-
网络通信实现的选择(BIO AIO NIO)
-
支持多种异步服务调用方式(Future , Callback )
参考资料
- http://dubbo.apache.org/zh-cn/blog/rpc-introduction.html