RMI(Remote Method Invocation)远程方法调用,RPC本身的实现方式,可以先看一下RPC的实现方式-->https://blog.youkuaiyun.com/Candyys/article/details/108774099
此处讲的是java中的rmi。
首先我看到两张还不错的图。
用到的类和方法:
好了,我们往下。
RMI全部的宗旨就是尽可能简化远程接口对象的使用。
RMI的通信模型
从客户端-服务器模型来看,客户端程序直接调用服务端,JRMP
( Java Remote Method Protocol)协议通信,这个协议类似于HTTP协议,规定了客户端和服务端通信要满足的规范。
代理模式在RMI上的应用
Stub(远程对象):远程对象的代理,客户端可以像调用本地方法一样直接通过它来调用远程方法。
Stub中包含了远程对象的定位信息,如Socket端口、服务器主机地址,并实现了远程调用过程中具体的底层网络通信细节。
Registry(服务发现):默认监听在1099端口上,借助 JNDI 发布并调用了 RMI 服务。实际上,JNDI 就是一个注册表,服务端将服务对象放入到注册表中,客户端从注册表中获取服务对象。
RMI 服务在服务端实现之后需要注册到 RMI Server 上,然后客户端从指定的 RMI 地址上 Lookup 服务,调用该服务对应的方法即可完成远程方法调用。
Registry 是个很重要的功能,当服务端开发完服务之后,要对外暴露,如果没有服务注册,则客户端是无从调用的,即使服务端的服务就在那里。
上图逻辑:
-
Server端监听一个端口,这个端口是JVM随机选择的;
-
Client端并不知道Server远程对象的通信地址和端口,但是Stub中包含了这些信息,并封装了底层网络操作;
-
Client端可以调用Stub上的方法;
-
Stub连接到Server端监听的通信端口并提交参数;
-
远程Server端上执行具体的方法,并返回结果给Stub;
-
Stub返回执行结果给Client端,从Client看来就好像是Stub在本地执行了这个方法一样;
WeblogicRMI
通过Weblogic RMI作为反序列化入口导致的漏洞太多了,其实Weblogic RMI是服务器框架的组成部分。
参考链接:
https://blog.youkuaiyun.com/sinat_34596644/article/details/52599688
https://blog.youkuaiyun.com/lmy86263/article/details/72594760