浅析RMI

Java中的RMI与RPC:深入解析两大分布式计算技术 在当今的软件开发领域,分布式系统的设计和应用变得越来越重要。随着应用规模的不断扩大和复杂性的增加,如何在不同计算机或进程之间高效地进行通信成为了一个关键问题。为了解决这一问题,远程方法调用(RMI)和远程过程调用(RPC)技术应运而生。本文将深入探讨这两种技术的定义、特点、实现机制以及各自的优缺点,并通过实际案例帮助读者更好地理解它们的应用场景。 阅读详情

参考 : https://cloud.tencent.com/developer/article/1353191

前言

学习开源代码的时候,无意中看到RMI代码,不太理解,所以想通过此篇文章来好好学习一下RMI

是什么

RMI(Remote Method Invocation,也称远程方法调用),Java的一组拥护开发分布式应用程序的API,RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单地说,这样使原先的程序在同一操作系度统的方法调用,变成了不同操作系统之间程序的方法调用。

作用

能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端java 虚拟机中的对象上的方法
在这里插入图片描述
RMI远方法程调用步骤:
1、客户调用客户端辅助对象stub上的方法
2、客户端辅助对象stub打包调用信息(变量、方法名),通过网络发送给服务端辅助对象skeleton
3、服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
4、调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton
5、服务端辅助对象将结果打包,发送给客户端辅助对象stub
6、客户端辅助对象将返回值解包,返回给调用者
7、客户获得返回值

比较对象RPC

RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务。它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 使用代表:Dubbo
一次RPC调用的过程大概有10步:
1、执行客户端调用语句,传送参数
2、调用本地系统发送网络消息
3、消息传送到远程主机
4、服务器得到消息并取得参数
5、根据调用请求以及参数执行远程过程(服务)
6、执行过程完毕,将结果返回服务器句柄
7、服务器句柄返回结果,调用远程主机的系统网络服务发送结果
8、消息传回本地主机
9、客户端句柄由本地主机的网络服务接收消息
10、客户端接收到调用语句返回的结果数据

RPC与RMI的区别

1、方法调用方式不同:
RMI调用方法,RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。
RPC调用函数,RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。这就向RPC服务器表明,被请求的方法在“classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后通过网络协议发回。

2、适用语言范围不同:
RMI只用于Java,支持传输对象。
RPC是基于C语言的,不支持传输对象,是网络服务协议,与操作系统和语言无关。

3、调用结果的返回形式不同:
RMI是面向对象的,Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型。
RPC的结果统一由外部数据表示(External Data Representation,XDR)语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。只有由XDR定义的数据类型才能被传递,可以说RMI是面向对象方式的Java RPC。

总结

1、RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC不依赖具体的网络传输协议,tcp、udp等都可以。
2、RMI可以被看作SUN对RPC的Java版本实现
3、RPC是协议,而不论是SUN的RMI还是微软的DCOM都是对该协议的不同实现,二者都为编程人员提供了应用RPC技术的程序接口(API)

RMI的局限性有二
1、RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。注意:我们在实际开发中,我们是知道服务器IP和端口的。

2、是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用WebService或者公用对象请求代理体系(CORBA)来实现。

Demo

1、声明远程接口

import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 远程服务对象接口必须继承Remote接口;同时方法必须抛出RemoteExceptino异常
*/
public interface Hello extends Remote {
	public String sayHello(User user) throws RemoteException;
}

其中有一个引用对象作为参数:

import java.io.Serializable;
/**
* 引用对象应该是可序列化对象,这样才能在远程调用的时候:1. 序列化对象 2. 拷贝 3. 在网络中传输
* 4. 服务端反序列化 5. 获取参数进行方法调用; 这种方式其实是将远程对象引用传递的方式转化为值传递的方式
*/
public class User implements Serializable {
 
	/**
	 * 
	 */
	private static final long serialVersionUID = 2258201344880196063L;
	
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

2、实现远程服务对象

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* 远程服务对象实现类写在服务端;必须继承UnicastRemoteObject或其子类
**/
public class HelloImpl extends UnicastRemoteObject implements Hello {
 
	/**
	 * 
	 */
	private static final long serialVersionUID = 3638546195897885959L;
 
	protected HelloImpl() throws RemoteException {
		super();
		// TODO Auto-generated constructor stub
	}
 
