使用RMI实现方法的远程调用

目录

1 RMI 介绍

2 服务提供者实现

2.1 创建 rmi-provider 项目

2.2 创建 UserService 接口

2.3 创建 UserServiceImpl 实现类

2.4 发布远程服务

2.4.1 远程调用的服务绑定url,就可以以面向对象调用方法

2.4.2发布服务

3 服务消费者实现

3.1 创建 rmi-consumer 项目

3.2 拷贝 UserService 接口

3.3 消费远程服务

3.3.1 测试调用远程对象

4 RMI 相关 API 总结

5 代码结构重构

5.1 建立 rmi-resource 公共资源项目

5.2 拷贝 UserService 接口

5.2.1 删除公共资源

5.3 rmi-provider 添加依赖

5.4rmi-consumer 添加依赖

5.5 测试成功


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 接口

5.3 rmi-provider 添加依赖

5.4rmi-consumer 添加依赖

5.5 测试成功

发布了221 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ZGL_cyy/article/details/105138305
今日推荐