【修真院java小课堂】RMI简单介绍

大家好,我是来自郑州分院的第10期java学员,今天我要讲rmi的简单介绍,例行公事,先来背景介绍

背景介绍

RMI(Remote Method Invocation,远程方法调用),是JAVA早在JDK 1.1中提供的JVM与JVM之间进行 对象方法调用的技术框架的实现(在JDK的后续版本中,又进行了改进)。通过RMI技术,某一个本地的JVM可以调用存在于另外一个JVM中的对象方法,就好像它仅仅是在调用本地JVM中某个对象方法一样

 

知识剖析

基本原理:

要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面上来看,网络通信需要做的就是将流从一台计算机传输到另一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有HTTP、TCP、UDP等等,HTTP、TCP、UDP都是基于sokect概念上为某种应用场景而扩展出的传输协议,网络IO,主要有bio(同步阻塞)、nio(同步非阻塞)、aio(异步非阻塞)三种方式,所有的分布式应用通讯都是基于这个原理而实现的,只是为了应用的易用,各种语言通常都会提供一些更为贴切应用易用的应用层协议。

RMI 是一个良好的、特殊的RPC实现:使用JRMP协议承载数据描述,可以使用BIO和NIO两种IO通信模型。RMI框架是可以在大规模集群系统中使用的,当然是不是使用RMI技术,还要看您的产品的技术背景、团队的技术背景、公司的业务背景甚至客户的非技术背景等。

 

实现步骤:

1、编写远程服务接口,该接口必须继承 java.rmi.Remote 接口,方法必须抛出 java.rmi.RemoteException 异常;
2、编写远程接口实现类,该实现类必须继承 java.rmi.server.UnicastRemoteObject 类;
3、启动一个RMI注册表,以便驻留这些服务启动注册表有两种方法,一种是通过命令行rmiregistry来启动,另一种方式是通过LocateRegistry.createRegistry(int port)方法
4、在RMI注册表中注册服务;

注册服务共有三种方式:

利用LocateRegistry 类的对象的 rebind() 和 lookup() 来实现绑定注册和查找远程对象的

利用命名服务 java.rmi.Naming 类的 rebind() 和 lookup() 来实现绑定注册和查找远程对象的

利用JNDI(Java Naming and Directory Interface,Java命名和目录接口) java.naming.InitialContext 类来 rebind() 和 lookup() 来实现绑定注册和查找远程对象的
5、客户端查找远程对象,并调用远程方法;

 

springRMI

1). 服务端定义远程访问接口

2). 服务端通过RmiServiceExporter暴露服务接口

3). 客户端定义与服务端已暴露的相同接口

4). 客户端通过RmiProxyFactoryBean调用服务接口

 

常见问题

远程调用时,绑定IP地址

1   在服务端的启动主函数中加入System.setProperty

2   以root权限登录服务器输入 Vi /etc/hosts ,添加要访问的IP地址

3   使用spring的话,在配置RmiServiceExporter添加属性registryHost 设置访问的ip地址

 

扩展思考

rmi实现集群

cluster4spring

采用的是客户端均衡的方式,一个client端可以同时链接n个服务节点,其中某一个服务节点发生故障不会影响整个系统运行。

 

参考文献

https://www.cnblogs.com/javalouvre/p/3726256.html

https://blog.csdn.net/BuquTianya/article/details/50806557

更多讨论

Q1:RPC与RMI的区别

A1:

1:方法调用方式不同:

RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。

RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。

2:适用语言范围不同:

RMI只用于Java;RPC是网络服务协议,与操作系统和语言无关。

3:调用结果的返回形式不同:

Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型;RMI的结果统一由外部数据表示语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。

Q2:RMI使用场景

A2:RMI适用于两个系统都主要使用JAVA语言进行构造,不需要考虑跨语言支持的情况。并且对两个JAVA系统的通讯速度有要求的情况。

Q3:RMI中的参数传递和结果返回可以使用的三种类型

A3:简单类型:按值传递,直接传递数据拷贝;
远程对象引用(实现了Remote接口):以远程对象的引用传递;
远程对象引用(未实现Remote接口):按值传递,通过序列化对象传递副本,本身不允许序列化的对象不允许传递给远程方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值