rmi(Remote Method Invocation)是java本身提供的一种rpc框架,它允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。
1、客户调用客户端辅助对象stub上的方法。
2、客户端辅助对象stub打包调用信息(变量、方法名),通过网络发送给服务端辅助对象skeleton。
3、服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象。
4、调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton。
5、服务端辅助对象将结果打包,发送给客户端辅助对象stub。
6、客户端辅助对象将返回值解包,返回给调用者。
7、客户获得方法返回值。
这里需要说明的是接口和模型 是消费者提供,我们可以将接口和模型打包成maven依赖的方式 提供给消费者使用。
//模型类
public class User implements Serializable {
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"name=‘" + name + ‘\‘‘ +
", id=" + id +
‘}‘;
}
}
//接口,需要继承Remote类,提供的方法允许抛出RemoteException
public interface UserService extends Remote {
User getUser() throws RemoteException;
}
//UnicastRemoteObject会暴露当前服务
public class UserServiceImpl extends UnicastRemoteObject implements UserService {
public UserServiceImpl() throws RemoteException {
}
@Override
public User getUser() throws RemoteException {
User user = new User();
user.setId(1);
user.setName("123");
return user;
}
}
UserService userService = new UserServiceImpl();
//注册端口
LocateRegistry.createRegistry(8888);
//绑定服务
Naming.bind("rmi://localhost:8888/UserService", userService);
UserService userService = (UserService) Naming.lookup("rmi://localhost:8888/UserService");
User user = userService.getUser();
System.out.println(user);
查看调用结果:
原文:https://www.cnblogs.com/chenhaoblog/p/13562495.html