概念引入
底层协议概述
RPC-远程过程调用,其能通过网络请求远程计算机程序上服务,而不需要了解底层网络技术
TCP/UDP
的协议。其跨越应用层与传输层即最终的通讯还是归根到
TCP/UDP
上,但RPC
的使用允许开发者不需要了解底层网络协议。而RMI
即是Java
的RPC
实现RMI
则集合了Java
序列化和JRMP
Java
远程方法协议JMS
Java
消息服务允许应用程序发送消息至消息服务器的某个目的地,再由消息服务器去将其转发给另一个应用程序,而两程序之间可以没有直接的代码关联RMI
与JMS
的区别传输方式
JMS
服务的对象在物理上通过网络在两个Java
虚拟机之间移动RMI
服务的对象则绑定在本地Java
虚拟机中,只有函数参数和返回值通过网络传输
RMI
的底层架构架构概念
RMI
为了隐藏网络通信的细节,采用了动态代理,如下:客户端与服务端各有一个代理,而代理都由服务端产生,后动态加载给客户端代理
注意图中客户端/服务端与其代理之间的通信,其总结为下:
1
2
3
4
5
6
7客户端(Client):服务调用方。
客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
服务端(Server):服务的真正提供者。如果是从反序列化的文章跳转过来的,想必能意识到这里的打包解包实际上就是序列化与反序列化
socket
的层执行流程1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
171. server在远程机器上监听一个端口,这个端口是jvm或者os在运行时随机选择的一个端口。也就是说server在远程机器上在这个端口上导出自己。
2. client并不知道server在哪,以及sever监听哪个端口。但stub知道这些东西(具体看下面),这样client可以调用stub上他想调用的任何方法。
3. client调用stub上的方法
4. stub链接server监听的端口并发送参数,详细过程如下:
4.1 client连接server监听的端口
4.2 server收到请求并创建一个socket来处理这个连接
4.3 server继续监听到来的请求
4.4 使用双方协定的协议,传送参数和结果
4.5 协议可以是JRMP或者 iiop
5. 方法在远程server上执行,并发执行结果返回给stub
6. stub返回结果给client,就好像是stub执行了这个方法一样。RMIRegister
由上面过程中第二点所指出的,
client
在客户端端口位置未知的情况下创建出来的stub
知道,这就是注册中心RMIRegister
的作用其提供一个有着
public_name-Stub_object
名值对的hashmap
。
RMI协议初探
- 本文链接: http://noone40404.github.io/2024/02/29/RMI协议初探/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!