一、RPC(远程过程调用)
1. RPC架构
- 客户端(Client),服务的调用方。
- 客户端存根(Client Stub),存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
- 服务端(Server),真正的服务提供者。
- 服务端存根(Server Stub),接收客户端发送过来的消息,将消息解包,并调用本地的方法2
2.RPC调用过程
RPC的目标是要把2、3、4、7、8、9这些步骤都封装起来。
注意:无论是何种类型的数据,最终都需要转换成二进制流在网络上进行传输,数据的发送方需要将对象转换为二进制流,而数据的接收方则需要把二进制流再恢复为对象。
在java中RPC框架比较多,常见的有Hessian、gRPC、Thrift、Dubbo 等,其实对于RPC框架而言,核心模块就是通讯和序列化
ps:RPC并不是一个具体的技术,而是指整个网络远程调用过程。
二、RMI(远程方法调用)
Java RMI 指的是远程方法调用 (Remote Method Invocation),是java原生支持的远程调用
1.RMI的架构
客户端:
存根/桩(Stub):远程对象在客户端上的代理;
远程引用层(Remote Reference Layer):解析并执行远程引用协议;
传输层(Transport):发送调用、传递远程方法参数、接收远程方法执行结果。
服务端:
- 骨架(Skeleton):读取客户端传递的方法参数,调用服务器方的实际对象方法, 并接收方法执行后的返回值;
- 远程引用层(Remote Reference Layer):处理远程引用后向骨架发送远程方法调用;
- 传输层(Transport):监听客户端的入站连接,接收并转发调用到远程引用层。
注册表(Registry):
- 以URL形式注册远程对象,并向客户端回复对远程对象的引用。
RMI和RPC的区别
1:方法调用方式不同:
- RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。
- RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。
2:适用语言范围不同:
- RMI只用于Java;
- RPC是网络服务协议,与操作系统和语言无关。
3:调用结果的返回形式不同:
- Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型;
- RMI的结果统一由外部数据表示,这种语言抽象了字节序类和数据类型结构之间的差异。