分布式计算第四章 RMI

1.定义

RPC (Remote Procedure Call):远程方法调用,用于一个进程调用另一个进程中的过程,从而提供了过程的分布能力。

RMI(Remote Method Invocation):远程方法调用,即在RPC的基础上有向前迈进了一步,提供分布式对象间的通讯。允许运行在一个java 虚拟机的对象调用运行在另一个java虚拟机上对象的方法。这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。

RMI的全称宗旨就是尽量简化远程接口对象的调用。

RMI大大增强了java开发分布式应用的能力,例如可以将计算方法复杂的程序放在其他的服务器上,主服务器只需要去调用,而真正的运算是在其他服务器上进行,最后将运算结果返回给主服务器,这样就减轻了主服务器的负担,提高了效率(但是也有其他的开销)。

2.为什么需要RMI

为了解决日益庞大的计算模型,网络模型

2.1设计原理

在设计初始阶段,我们真正想要的是这样一种机制,客户端程序员以常规方式进行方法调用,而无需操心将数据发送到网络上或者解析响应之类的问题。所以才有了如下的网络模型:在客户端为远程对象安装一个代理。代理是位于客户端虚拟机中的一个对象,它对于客户端程序来说,就像是要访问的远程对象一样。客户端调用此代理时,只需进行常规的方法调用。而客户端代理则负责使用网络协议与服务器进行联系。

2.2 网络模型

计算模型

体系结构

底层类

2.3工作原理

RMI能让一个Java程序去调用网络中另一台计算机的Java对象的方法,那么调用的效果就像是在本机上调用一样。通俗的讲:A机器上面有一个class,通过远程调用,B机器调用这个class 中的方法。

​ RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。

​ RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序

1、存根:当客户端要调用远程对象的一个方法时,实际上调用的是代理对象上的一个普通方法,我们称此代理对象为存根(stub)。存根位于客户端机器上,而非服务器上。

2、参数编组:存根会将远程方法所需的参数打包成一组字节,对参数编码的过程就称为参数编组。参数编组的目的是将参数转换成适合在虚拟机之间进行传递的格式,在RMI协议中,对象是使用序列化机制进行编码的。

2.4 RMI用途

RMI的用途是为分布式Java应用程序之间的远程通信提供服务,提供分布式服务。

​ 目前主要应用时封装在各个J2EE项目框架中,例如Spring,EJB(Spring和EJB均封装了RMI技术)

​ 在Spring中实现RMI:

​ ①在服务器端定义服务的接口,定义特定的类实现这些接口;

​ ②在服务器端使用org.springframework.remoting.rmi.RmiServiceExporter类来注册服务;

​ ③在客户端使用org.springframework.remoting.rmi.RmiProxyFactoryBean来实现远程服务的代理功能;

​ ④在客户端定义访问与服务器端服务接口相同的类

2.5 局限性

RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议,由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信(意思是只支持客户端和服务器端都是Java程序的代码的远程调用)。

3.代码步骤

3.1远程接口

package cn.com.tt.rmiserver.stub;
​
import java.rmi.Remote;
import java.rmi.RemoteException;
​
import cn.com.tt.rmiserver.bean.Account;
​
public interface UserManagerInterface extends Remote{public String getUserName() throws RemoteException;public Account getAdminAccount() throws RemoteException;
}

3.2接口实现类

package cn.com.tt.rmiserver;
​
import java.rmi.RemoteException;
​
import cn.com.tt.rmiserver.stub.UserManagerInterface;
import cn.com.tt.rmiserver.bean.Account;
​
public class UserManagerImp implements UserManagerInterface {public UserManagerImp() throws RemoteException {
​}private static final long serialVersionUID = -3111492742628447261L;
​public String getUserName() throws RemoteException{return "TT";}public Account getAdminAccount() throws RemoteException{Account account=new Account();account.setUsername("TT");account.setPassword("123456");return account;}
}

3.3 实体类

package cn.com.tt.rmiserver.bean;
​
import java.io.Serializable;
​
public class Account implements Serializable,Cloneable{private static final long serialVersionUID = -1858518369668584532L;private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

3.3服务器类

package cn.com.tt.rmiserver.entry;
​
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
​
import cn.com.tt.rmiserver.UserManagerImp;
import cn.com.tt.rmiserver.stub.UserManagerInterface;
​
public class Entry {public static void main(String []args) throws AlreadyBoundException, RemoteException{UserManagerImp userManager=new UserManagerImp();UserManagerInterface userManagerI=(UserManagerInterface)UnicastRemoteObject.exportObject(userManager,0);// Bind the remote object's stub in the registryRegistry registry = LocateRegistry.createRegistry(2002);registry.rebind("userManager", userManagerI);System.out.println("server is ready");}
}

3.4客户端类。

  1. 新建一个java Project,编写客户端代码。

