RMI底层实现原理
RMI底层实现原理_腾讯视频
1.背景介绍
远程方法调用(RMI)顾名思义是一台机器上的程序调用另一台机器上的方法,其主要目的就是要使运行在不同的计算机中的对象之间的调用表现得像本地调用一样。从而可以实现分布式计算。
2、知识剖析
RMI应用程序通常包含两个单独的程序,一个服务器和一个客户机。典型的服务器程序创建一些远程对象,使对这些对象的引用可访问,并等待客户端调用这些对象上的方法。典型的客户端程序获取对服务器上的一个或多个远程对象的远程引用,然后调用它们上的方法。RMI提供了服务器和客户端来回传递信息的机制。这种应用有时被称为分布式对象应用。
3、常见问题
stubs和skeletons起到了什么作用?
RMIRegistry的作用是什么?
4、解决方案
存根( Stub) 和骨架( Skeleton) 合在一起形成了 RMI 构架协议,负责网络通信相关的功能
stub担当远程对象的客户本地代表或代理人角色,负责把要调用的远程对象方法的方法名及其参数编组打包,并将该包转发给远程对象所在的服务器
调用stub的方法时将执行下列操作:
(1)与服务端的skeleton建立socket连接(2) 对参数进行打包(写入并传输)
(3) 等待方法调用结果
(4) 解包(读取)返回值或返回的异常
(5) 结果返回给客户端
Skeleton运行服务端上,接受来自stub对象的调用。当skeleton接收到来自stub对象的调用请求后,skeleton会作如下工作:
(1) 解包(读取)stub传来的参数
(2) 调用匹配实现上的方法
(3) 打包返回值或错误发送给stub对象
RMIRegistry的作用是什么?
java.rmi.Naming类提供存储和获得“远程对象注册表”上远程对象的引用的方法。Naming类的每个方法都使用URL格式的参数,一个//ip:port/name可以唯一定位一个RMI服务器上的发布了的对象
运行public static Remote lookup(String name)方法的时候,会生成一个stub对象,stub对象的构造参数需要一个RemoteRef类型的对象,
服务端运行public static void bind(String name, Remote obj)这个方法会传入一个实现类的引用作为第二参数,此时Naming会使用getClass来获取类的名字,并构建成stub
从实体类中获取RemoteRef对象,这个对象中就封装了服务端的细节,包括服务端的hostname、port。RMIRegistry会储存stub对象,并提供给客户端使用
5、扩展思考
RMIRegistry 是必须的吗?
No,RMIRegistry起到的作用只是为了方便client获取到stub对象,如果还有其他的方法让client拿到stub就不需要RMIRegistry了,因为client一旦拿到了stub就不需要RMIRegistry了
直接在client new一个stub对象不就可以了?
No,stub构造函数中需要一个RemoteRef对象,这个对象只能在server端获取。
------------------------------------------------------------------------------------------------------------------------
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~
我的邀请码:14229748,或者你可以直接点击此链接:http://www.jnshu.com/login/1/14229748