远程调用包括远程过程调用(RPC)和远程方法调用(RMI)
1.请求-应答协议
请求-应答协议描述了一个基于消息传递的范型,支持消息双向传输。
涉及三个通信原语
(1)doOperation:向指定的服务器发送请求消息。
(2)getRequest:远程服务器获取客户端的请求。
(3)sendReply:发送应答消息给客户端。
有三种方式保证doOperation的可靠传输:
(1)重发请求消息:一直重发消息直到保证收到请求结果或者认定服务器故障。
(2)过滤重复请求:在服务器过滤掉重复的请求。
(3)保存重传历史:在服务器保存消息结果,相同的请求直接返回结果。
RPC调用语义
调用语义 | 重发请求消息 | 过滤请求消息 | 重新执行或者重传消息应答 |
---|---|---|---|
或许(0次或一次) | 否 | 不适用 | 不适用 |
最多一次 | 是 | 是 | 重传消息应答 |
最少一次 | 是 | 否 | 重新执行 |
2.远程过程调用(RPC)
RPC(Remote Procedure Call)允许客户端程序可以调用不同于客户端的计算机的服务器程序的进程。
RPC调用过程
图片来源:https://www.cs.rutgers.edu/~p...
解释下调用的过程:
(1)客户端(client functions)调用了一个客户端代理(client stub)。
(2)客户端将传输的对象参数序列化为二进制,调用客户端socket进行通信。
(3)客户端socket将参数通过网络传递给服务端socket。
(4)服务端socket将接收到的参数交给服务端代理(server stub)。
(5)服务端代理将接收到的参数反序列化为对象,然后调用服务端(server functions)真正的方法。
(6)服务端将方法调用的结果返回给服务端代理。
(7)服务端代理将调用结果进行序列化,传递给服务端socket。
(8)服务端socket接收到二进制的调用结果之后,通过网络传输给客户端socket。
(9)客户端socket将调用结果传递给客户端代理。
(10)客户端代理将调用结果反序列化传递给客户端。
http请求是基于HTTP协议,适用于不用企业间的方法调用,http请求是低效的,因为每次都需要建立一个连接。RPC适用于企业内部系统之间的调用,RPC可以基于TCP协议,也可以基于HTTP2协议。Dubbo等框架实现了RPC。可以使用XML、JSON、Fastjson、Thrift、Avro、Protobuf或是其它进行消息的序列化。
多个消息在一个TCP连接上传输时,TCP会将发送的大消息用多个数据包发送,将发送的小消息合并为一个数据包发送。当多个消息用一个数据包发送时,可以使用文本分割法或长度前缀法得到一个完整的消息。
- 文本分割法:每个完整的消息之后,添加一个分隔符,根据之前的分隔符判断之前的文本是不是同一个消息。
- 长度前缀法:在消息开头添加传输的消息长度。
参考资料:
https://blog.csdn.net/baiye_x...
http://www.360doc.com/content...
https://github.com/hzy38324/s...
https://www.zhihu.com/search?...
《分布式系统概念与设计》
https://blog.51cto.com/zero01...
http://www.cnblogs.com/zhuxia...
3.远程方法调用(RMI)
RMI允许一个进程对象的方法可以调用另一个进程对象的方法。不管是否需在同一计算机内,只要是不同进程对象的之间的方法调用就是远程方法调用,而同一进程的方法调用就是本地方法调用。
(1)通信模块:两个相互协作的通信模块执行请求-应答协议,在客户端和服务器之间传递请求和应答消息。
(2)远程引用模块:负责在本地对象引用和远程对象引用之间进行翻译。每个进程的远程引用模块都会维护一个远程对象表,该表记录了该进程的本地对象引用和远程对象引用的对应关系。
(3)伺服器:提供远程对象主体的类的实例。
很久以前自己在csdn上写过的一篇关于RMI的文章:
https://blog.csdn.net/u012734...
其他参考资料:
https://blog.csdn.net/mawanli...
https://www.cnblogs.com/nashi...
《分布式系统概念与设计》
4.RPC和RMI的联系和区别
(1)RPC和RMI都支持接口编程。
(2)RPC和RMI都是基于请求-应答协议,并支持最多一次、最少一次等调用语义。
(3)RPC和RMI的输入输出参数都可以是值。而RMI支持输入输出参数是对象引用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。