开发者学堂课程【Scala 核心编程 - 进阶:对远程机进行监控实现-RMI 实现】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9146
对远程机进行监控实现-RMI实现
内容介绍:
一、远程代理结构示意图
二、代码实现
三、总结
一、远程代理结构示意图
上图为远程代理的示意图,本地有一个 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、项目结构示意图
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()
}
}