对远程机进行监控实现-RMI 实现 | 学习笔记

简介: 快速学习对远程机进行监控实现-RMI 实现

开发者学堂课程【Scala 核心编程 - 进阶对远程机进行监控实现-RMI 实现学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9146


对远程机进行监控实现-RMI实现


内容介绍:

一、远程代理结构示意图

二、代码实现

三、总结


一、远程代理结构示意图

image.png

上图为远程代理的示意图,本地有一个 monitor 通过 RMI 去访问远程糖果机Machine,Machine 提供调用或者是监控机器的接口,来实现远程控制。


二、代码实现

1、说明

演示时我的客户端直接使用 server 的类型和接口,远程的这个接口本身要分开的,因为演示时在同一台机器,因此就没有分开。

2、代码改写思路

首先按照规矩,server 就相当于远程端,connect 就相当于本地,本地有个 monitor。

需要改写的地方并不多,主要是把修改了接口处。状态和前一节所讲的一样,包括销售完毕的状态、正在销售的状态、winner状态(购买完成之后可以获得奖励)、onready 的状态、HasCoin 状态(插入了一枚硬币的状态),不一样的地方在于写了一个接口 CandyMachineRemote 并继承了 Remote,这个 remote 里面实现了三个方法,即一个服务有三个方法,包括 getLocation、getCount、getstate,可以实现监控远程机器的位置、机器中糖的数量以及机器的状态,接口是在CandyMachine 实现的。

写完了接口和服务后需要去注册,首先要确定当前的机器,然后和6602端口进行注册,注册的是CandyMachine服务,为了让同学们看到代码的变化,特意将当前机器的状态改成了插入硬币的状态,并且调用了旋转手柄的代码,让机器出糖,然后可以提示服务端一台糖果机开始运行,在6602端口监听。

可以把它看作是其他城市的一台糖果机,这个糖果机已经可以提供远程的访问接口了。

3、运行结果理论情况

运行后显示代码有问题,是因为还有些代码没有进行调整,当某个地方有问题,最好的解决方式是把import部分删掉,删掉后重新引入,逐个进行重新引入后,重新启动远程的Machine,然后用本地的监控机通过代理(RMI)去访问方法,getlocation、getstate等,看能否访问到。

注意在启动之前一定要先注册。运行后又显示出现了一个问题,有时候可能是网络原因,我们进行注销后重新写入再次运行,运行成功显示:这个糖果插入一个硬币,然后旋转一下手柄出了一颗糖,服务端一台糖果机开始运行,在6602端口监听,实现了远程监控。

怎样实现在本地实现远程监控呢?

通过加入一个远程接口,这个接口相当于是大家共用的,然后把这个接口加入到管理的列表里,运行一个report,观察远程监控的地方是否都能监测的到。

4、运行结果

调用本地监控机,先用命名服务找到需要监控的服务,然后把远程拿到的这个东西加入,然后调出远程机器的具体情况,检查是否能够监测到,运行过后这边它会打出一个报告,显示远程机器的地址是 CandyMachine1,现在有九颗糖,处于准备销售的状态,跟我们刚才改写的状态是一致的。

整个监控流程就是通过 RMI 机制来实现的,把它称之为远程代理模式。


三、总结

1、项目结构示意图

image.png

2、根据上图完成了代码的实现

3、具体代码

package com. atguigu.chapt remotecandymachine. server

import ...

object RemoteMainTest{

def main(args: Array[string]): unit ={

try {

var service = new CandyMachine("candymachine1",10)

//LocateRegistry.createRegistry(6602)

//Naming.rebind("candymachine1", service)

Naming.rebind( "rmi://127.0.0.1:6602/candymachine1", service)

service.insertcoin()

service.turnCrank()

println(“服务器端1台糖果机开始运行,在6602端口监听..")

}catchi{

case ex : Exception => {

ex.printstackTrace()

}

}

相关文章
|
监控 网络协议 Unix
Linux命令-nc(端口监控、文件传输、反弹shell等)
Linux命令-nc(端口监控、文件传输、反弹shell等)
875 0
|
数据采集 文字识别 测试技术
Python3,这个库,真的是图片类型验证码的克星,真香。
Python3,这个库,真的是图片类型验证码的克星,真香。
194 0
|
SQL XML Java
tk.Mybatis 扩展通用mapper接口
tk.Mybatis 扩展通用mapper接口
|
监控 Java 大数据
如何在Java中实现批量数据处理
如何在Java中实现批量数据处理
|
存储 NoSQL 关系型数据库
阿里DataX极简教程
【5月更文挑战第1天】DataX是一个高效的数据同步工具,用于在各种数据源之间迁移数据,如MySQL到另一个MySQL或MongoDB。它的工作流程包括read、write和setting步骤,通过Framework协调多线程处理。其核心架构包括Job、Task和TaskGroup,支持并发执行。DataX支持多种数据源,如RDBMS、阿里云数仓、NoSQL和无结构化数据存储。例如,从MySQL读取数据并同步到ClickHouse的实践操作包括下载DataX、配置任务文件和执行同步任务。
2263 1
阿里DataX极简教程
|
存储 人工智能 固态存储
芯片设计 | 什么是 NVMe?
芯片设计 | 什么是 NVMe?
617 0
|
机器学习/深度学习 存储 自然语言处理
大语言模型参数真的必须要万亿以上吗?
本文探讨了大语言模型(LLMs)的发展及其在自然语言处理领域的应用。随着模型规模的不断增大,文章分析了参数规模与性能之间的关系,并展示了不同规模模型的优势与挑战。此外,文中还提供了代码示例,介绍了参数设置的方法。未来研究方向包括模型压缩和多模态学习,以进一步优化模型性能。总之,选择合适的模型规模对于平衡性能和效率至关重要。
|
Kubernetes Linux 开发者
聊聊 K8S:K8S集群搭建实战
聊聊 K8S:K8S集群搭建实战
1092 2
|
自然语言处理 Java API
"告别Java8 Stream噩梦,JDFrame神器来袭!让你的代码简洁如诗,效率翻倍,编程新体验等你尝鲜!"
【8月更文挑战第11天】Java 8的Stream API以强大的函数式编程能力革新了集合数据处理方式,但其抽象概念和复杂的链式调用让不少开发者望而却步。为此,JDFrame框架应运而生,通过直观易懂的操作符简化Stream使用,减少代码量并提高效率。
453 3
|
SQL 关系型数据库 MySQL
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
490 0