去Spring的官方网站查找Spring RMI 的官方手册,将原有学员系统中Service中拆分出来,变成一个RMI的Service。
这个是今天要完成的任务 先学习Spring RMI
先了解一下Spring RMI这个是什么?有什么作用?为什么要要用它?用它有什么好处?
按照这个步骤一步一步先了解这个Spring RMI是什么
准备开始疯狂查资料了
先了解这个是什么
Spring RMI
RMI全称是Remote Method Invocation-远程方法调用,是纯Java的网络分布式应用系统的核心解决方案之一。Java RMI 支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
RMI目前使用Java远程消息交换协议JRMP进行通信。由于JRMP是专为Java对象制定的,用Java RMI开发的应用系统可以部署在任何支持JRE的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
知识剖析
一个正常工作的RMI系统由下面几个部分组成:
1·远程服务的接口定义
2·远程服务接口的具体实现
3·桩(Stub)和框架(Skeleton)文件
4·一个运行远程服务的服务器
5·一个RMI命名服务,它允许客户端去发现这个远程服务
6·类文件的提供者(一个HTTP或者FTP服务器)
7·一个需要这个远程服务的客户端程序
RMI的主要优点:
1. RMI是Java编写的, 具有 “编写一次,到处运行 ” 的特性。任何基于RMI的系统均可100%地移植到 任何Java虚拟机上
2. 面向对象:RMI可将完整的对象作为参数和返回值进行传递直接通过网络传输对象数据。
3.可移动属性:RMI可将属性从客户机移动到服务器,或者从服务器移到客户机。
4.设计方式:对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能。
5.安 全:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。
分布式和集群
分布式:一个业务分拆多个子业务,部署在不同的服务器上。集群:同一个业务,部署在多个服务器上
RMI(远程方法调用)原理示意图
准备开始代码实现
客户端查找远程对象LocateRegistry 类的对象的 rebind() 和 lookup() 来实现绑定注册和查找远程对象的
利用命名服务 java.rmi.Naming 类的 rebind() 和 lookup() 来实现绑定注册和查找远程对象的
利用JNDI(Java Naming and Directory Interface,Java命名和目录接口) java.naming.InitialContext 类来 rebind() 和 lookup() 来实现绑定注册和查找远程对象的
先定义远程连接的接口类(接口必须抛异常-->远程连接连接需要捕获异常)
服务端的接口
/**
* 远程对象接口必须扩展为Remote接口,接口中所有的方法必须声明抛出RemoteException异常。
* 这是因为远程方法总是存在失败的可能,所以java编程语言要求每一次远程方法的调用都必须捕获RemoteException,
* 并且指明当调用不成功时应执行的相应处理操作。
*/
public interface IHELLO extends Remote {
public String sayHello(String name)throws RemoteException;
public int sum(int a,int b)throws RemoteException;
}
具体的实现方法的调用的类
接口实现类
/**
* 接口的实现类同时要实现Serializable接口,这里继承UnicastRemoteObject也是间接实现Serializable接口,
* 同时,因为构造方法需要抛出RemoteException,所以不能缺省使用隐含的无参构造方法,而应该自己显式定义构造方法。
*/
public class IHELLOImpl extends UnicastRemoteObject implements IHELLO {
private static final long servialVersionUID = 1961558474342609777L;
public IHELLOImpl()throws RemoteException {
super();
}
@Override
public String sayHello(String name){
return "Hello " + name;
}
@Override
public int sum(int a,int b){
return a+b;
}
}
注册启动 让客户端调用 (服务端)
//服务端的 注册 以备客户端调用
public class RMITest {
public static void main(String args[]) {
try {
IHELLO rhello = new IHELLOImpl();
//生成远程对象注册表Registry的实例,并指定端口8888,默认1099
LocateRegistry.createRegistry(8888);
Naming.bind("rmi://127.0.0.1:8888/RHello",rhello);
System.out.println("远程对象IHELLO对象绑定成功");
} catch (RemoteException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
客户端调用
//客户端调用 调用远程对象,注意RMI路径与接口必须与服务器配置一致
public class RMITestC {
public static void main(String args[]) {
try {
IHELLO rHello = (IHELLO) Naming.lookup("rmi://127.0.0.1:8888/RHello");
System.out.println(rHello.sayHello("hello"));
System.out.println(rHello.sum(111, 222));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
运行验证绑定远程对象
最后验证客户端验证对象的调用
这个分离service的简单的测试完成了
今天学习到:RMI的基本用途,还有使用有什么好处,就是实现一个简单的service分离的小的demo实现,感觉还是不是理解很深入这个,才接触和了解,不是很深入,多熟悉一下这个RMI这个框架
今天遇到的困难:就是开始了解这个RMI不知道怎么接入去学习,慢慢学习中
明天计划:继续学习RMI