RPC基础知识
最近在学习springcloud的时候,接触到微服务的东西,既然是把一个大系统拆分为不同对服务模块,那么各服务就会部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题:1)如果我们的服务依赖于另一个服务,而现在这个服务在远端,怎么调用?2)如果别的服务需要调用我们的我们的服务,我们的服务该怎么发布以便他人调用?
这个时候就会引入我们RPC的概念了
1.什么是RPC?
RPC即Remote Procedure Call,远程过程调用。
也就是说,调用过程代码并不是在调用者本地运行,而是要实现调用者与被调用者二地之间的连接与通信。比较严格的定义是:Remote procedure call (RPC) is a protocol that allows a computer program running on one computer to cause a subroutine on another computer to be executed without the programmer explicitly coding the details for this interaction. When the software in question is written using object-oriented principles, RPC may be referred to as remote invocation or remote method invocation。RPC的基本通信模型是基于Client/Server进程间相互通信模型的一种同步通信形式;它对Client提供了远程服务的过程抽象,其底层消息传递操作对Client是透明的。在RPC中,Client即是请求服务的调用者(Caller),而Server则是执行Client的请求而被调用的程序 (Callee)。protocol(协议),RPC 可基于 HTTP 或 TCP 协议进行包装使用
2.RPC调用过程
1)服务消费方(client)调用以本地调用方式调用服务;
2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
3)client stub找到服务地址,并将消息发送到服务端;
4)server stub收到消息后进行解码;
5)server stub根据解码结果调用本地的服务;
6)本地服务执行并将结果返回给server stub;
7)server stub将返回结果打包成消息并发送至消费方;
8)client stub接收到消息,并进行解码;
9)服务消费方得到最终结果。
RPC的作用就是将第二步到第八步的内容封装起来,让用户对这些细节透明直接使用!
3.做到RPC透明化需要用到的技术
1)序列化与反序列化:第三步,第六步需要用到序列化与反序列化;
2)反射:第五步解码后,需要调用本地服务,会用到反射
3)路由:分布式环境中,需要调用哪个服务的确定
4)通信:被序列化为二进制串后,下一步就要进行网络通信了。目前有两种IO通信模型:1)BIO;2)NIO。
4.RPC设计思想
1)服务注册查找中心 负责服务接口的注册与查找
2)RPC核心包 作为jar包,提供给服务调用者跟服务发布者使用,提供服务发布(暴露接口)与服务调用(调用暴露的接口)功能