  2. 把Server端的Account类和接口UserManagerInterface,引用到新建的项目中。

package weiblog.rmi;
​
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
​
import cn.com.tt.rmiserver.stub.UserManagerInterface;
​
public class ClientEntry {public static void main(String []args){try {Registry registry = LocateRegistry.getRegistry("localhost",2002);UserManagerInterface userManager = (UserManagerInterface)registry.lookup("userManager");System.out.println("用户名是"+userManager.getAdminAccount().getUsername()+"密码"+userManager.getAdminAccount().getPassword());} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NotBoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
​
}

分布式计算第四章 RMI相关推荐

  1. 分布式计算、云计算与大数据第四章

    分布式对象范型   分布式对象范型是在消息传递模型之上提供抽象的一种范型,是基于分布式系统中对象一种计算范型,使用它用户可以访问网络上的对象(即分布式对象).分布式对象范型的核心是操作调用,而传递的数 ...

  2. 设计数据密集型应用 第四章:编码与演化

    设计数据密集型应用 第四章:编码与演化 唯变所适 --以弗所的赫拉克利特,为柏拉图所引(公元前360年) 文章目录 设计数据密集型应用 第四章:编码与演化 编码数据的格式 术语冲突 语言特定的格式 J ...

  3. 王道考研 计算机网络笔记 第四章:网络层

    本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...

  4. 如何建立图像数据矩阵和图像显示灰度之间的关系!_放射技术考试第四章第一节 数字图像的特征...

    第四章第一节   数字图像的特征 一.模拟与数字 (一)模拟信号 在信息科学中,能够计数的离散量称为数字信号(整数),不能计数的连续量称为模拟信号. 模拟是以某种范畴的表达方式如实地反映另一种范畴.例 ...

  5. 多元统计分析何晓群_多元统计分析第四章作业

    关注公众号,更多资源分享 回复关键词:多元统计分析 即可获取更多详细其他章节答案 <多元统计分析>课后答案||何晓群版(第二章) <多元统计分析>第一章课后答案(何晓群编第五版 ...

  6. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

    第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经知道了,要开发自定义的控件一般继承三个基 类:Control,WebControl,还有一个就 ...

  7. 谭浩强《C++程序设计》书后习题 第十三章-第十四章

    2019独角兽企业重金招聘Python工程师标准>>> 最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的<C程序设计>和<C++程序设计>习题 ...

  8. sql语言管理中计算机系统,00051管理系统中计算机应用第四章数据库系统考纲

    第四章数据库系统考纲 一.数据库系统概述 识记: 1.数据模型:对现实世界事物特征的模拟和抽象就是这个事物的模型.在数据库中数据模 型是抽象的表示和处理现实世界中数据的工具. 首先按人们的认识观点将现 ...

  9. 带父节点的平衡二叉树_学习数据结构--第四章:树与二叉树(平衡二叉树)

    第四章:树与二叉树(平衡二叉树) 1.平衡二叉树 平衡二叉树:AVL,任意结点的平衡因子的绝对值不超过一. 平衡因子:左子树高度 - 右子树高度 如上图二叉树,是否是平衡二叉树? 可以把所有结点的平衡 ...

最新文章

  1. typedef VS #define —— C语言中的 关键字 与 C指令
  2. axios + router4 + mobx:对于全局登录的思考
  3. ViewFlipper的功能和用法
  4. 判断数组中某个元素除自身外是否和其他数据不同_算法工程师要懂的3种算法数据结构:线性表详解...
  5. Android Ormlite 学习笔记1 -- 基础
  6. 打造“神犇”是教育的未来吗?
  7. Dubbo原理与框架设计
  8. JavaFX UI控件教程(六)之Toggle Button
  9. java时间格式24小时制12小时制
  10. mysql grant命令详解_mysql grant命令详解 设置mysql远程连接
  11. 金蝶Cloud取物料最后一次采购入库价格
  12. 怎样将iphone照片通过MAC导入移动硬盘?
  13. 0089-【生物软件】-ANNOVAR基因变异注释
  14. 迅捷路由器造成计算机无法上网,迅捷路由器不能上网怎么办
  15. 地图可视化绘制 | R-tanaka/metR包 绘制3D阴影效果地图
  16. ngx-echarts
  17. 刷脸支付上线,追赶二维码支付指日可待?
  18. 探讨佛元的国学传统文化基础,立善心行正道,为何知易行难?
  19. 剖析抖音快速涨粉的文案号,了解大佬运营技巧,学以致用
  20. Python数据挖掘—电力窃漏电用户自动识别

热门文章

  1. HiveMQ broker maven项目转化及运行环境搭建
  2. 极光推送经验之谈-Java后台服务器实现极光推送的两种实现方式
  3. TED演讲——人生的12条法则
  4. 自然语言处理中的模式(模式1.概率化模式)
  5. [leetcode] 72.编辑距离
  6. (*长期更新)软考网络工程师学习笔记——Section 7 网络层下篇
  7. java socket 通信协议_java网络通信(基于TCP协议可靠通信的socket编程)
  8. 关于5G技术和5G技术即将面临的各项挑战
  9. chrome 70 android,Android版Chrome Beta 70 (70.0.3538.17) 已发布
  10. 微信有电脑客户端吗_微信电脑版有哪些功能呢