RMI 深入探究

探秘分布式神器RMI:原理、应用与前景分析(二) RMI(Remote Method Invocation)是一种用于实现远程过程调用的Java API。它允许在分布式系统中的不同Java虚拟机上执行方法调用,就像在本地执行一样。RMI具有以下特性:透明性:RMI对于开发人员来说是透明的,他们可以像调用本地方法一样调用远程方法,无需关心底层的网络通信细节。传输层独立性:RMI可以在不同的传输层协议上运行,如TCP/IP、HTTP等。一对一通信:RMI采用点对点的通信方式,即客户端和服务器之间是一对一的通信关系。 阅读详情

RMI深入探究

前面我们学习了RMI的一些基本知识,本节我们将深入理解RMI应用的基本架构并在此基础上构建自己的RMI应用程序。

RMI 应用架构

前面的文章,主要介绍了RMI框架的基本知识,本节我们将继续深入探讨RMI应用的架构及开发步骤,并深入理解这种架构的应用场景及优缺点。那就从下面这副图开始吧!下面这幅图是本人按照网络资料整理绘制的。这是我个人认为的RMI应用架构图:
在这里插入图片描述
根据上面这幅图,个人觉得有以下几点需要注意:

  1. Rmiregistry.exe应用主要完成远程对象的管理,即新增、删除、修改等
  2. Server服务端主要完成远程对象的注册
  3. Client服务主要从Rmiregistry.exe服务端查询远程对象,并利用其调用Server服务端的相关服务
  4. Rmiregistry.exe和Server代表的服务端程序可以部署在同一台服务器上(通常都会从安全角度出发,并考虑将这两者部署到同一台服务器上)。当然在最极端情况下也可以将Client、Rmiregistry.exe和Server部署到一台机器上

RMI 开发常用 API

根据前面整理的资料,我们知道RMI是Java版的RPC实现,所以Java提供了相关API以帮助开发者快速构建自己的小型分布式应用。常见的API有:

  1. Remote:这是一个接口,所有要发布的远程对象要继承这个接口
  2. UnicastRemoteObject:所有要发布的远程对象实现类都要继承这个类,继承这个类的本质是要调用这个类的静态方法export(Remote obj, int port)。如果远程对象实现类因为已经继承了某个类造成无法继承UnicastRemoteObject类,那么我们也可以通过在远程对象实现类的构造方法中直接调用UnicastRemoteObject类的export(Remote obj, int port)。这里有一点要注意:远程对象实现类的构造方法要抛出RemoteException异常
  3. Registry:这也是一个接口,其主要作用是完成远程对象的发布、删除、查询等操作。我们可以通过下述代码获取Registry对象:
Registry registry = LocateRegistry.createRegistry(1099);

当然除了用Registry完成远程对象的发布、删除、查询操作,我们还可以使用另外两个类完成同样的操作:1) java.rmi.Naming;2) javax.naming.Context(后面我们会展示这些类的具体用法)

构建自己的 RMI 应用

了解了RMI应用的基本架构,又学习了开发RMI应用的相关API,接下来我们就可以构建自己的RMI应用了。开发RMI应用主要分为以下几个步骤:

  1. 创建远程接口,继承RMI的关键接口java.rmi.Remote
  2. 创建远程类,实现远程接口
  3. 创建服务器程序,负责向RMI注册器中注册远程对象
  4. 创建客户程序,负责定位远程对象,并调用远程对象的方法

接下来我们将按照这个步骤创建自己的RMI应用。

1 创建远程接口

这里我们直接贴出代码,如下所示:

public interface RMIService extends Remote {
    int add(int a, int b) throws RemoteException;
}

注意:

  • 继承Remote接口是关键,并且其中的远程方法要抛出RemoteException异常
  • 我们也可以先定义接口A(其中要指定相关的远程方法),接着定义继承接口A的接口B,此时这个接口B就是远程接口,而A不是远程接口

2 创建远程类

public class RMIServiceImpl extends UnicastRemoteObject implements RMIService {
    public RMIServiceImpl() throws RemoteException {
    }
    @Override
    public int add(int a, int b) throws RemoteException {
        return a + b;
    }
}

注意:

  • 红色标注的是关键地方
  • 如果远程类因为已经继承了某个类,从而导致无法继续继承UnicastRemoteObject类,我们可以在远程类的构造方法中调用UnicastRemoteObject类的exportObject(Remote obj, int port)方法(该方法的主要作用是将当前对象导出为远程对象),但一定要注意该构造方法一定要抛出RemoteException异常或其父类

3 创建服务器程序

