目录
2.4.1 远程调用的服务绑定url,就可以以面向对象调用方法
1 RMI 介绍
RMI
指的是远程方法调用
(Remote Method Invocation)
。它是一种机制,能够让在某个
Java虚拟机上的对象调用另一个
Java
虚拟机中的对象上的方法。可以用此方法调用的任何对象
必须实现该远程接口。
2 服务提供者实现
2.1 创建 rmi-provider 项目
2.2 创建 UserService 接口
发布的服务的远程接口
package com.zgl.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
/***
* 创建需要发布的服务对应的业务接口
* @author Administrator
* Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。
*/
public interface UserService extends Remote{
public String helloRmi(String name) throws RemoteException;
}
2.3 创建 UserServiceImpl 实现类
要声明无参的构造方法,发布的服务对应的实现类
package com.zgl.service.impl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import com.zgl.service.UserService;
/***
* 创建发布的服务对应的实现类* @author Administrator
*
*/
public class UserServiceImpl
extends UnicastRemoteObject implements UserService {
public UserServiceImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
@Override
public String helloRmi(String name) throws RemoteException {
// TODO Auto-generated method stub
return "hello "+name;
}
}
2.4 发布远程服务
2.4.1 远程调用的服务绑定url,就可以以面向对象调用方法
package com.zgl.app;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import com.zgl.service.UserService;
import com.zgl.service.impl.UserServiceImpl;
public class ProviderApp {
public static void main(String[] args) {
try{
/****
* 完成远程服务的发布
*/
//将远程服务发布在本地的 8888 端口
LocateRegistry.createRegistry(8888);
//发布的远程服务的访问 url
String name="rmi://localhost:8888/rmi";
//创建一个提供具体服务的远程对象
UserService userService = new UserServiceImpl();
//给提供远程服务的对象绑定一个 url
Naming.bind(name, userService);
System.out.println("=============发布 rmi 远程服务============");
}catch(Exception ex){
ex.printStackTrace();
}
}
}
2.4.2发布服务
此时服务的提供者已经简单实现
3 服务消费者实现
3.1 创建 rmi-consumer 项目
3.2 拷贝 UserService 接口
直接从生产者那里拷贝
package com.zgl.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
/***
* 创建需要发布的服务对应的业务接口
* @author Administrator
* Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。
*/
public interface UserService extends Remote{
public String helloRmi(String name) throws RemoteException;
}
3.3 消费远程服务
package com.zgl.app;import java.rmi.Naming;
import com.zgl.service.UserService;
public class ConsumerApp {
public static void main(String[] args) {
try{
//发布的远程服务的访问 url
String name="rmi://localhost:8888/rmi";
//通过发布的远程服务的 url,获得远程服务的代理对象
UserService userService = (UserService) Naming.lookup(name);
System.out.println("获得的远程服务的代理对象:"+userService.getClass().getName());
//通过远程服务的代理对象调用远程服务方法
String result = userService.helloRmi("rmi");
System.out.println("result="+result);
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
3.3.1 测试调用远程对象
4 RMI 相关 API 总结
Romote
接口:标识某个方法可以被远程调用
UnicastRemoteObject
类
:实现
Remote
远程对象的导出
Naming:
给提供远程服务的对象的绑定
url
通过远程的,
url,
获得提供远程服务的代理对象
LocateRegistry
类:
指定发布的远程服务的方法接口
5 代码结构重构
5.1 建立 rmi-resource 公共资源项目
5.2 拷贝 UserService 接口
package com.zgl.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
/***
* 创建需要发布的服务对应的业务接口
* @author Administrator
* Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。
*/
public interface UserService extends Remote{
public String helloRmi(String name) throws RemoteException;
}
5.2.1 删除公共资源
删除 rmi-provider 中 UserService 接口
删除 rmi-consumer 中 UserService 接口