	@Override
	public String sayHello(User user) throws RemoteException {
		System.out.println("this is server, hello:" + user.getName());
		return "hello";
	}
 
}

3、服务端程序

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
/**
* 服务端程序
**/
public class Server {
 
	public static void main(String[] args) {
		
		try {
			Hello hello = new HelloImpl(); // 创建一个远程对象,同时也会创建stub对象、skeleton对象
			
				LocateRegistry.createRegistry(8080); //启动注册服务
				try {
					Naming.bind("//127.0.0.1:8080/wbh", hello); //将stub引用绑定到服务地址上
				} catch (MalformedURLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("service bind already!!");
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
}

4、客户端程序

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
/**
 * 客户端程序
 * @author wbh
 *
 */
public class Client {
	public static void main(String[] args) {
		try {
			Hello hello = (Hello) Naming.lookup("//127.0.0.1:8080/wbh");//获取远程对象
			User user = new User();
			user.setName("james");
			System.out.println(hello.sayHello(user));
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

5、启动服务端程序在这里插入图片描述
客户端
在这里插入图片描述

RMI(Remote Method Invocation)原理浅析 现代的网络和编程技术,让我们的资源共享从信息逐步迈向了硬件,你想到过吗?你可以把一个解密的任务放到远程的运行更快的,闲置的服务器上进行,最后把运算的结果返回来,你所要做的就是提交任务。看到了吧,处理这些任务是远程的服务器。 Java的RMI的技术让这种实现变得非常的容易,本文就从基础性的东西讲解一下RMI的原理,有关安全和部署的问题,本文不加于讨论。读过本文希望对你的学 阅读详情

相关推荐

RMI与RPC的比较与编程实例

RMI和RPC都是用于实现分布式系统中的远程通信的技术。RMI更加面向对象,提供了透明的远程方法调用,而RPC是一种通用的远程调用机制。在实现上,RMI使用Java特定的机制,而RPC可以使用各种语言和框架进行实现。无论选择RMI还是RPC,都可以根据具体的需求来选择适合的技术来实现分布式通信。RMI(远程方法调用)和RPC(远程过程调用)是用于实现分布式系统中跨网络进行通信的技术。尽管它们的目标相似,但在实现细节和编程方式上存在一些区别。本文将详细介绍RMI和RPC之间的区别,并提供相应的源代码示例。

ByteJolt的博客 282

RPC、RMI基本介绍

定义RPC全称为remote procedure call,即远程过程调用。借助RPC可以做到像本地调用一样调用远程服 务,是一种进程间的通信方式。RPC并不是一个具体的技术,而是指整个网络远程调 用过程。本地调用 和 RPC调用 区别RPC过程时序图一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub可以理解为存根。客户端(Client),服务的调用方。

CAUC_lin的博客 2894

RMI与RPC

RMI(Remote Method Invocation)远程方法调用与RPC(Remote Procedure Call Protocol)远程过程调用协议 文章目录RMI(Remote Method Invocation)远程方法调用与RPC(Remote Procedure Call Protocol)远程过程调用协议概述实现原理RMI框架注册    RMIMethodDefinitionFactory服务端    RmiServer    RmiActioner    ArgumentMaker客户端    RmiClientProxy    ModelDialog (注解)    R

【RPC】RPC和RMI的区别-----未完全研透

一:RPC 远程过程调用(注:可以这么理解,RPC是所有语言的通用协议,有点像SOAP,而RMI是RPC的一种Java实现『或说RMI是RPC的java版的细化要求』;这是自己目前的理解如果有不正确的地方还望能指出) RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务。(注:可以这么理解,只要是通过网络从而调有远端的某种服务,那么这就是RPC,而不一定就是要http请求,tcp请求,udp请求,soap报文请求都可以,何况这几种.

我的笔记本 2415

UE4载具性能调优指南:从参数设置到实战优化

本文详细解析了UE4载具性能调优的关键技巧,从WheeledVehicle类构建到轮子参数、传动系统设置,再到物理属性与操控调校。通过实战案例分享,帮助开发者优化载具的速度、加速度等核心性能,提升游戏体验。特别适合需要精细调校载具物理特性的开发者参考。

weixin_29019241的博客 469

代付系统/代付系统源码/支付宝代付系统/API代付系统

简介: 其他站买的,没有做测试,源码是JAVA的,附带了安装文档,需要的拿无售后 源码下载地址https://www.skpan.cn/2QnIARSZDxG 代付系统/代付系统源码/支付宝代付系统/API代付系统 系统流程: 后台开通代理——开通商户——商户做代付(后台手工提交和 api 提交两种方式) 1、纯代付系统 2、支持个人支付宝全自动 3、支持单笔/批量/API接口方式代付 4、支持白名单、谷歌验证 5、收付款模式采用自动回调/自动转账 一、运营平台 商户管.

刀客源码网 5572

RMI浅析

RMI浅析 1.RMI(Remote Method Invocation,远程方法调用)是Java的一组拥护开发分布式应用程序的API.RMI是很多RPC框架的基础.如常用的dubbo. 2. RMI demo 1.server端 ‘’’ public interface HelloInterface extends Remote { /** * 远程接口方法必须抛出 java.rmi.Remo...

li819059787的博客 188

LCD工程师必看:Pixelclock、Mipi Clk计算全解析(附实用公式)

本文为LCD工程师详细解析了像素时钟(Pixelclock)与MIPI时钟(Mipi Clk)的核心计算方法。文章从时序参数构成入手,通过实战公式推导,系统阐述了从屏幕分辨率、刷新率到最终MIPI速率的高效计算链路,并提供了实用的调试思路与排查清单,帮助工程师快速解决画面撕裂、闪烁等常见问题。

weixin_29266679的博客 387

RMI 浅析

RMI是Remote Method Invocation的简称,即远程方法调用。通过RMI,Client可以调用Server的方法。首先,Server生成Stub和Skeleton,用于描述方法和解析方法调用。然后,Client获取Stub,即获取Server提供的方法的描述,从而知道Server提供了哪些方法及相应的参数(如图:步骤1)。接着,Client通过Stub调用Server的方法(如图:步骤2),调用信息被传递到Server(如图:步骤3),由Server的Skeleton解析。

崔显龙的博客 3722

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

算法如诗的博客 5584

【DDR3 控制器设计】(1)MIG IP 核的详解与配置

2:1 比例的用户接口数据总线宽度是 MIG 内存接口宽度的 4 倍,比如 MIG 中配置的数据位宽是 16 位,而 DDR 双边采样,所以用户接口是 MIG 内存接口的 4 倍即数据位宽为 64 位,同理可以得到如果设置为 4:1 则是 8 倍的数据位宽即数据位宽为 128 位。这里选择不使用OFF。以下为 MIG 和 DDR 之间的连接框图,可以看到框图的左边是用户接口,中间是 MIG 核,右边是需要控制的 DDR 接口,用户只需要去配置使用 MIG 核,就可以对 DDR 进行控制读写等操作。

记录学习历程 5359

【J2EE浅析】——RMI

RMI(Remote Method Invoke)-远程调用方法,是java的一组用户开发分布式应用程序的API。

杨晓敏 1171

混响效果的编程实现:Schroeder混响模型与Moorer型混响

Schroeder混响模型是由Manfred R. Schroeder在1962年提出的,它基于一系列串联的反射器(Allpass Comb Filters)和并联的反射器(Feedback Comb Filters)构成。Schroeder混响模型是由Manfred R. Schroeder在1962年提出的,它基于一系列串联的反射器(Allpass Comb Filters)和并联的反射器(Feedback Comb Filters)构成。通过调整各个反射器和全通滤波器的参数,可以实现不同的混响效果。

2301_79326857的博客 1081

RMI原理浅析

之前看过一个RMI的简单示例。这篇文章简单的分析一下RMI的原理。 RMI应用程序的体系结构 上一个例子中,我们编写了两个程序,一个服务端(Server)和一个客户端(Client)。 在Server内创建一个远程对象(CalcServiceImpl),并生成存根,注册到Registry中。 客户端请求远程对象,并调用对象的方法。 Transport Layer:RMI传输层...

优快云文章已停止维护,后续文章会在 https://blog.hufeifei.cn 持续更新 1417

【教程4>第8章>第44节】本章整体思维导图与学习总结

本教程系列提供FPGA/MATLAB/Simulink学习资源,包含《MATLAB入门100例》、《FPGA入门100例》、《Simulink入门60例》等基础教程,以及《FPGA/MATLAB/Simulink联合开发》进阶教程和《人工智能基础应用研究》专题,适合不同层次的学习者系统掌握相关技术。

FPGA/MATLAB学习教程/源码/项目合作开发 448

Python从0到100(十九):Python标准库初探

哈希函数又称哈希算法或散列函数,是一种为已有的数据创建“数字指纹”(哈希摘要)的方法。哈希函数把数据压缩成摘要,对于相同的输入,哈希函数可以生成相同的摘要(数字指纹),需要注意的是这个过程并不可逆(不能通过摘要计算出输入的内容)。举一个简单的例子,用户注册时我们希望在数据库中保存用户的密码,很显然我们不能将用户密码直接保存在数据库中,这样可能会导致用户隐私的泄露,所以在数据库中保存用户密码时,通常都会将密码的“指纹”保存起来,用户登录时通过哈希函数计算密码的“指纹”再进行匹配来判断用户登录是否成功。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 5001

JAVA RMI 原理和使用浅析

文章目录定义RMI远程调用步骤JAVA RMI简单示例: 定义 RMI:远程方法调用(Remote Method Invocation),它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。 RMI远程调用步骤 RMI的交互图: 存根和骨干网的具体通信过程: 方法调用从客户对象经存根(stub)、远程引用层(Remote Reference Layer)和传输...

dunklee的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RMI原理浅析以及调用流程

一、定义 RMI: 远程方法调用(Remote Method Invocation),它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。 Java RMI: 用于不同虚拟机之间的通信,这些虚拟机可以在不同的主机上、也可以在同一个主机上;一个虚拟机中的对象调用另一个虚拟上中的对象的方法,只不过是允许被远程调用的对象要通过一些标志加以标识,底层是通过Socket通...

Shadow_Light的博客 8864

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java rmi 原理和使用浅析

目录 定义 RMI远程调用步骤 JAVA RMI简单示例 定义 RMI: 远程方法调用(Remote Method Invocation),它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。Java RMI: 用于不同虚拟机之间的通信,这些虚拟机可以在不同的主机上、也可以在同一个主机上;一个虚拟机中的对象调用另一个虚拟上中的对象的方法,只不过是允许被远程调用的对象要通过一些标志加以标识 RMI远程调用步骤 RMI的交互图: RMI由3个部分构成,第一个是rm

whatday的专栏 418

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

RMI 与 Socket 的比较与浅析

一般来说,基于 CS(client-server) 软件架构的开发技术有很多种。比较常用的有:基于socket的网络编程、RPC、基于Java技术的RMI(当然C#也有类似技术)、CORBA等。在这里我们只是对基于socket的网络编程与RMI作个对比,有助于我们了解它们各自的应用领域,帮助我们在面对一个具体问题的时候选用适合的技术。另外,本文所做的讨论可以认为是脱离了语言层面的东西,只是对技术的

稚枭天卓 970

java RMI原理与使用浅析

定义 RMI: 远程方法调用(Remote Method Invocation),它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。Java RMI: 用于不同虚拟机之间的通信,这些虚拟机可以在不同的主机上、也可以在同一个主机上;一个虚拟机中的对象调用另一个虚拟上中的对象的方法,只不过是允许被远程调用的对象要通过一些标志加以标识。 RMI远程调用步骤 RM...

bobozai86的博客 444

Spring RMI 源码浅析-RmiServiceExporter 导出服务

Java Rmi 1.接口必须继承java.rmi.Remote接口 2.方法必须抛出java.rmi.RemoteException异常 Spring Rmi 1.可以不实现java.rmi.Remote接口  2.方法可以不抛出异常   问题:在Spring 内部是怎么实现的? 在Spring中 是通过org.springframework.remoting.rmi.Rmi

天行健,君子以自强不息 7500

浅析 Stubs/Skeletons 机制 与 RMI 调用

存根类是一个类,它实现了一个接口,但是实现后的每个方法都是空的。 它的作用是:如果一个接口有很多方法,如果要实现这个接口,就要实现所有的方法。但是一个类从业务来说,可能只需要其中一两个方法。如果直接去实现这个接口,除了实现所需的方法,还要实现其他所有的无关方法。而如果通过继承存根类就实现接口,就免去了这种麻烦。(即,继承接口的类,只需要是先接口中声明的诸多空方法中的一个或者几个,不需要像常规类一

稚枭天卓 5055
上一篇: 【前端】前端工程师的学习架构
下一篇: 上云中期2020-05-08
It_sharp
博客等级 码龄10年 51粉丝 231原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值