您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java基础--RMI

时间:2019-08-15 16:33:02  来源:  作者:
Java基础--RMI

 

RMI (Remote Method Invocation,远程方法调用)是JAVA一组拥护开发分布式应用程序的API,用于不同虚拟机间的通信,核心是远程对象

RMI通信模型:

Java基础--RMI

 

1、客户端调用辅助对象stub上方法

2、stub对调用信息(变量、方法)打包,网络发给服务端辅助对象

3、(1.2前)skeleton将stub送来的信息解包,找到被调方法的对象及本身

4、调用服务端对象上的方法,将结果返回给skeleton、打包、给stub

5、stub解包,返给客户端对象,获取返回值

可以把stub理解为本地的一个代理对象,客户端不知道server的存在,

数据传递问题:

分布式系统、不同内存空间,虚拟机A对象的引用对于虚拟机B没有意义

解决方案一:引用传递更改为值传递

将对象序列化为字节,使用字节副本在客户端、服务器间传递,一个虚拟机对该值的修改不影响其他主机的数据,问题:对象嵌套引用造成序列化嵌套,数据量激增

能不能被序列化要满足下面任一条件:1、java基本类型,2、实现Serializable接口,3、容器类中的对象可以序列化,容器也可以序列化,4、子类可序列化,其可序列化

当远程主机调用本地主机方法时,通过本地主机查询引用对应的对象;对象共享、一变都收影响

RMI参数传递和结果返回的三种机制:

1、简单类型:按值传递、传递数据拷贝;2、(实现了Remote接口的)远程对象引用、以远程对象的引用传递;3、(未实现Remote接口)远程对象引用,按值传递,通过序列化传递副本

远程对象的发现问题:

调用远程对象方法前需远程对象的引用,如何获取呐?首先咱们把“将远程对象的发现”类比于IP地址的发现

实际生活中网络通过IP地址来定位网站,这有一个映射的过程,在DNS(Domain Name System)域名系统中通过域名来查找对应的IP地址来访问服务器,这里IP相当于远程对象的引用,DNS相当于一个注册表Registry,域名在RMI中相当于远程对象的标识符,客户端通过提供远程对象的标识符访问注册表、得到远程对象的引用;标识符:

名称是URL形式的,类似于http的URL,schema是rmi,rmi://host:port/name,host注册表运行的注解,port接收调用的端口,name是标识对象的简单名称,主机和端口可选、依次默认本地、1099

编程实现:

服务器端:

远程对象:实现java.rmi.Remote接口或继承java.rmi.Remote接口的接口

在远程接口中声明的方法才能被远程调用

注意事项:

1、子接口中方法必须抛出java.rmi.RemoteException异常(使用RMI时可能抛出的大多数异常的父类)

2、子接口的实现类直接、间接继承java.rmi.server.UnicastRemoteObject(提供了很多支持RMI的方法,这些方法可以通过JRMP协议导出一个远程对象的引用并动态代理构建可以和远程对象交互的stub对象)

public interface UserHandler extends Remote {
 String getUserName(int id) throws RemoteException;
}

实体类:序列化、serialVersionUID(后面客户端对应上)

public class User implements Serializable {
 // 该字段必须存在
 private static final long serialVersionUID = 42L;
 // setter和getter可以没有
 String name;
 int id;
 
 public User(String name, int id) {
 this.name = name;
 this.id = id;
 }
}

实现类:

public class UserHandlerImpl extends UnicastRemoteObject implements UserHandler {
 // 该构造期必须存在,因为集继承了UnicastRemoteObject类,其构造器要抛出RemoteException
 public UserHandlerImpl() throws RemoteException {
 super();
 }
 
 @Override
 public String getUserName(int id) throws RemoteException {
 return "开挂的人生";
 }
}

运行远程对象:

UserHandler userHandler = null;
userHandler = new UserHandlerImpl();
Naming.rebind("user", userHandler);//通过名称映射到该远程对象的引用,客户端通过该名称获取该远程对象的引用。

注册表:

运行exe

JAVA_HOME下bin目录下有一个rmiregistry.exe程序,在你的程序的classpath下运行该程序

编程运行

通过java.rmi.registry包中的Registry接口和以及其实现类LocateRegistry来完成的

客户端:

 UserHandler handler = (UserHandler) Naming.lookup("user");//通过名称获取远程对象引用
 int count = handler.getUserCount();
 String name = handler.getUserName(1);

小结:

不知道怎么就学到这了?大概是序列化吧,时间紧任务重,这块还是需要写个小结的,RMI用于分布式方法调用,借助于remote远程调用,过程中存在一些隐患抛出异常,分布式中你去找哪个户下的哪个窗呐?通过名字还有serialVersionUID在注册表里面找,想起了Dubbo、springCloud

有错误之处欢迎指出,共同交流、一起进步、为中国造芯片!

百科渡一下

注:DNS:因特网的一项核心服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串【源】

JRMP:java remote method protocol,Java远程方法协议,JAVA特有的基于流的协议



Tags:Java RMI   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
RMI (Remote Method Invocation,远程方法调用)是Java一组拥护开发分布式应用程序的API,用于不同虚拟机间的通信,核心是远程对象RMI通信模型: 1、客户端调用辅助对象stub上方法2、...【详细内容】
2019-08-15  Tags: Java RMI  点击:(235)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条