大家好,我是IT修真院郑州分院第8期学员,一枚正直善良的java程序员。今天给大家分享一下,修真院官网 java任务中可能会使用到的知识点:
RMI底层实现原理
【修真院java小课堂】RMI底层实现原理20180706
1.背景介绍
- TCP/IP–>JRMP–>RMI
- TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。
- Java远程方法协议(英语:Java Remote Method Protocol,JRMP)是特定于Java技术的、用于查找和引用远程对象的协议。这是运行在Java远程方法调用(RMI)之下、TCP/IP之上的线路层协议。
- RMI(Remote Method Invocation,远程方法调用),是JAVA早在JDK 1.1中提供的JVM与JVM之间进行 对象方法调用的技术框架的实现(在JDK的后续版本中,又进行了改进)。通过RMI技术,某一个本地的JVM可以调用存在于另外一个JVM中的对象方法,就好像它仅仅是在调用本地JVM中某个对象方法一样。
- RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。
2.知识剖析
2.1 RMI作用
- RMI为使用Java对象的分布式计算提供了一个简单而直接的模型。这些对象可以是新的Java对象,也可以是现有API的简单Java包装器。Java采用“一次编写,随处运行模型.RMI扩展了Java模型,可以在任何地方运行。”
2.2 实现RMI的步骤
- 基于tcp/ip通信,那么需要IP+PORT–>注册
- 将对象/请求转换为传输的过程–>代理
注册
- Rmiregistry需要在提供远程对象服务端启动,它提供了一个环境,说白了就是在内存中,开辟了一片空间,用来接受服务端服务程序的 注册,产生一个类似于数据库,提供存储检索远程对象功能的注册表。这个RMI注册表,就是我们常听到的RMI名字服务。远程客户端,就是依靠它获得存根,调用远程方法。
代理
- Stub为客户端编码远程命令并把他们发送到服务器。而Skeleton则是把远程命令解码,调用服务端的远程对象的方法,把结果在编 码发给stub,然后stub再解码返回调用结果给客户端。
3.常见问题
3.1 stub到底在哪
- 从JDK5.0以后,stub就不需要rmic来产生了 ,而是由JVM自动处理。Stub存在于客户端,作为客户端的代理,让我们总是认为客户端产生了stub。实际上stub类是通过Java动态类 下载机制 下载的,它是由服务端产生,然后根据需要 动态加载到 客户端,如果下次再运行这个客户端该 存根类 存在于classpath中,就不需要再下载了,而是直接加载。
3.2 RMI是不是只有java才能用
- 不是
- CodeProject上有一个RMI for C++
- https://www.codeproject.com/Articles/9524/RMI-for-C
4.编码实战
- 查看源码中Stub、序列化等
- 见视频
5.扩展思考
5.1 应用场景
- RMI:使用JRMP协议承载数据描述。RMI可以开发企业分布式应用
6.参考文献
https://blog.csdn.net/column/details/sys-communication.html?&page=3
https://blog.csdn.net/yangdelong/article/details/4433035
https://blog.csdn.net/buhuikanjian/article/details/53105416
7.更多讨论
Q:JRMP与RMI什么关系?
A:JRMP是运行在Java远程方法调用(RMI)之下、TCP/IP之上的线路层协议
Q:Stub到底在哪?
A:Stub由服务端产生,但是在客户端使用
Q:除了RMI,还有什么远程调用的协议?
A:还有RPC,远程过程调用。这种协议是客户端访问服务器,等待服务器返回结果,而不是对象或者服务