public class SimpleServer {
    public static void main(String[] args) {
        try {
            // 创建远程对象
            RMIService obj = new RMIServiceImpl();
            // 创建注册服务,同时指定其监听端口
            Registry registry = LocateRegistry.createRegistry(1099);
            // 调用Registry的bind方法向Registry服务中发布远程服务,并将其绑定到某个远程服务名称上,比如:RMIService
		   registry.bind("RMIService", obj);
           System.out.println("RMIService 已注册");
        } catch (Exception e) {
            System.out.println("RMIServiceImpl 发生异常:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

注意:

  • 红色标注的是关键地方
  • 正如前面所讲,除了Registry这种发布服务的方式外,还可以通过java.rmi.Naming和javax.naming.Context来完成这个操作

4 创建客户程序

public class SimpleClient {
    public static void main(String[] args) {
        try {
            // 获取远程对象
            Registry registry = LocateRegistry.getRegistry("127.0.0.1", 1099);
            RMIService obj = (RMIService) registry.lookup("RMIService");
            // 调用远程方法
            int result = obj.add(10, 20);
            System.out.println("远程调用结果:" + result);
        } catch (Exception e) {
            System.out.println("RemoteClient发生异常:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

关于RMI应用程序的几点思考

通过上一节,我们创建了一个属于自己的简单的RMI服务,但是这个服务有一些缺陷存在,比如:

  1. Rmiregistry.exe和Server代表的服务端程序部署于同一台服务器,那遇到服务其宕机,所以依赖于这个Rmiregistry的客户端将出现瘫痪,会对客户带来不好的体验
  2. 即使Rmiregistry与Server分开部署,服务器宕机,客户端就无法调用的情况依旧存在,因为Rmiregistry无法支持高可用部署(这种说法或许不对,但确实会有这种情况)
31、深入探究 OSGi 框架管理:从启动到 JMX 监控 本文深入探讨了 OSGi 框架的启动与管理流程,重点介绍了如何利用 JMX 在生产环境中实现对 OSGi 框架、捆绑包、服务和包的监控与管理。内容涵盖 OSGi 的模块化优势、JMX 的基本概念、MBean 的使用、通知机制以及常见用法模式,如定期监控和自动化部署。通过示例代码和流程图,帮助读者更好地理解和应用 OSGi 框架管理技术,提高应用程序的稳定性和可维护性。 阅读详情

相关推荐

36、数据库系统性能优化与Web接口架构探究

本文探讨了数据库系统性能优化与Web接口架构设计的关键概念与实践。首先介绍了物化视图优化的代价与处理方式,并解析了调优、可扩展性及基准测试等关键术语,提供了相关实验练习。随后,深入分析了Web接口的两层与三层架构模式,重点讨论了Java Applets在Web数据库访问中的实现与安全问题。最后,详细讲解了三层架构中远程方法调用(RMI)的工作原理与开发流程,帮助开发者构建高效、安全的应用系统。通过这些内容,读者可以掌握数据库性能优化策略及Web应用架构设计的核心方法。

i0j1k2l3m的博客 74

探秘分布式神器RMI:原理、应用与前景分析(一)

RMI(Remote Method Invocation)是一种用于实现远程过程调用的Java API。它允许在分布式系统中的不同Java虚拟机上执行方法调用,就像在本地执行一样。RMI具有以下特性:透明性:RMI对于开发人员来说是透明的,他们可以像调用本地方法一样调用远程方法,无需关心底层的网络通信细节。传输层独立性:RMI可以在不同的传输层协议上运行,如TCP/IP、HTTP等。一对一通信:RMI采用点对点的通信方式,即客户端和服务器之间是一对一的通信关系。

凛鼕将至的博客 1825

三种 绘制奈奎斯特曲线 的方法

如何绘制Nyquist曲线 提供三种绘制方法,其中使用最广泛的是概略图绘制方法 ①解析法绘制 ②概略图法绘制 ③MATLAB绘制

weixin_46664967的博客 6万+

RMI 源码解读

很多时候,身边那些对学习有一定方法的人都会这样对我说:不必深入源码的每个细节,知道大概就行了。但每次按照这个方式学习,我都会觉得内心无比空虚,觉得懂了,却又总觉得不太懂!所以今天我想继续深入探究大神编写RMI的真实思路,以及其中用到的知识技巧。下面我们用一句代码来打开Java RMI世界的大门。(以下均为个人整理,如有错误,还望指正!)

java_lover20111106的博客 1159

Win10和Ubantu16.04双系统下,卸载Ubantu

Win10和Ubantu16.04双系统下,卸载Ubantu 机器配置 华硕主板,英伟达显卡(这不是重点) Win10与Ubantu16.04均为UFFI分区(如果不知道这个也不需要在意,一般默认的都是这样,鸵鸟原则) 清除Ubantu系统 一般按照常规的方法来删除Ubantu,都是直接将磁盘管理器里面的关于Ubantu的磁盘清空,但是还会留下一个UFFI分区,如果不进行删除的话,开机时候还是会有...

qq_33289694的博客 390

C#菜鸟教程学习笔记

C#菜鸟教程学习笔记 C#简介 C# 是一种编程语言,它是由微软开发的。 C# 编程是基于 C 和 C++ 编程语言的,它与 Java 也非常相似。 C# 是 .Net 框架的一部分,且用于编写 .Net 应用程序。 .Net 框架(.Net Framework)能编写出下面类型的应用程序: ①Windows 应用程序 ②Web 应用程序 ③Web 服务 常用的C# 编程的开发工具:Visual Studio(VS:可视化工作室) C#程序结构 一个 C# 程序(C# 文件的后缀为 .cs)主要包括以下部分

mlc_WTMOTW的博客 4974

分布式系列五: RMI通信

RPC(Remote Procedure Call)协议 RPC协议是一种通过网络从远程计算机上请求服务, 而不需要了解底层网络技术的协议, 在OSI模型中处在应用层和网络层. 作为一个规范, 使用RPC协议的框架有很多, Dubbo,Hessian等均使用这个协议, RMI也使用该协议实现. RMI(Remote Method Invocation) 远程方法调用 RMI使用Java远程消息交换...

ahilll的博客 207

ESP32搭配FT6236触摸屏:从芯片手册到完整I2C驱动代码的保姆级解析

本文详细解析了ESP32搭配FT6236触摸屏的I2C驱动开发过程,从芯片手册解读到完整代码实现。通过硬件架构分析、寄存器配置、I2C通信封装及触摸数据处理等步骤,提供了一套完整的驱动解决方案,帮助开发者快速掌握ESP32与触摸屏的交互技术。

weixin_29174385的博客 291

RMI(2)

最近项目中又涉及到了RMI,我想探究RMI的本源。(能够在工作中有时间探究本源,真好!) 首先看一下RMI的官方文档http://java.sun.com/j2se/1.5.0/docs/guide/rmi/spec/rmiTOC.htmlRMI出现的背景 在分布式系统中JavaTM最先支持的是Socket;优点:Socket的灵活性和扩展性很强;缺点:S

dodo 1058

3.1 快速启动Flink集群

在本实战中,我们将快速启动Apache Flink 1.13.0集群,并在Hadoop集群环境中提交作业。首先,我们会在本地下载Flink安装包并上传至云主机,解压并配置环境变量。接着,我们将启动Flink集群,通过访问Web UI进行监控管理。然后,我们会配置集群,将Flink分发到从节点,并在集群上提交作业。最后,我们将通过命令行提交作业,并在Web UI上查看任务节点的输出结果。这个过程涵盖了Flink集群的部署、配置和作业提交,为大数据处理提供了一个完整的实战经验。

howard2005的专栏 727

【数据集】全球陆地表面反照率Albedo

【数据集】全球陆地表面反照率Albedo

WW、forever的博客 1453

RMI-IIOP版的HelloWorld

本文是对RMI-IIOP入门的探究,旨在了解其开发过程,形成感性认识,进而了解其原理和应用。 RMI 和 CORBA 常被视为相互竞争的技术,因为两者都提供对远程分布式对象的透明访问。但这两种技术实际上是相互补充的,一者的长处正好可以弥补另一者的短处。RMI 和 CORBA 的结合产生了 RMI-IIOP,RMI-IIOP 是企业服务器端 Java ...

weixin_34117522的博客 135

把 SAP S/4HANA 中的 Maintain Email Templates 用好:从模板维护、语言变体、业务绑定到传输治理的完整实践

摘要:SAP邮件模板管理常被低估,实则关乎审批通知、业务提醒等关键输出。官方推荐通过复制标准模板实现自定义,而非直接修改标准内容,以保持核心稳定。模板维护涉及语言变体、业务绑定、数据传输等治理环节,需业务顾问与开发团队协作确保字段来源与渲染逻辑。实施时需注意Fiori配置、权限分配及传输管理,避免测试与生产环境差异。模板设计应平衡灵活性与复杂度,遵循分层测试策略(内容、数据、流程),并建立命名规范以维护资产清晰度。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 66

关于Ehache使用rmi广播集群失败的原因探讨

前言: 失败的原因有很多种,而我失败的原因竟然只是xsi:noNamespaceSchemaLocation引用用错了,就因为这个让我搞了一个月才发现,悲痛欲绝。 事情经过及处理: 首先说明我引用的jar包ehcache-core-2.6.11.jar,而我的ehcache的配置引用的命名空间为http://ehcache.org/ehcache.xsd,结果,集群死活都不成功,而且也不报错...

Swing_wingS的博客 465

分布式爬虫架构实战:Scrapy+RabbitMQ+浏览器池,百万级数据抓取成本直降60%(附架构图+源码)

任务调度瓶颈:Redis 作为消息队列,不支持复杂任务优先级,高并发下容易消息堆积,且单点故障会导致全量任务丢失;资源浪费严重:每个爬虫节点每次爬取动态页面都启动新浏览器,启动耗时3-5秒,CPU 占用率高达80%+,单机最多同时跑3个浏览器;扩展性差:新增节点需要手动同步任务队列,节点忙闲不均,无法根据任务量动态分配资源。# 从settings读取RabbitMQ配置# 注册信号:爬虫关闭时关闭RabbitMQ连接"""启动时建立RabbitMQ连接"""

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1617

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

『Java安全』基础JNDI注入原理和手段探究(低版本)

文章目录客户端加载恶意RMI Remote类原理实现限制参考完 客户端加载恶意RMI Remote类 原理 codebase是一个URL、引导JVM查找类的地址 Client在lookup加载过程中会先在本地寻找Stub类,如果没有找到就向codebase远程加载Stub类。 若设置codebase为http://foo.com,加载com.test.Test类时便会下载http://foo.com/com/test/Test.class 那么只要控制Server端的codebase(修改Client端的c

Ho1aAs‘s Blog 4491

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[探究JMX] 1、JMX简介

      JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。           JMX致力于解决分布式系统管理的问题,比如网站的监控和软件的参数配置等,因此,能够适合于各种不同的环境是非常重要的。           管理对象是JMX应...

木鱼 214

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

[探究JMX] 3、JMX服务器端连接

一、简介         上一节介绍的是通过Web方式访问和操控MBean,本节所要介绍的是通过RMI方式,实现客户端与服务器端的通信,即客户端获取MBeanServerConnection,然后对服务器端被注册的MBean进行操作。   二、代码实例   package com.muyu.jmx; import java.rmi.registry.LocateRegistry...

木鱼 264

BBR 与 AIMD 共存公平性探究

这也不难解释,因为最大的 bw / delay 被记忆越久,对应的 bw 生效越久,而在 aimd 场景,buffer 占据是持续变化的,bbr 要跟随上去的唯一方式就是基于更新的最大 bw / delay 对应的 bw 尽快 probe,而不是用旧的。但上述 (r[n-1] + Rmin)/2 替换 Rmin 的方法促进了 bbr 的侵略性,因为 bbr 几乎会占掉一半(偏少一点,恰好接近 1/3)的资源,剩余的由其它 aimd 均分,这就从 bbr 吃亏走向了 bbr 侵占的另一个极端。

TCP/IP 3万+

一次触摸屏中断调试引发的深入探究【原创】

 首先非常感谢陈莉君老师的指点,题目名字也是陈老师起的,也很荣幸此文章能在蜗窝上发表一次,感谢郭大侠给的机会  如下为本人原创,在解决问题的过程中的一点心得,如果有描述不准确的地方还请各位指出,非常感谢 Linux内核版本:linux-4.9.18 曾有一次调试触摸屏的时候遇到如下的问题 /startup/modules # [ 233.370296] irq 44: nobod...

weixin_34302561的博客 714

对分布计算系统的探究(1)

前言: 分布计算在当今不断网络化的世界中扮演着越来越重要的角色。本文力图深入分布计算系统的内部,挖掘分布计算的实质原理,并尽力详细地剖析主流分布计算系统的核心架构。相信对分布计算系统从原理上认识则能极大地帮助解决实际开发遇到的问题。本文先简要介绍了最原始的RPC(remote procedure call)系统,因为其他分布计算系统可以说都是由此发展而来的。然后详细介绍了一个成熟的面向对象

wbright的专栏 1183

[探究JMX] 5、动态模型MBean

一、简介       Model MBean是基于DynamicMBean的更实用的MBean,如果编写被管理的类为标准MBean,我们必须为它们实现一套以MBean为后缀名的接口,这样使代码的耦合度增高。而基于Model Mbean,我们可以用配置文件等动态的方式来管理类,被管理的类可以是普通的类,这样也降低了系统的耦合性。   二、准备工作         1、为了Web方式管理...

木鱼 262
上一篇: 聊聊RMI
下一篇: RMI 源码解读
机器挖掘工
博客等级 码龄11年 892粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器挖掘工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值