RMI(Remote Method Invocation,远程方法调用)是 Java 实现分布式对象的核心技术,它允许在不同 JVM 中的对象像调用本地方法一样调用远程对象的方法
RemoteException
)。java.rmi.server.codebase
)。java.io.Serializable
接口)。RemoteRef
)。RMISocketFactory
固定)。SecurityManager
)和策略文件(policy)来控制权限。远程接口
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Calculator extends Remote {
int add(int a, int b) throws RemoteException;
}
服务端实现
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
public class CalculatorServer implements Calculator {
public int add(int a, int b) {
return a + b;
}
public static void main(String[] args) throws Exception {
CalculatorServer server = new CalculatorServer();
Calculator stub = (Calculator) UnicastRemoteObject.exportObject(server, 0);
Registry registry = LocateRegistry.createRegistry(1099);
registry.bind("CalculatorService", stub);
System.out.println("Server ready");
}
}
客户端调用
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class CalculatorClient {
public static void main(String[] args) throws Exception {
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
Calculator calc = (Calculator) registry.lookup("CalculatorService");
int result = calc.add(5, 3);
System.out.println("Result: " + result);
}
}
RMI通过提供一种机制,使得Java程序能够跨JVM调用对象方法,实现了分布式对象。其核心在于:
一、RMI 核心原理
架构组成(三层模型)
组件 作用 关键类
客户端 调用远程方法 Registry.lookup()
服务端 实现远程对象 UnicastRemoteObject
注册表 对象目录服务 LocateRegistry
工作流程
核心机制
存根(Stub)与骨架(Skeleton)
Stub:客户端代理,伪装成远程对象
Skeleton:服务端代理,接收请求并调用真实对象
对象序列化
参数和返回值通过 Java 序列化传输
动态类加载
客户端自动下载远程对象类文件(通过 java.rmi.server.codebase)
二、为什么说 RMI 实现分布式对象
分布式对象的四大特征
特征 RMI 实现方式
位置透明性 Stub 隐藏网络细节,调用方式与本地对象相同
对象生命周期管理 UnicastRemoteObject 管理远程对象生存期
跨JVM通信 通过 TCP 协议在不同 JVM 间传输数据
异常处理 RemoteException 处理网络错误
关键实现技术
java
// 服务端实现
public class RemoteServiceImpl extends UnicastRemoteObject implements RemoteService {
public RemoteServiceImpl() throws RemoteException {}
public String process(String input) {
return "Processed: " + input; // 真实业务逻辑
}
}
// 客户端调用
RemoteService service = (RemoteService) Naming.lookup("rmi://host/service");
String result = service.process("data"); // 分布式方法调用
3. 分布式通信协议栈
图表
代码
三、RMI 底层通信细节
网络协议栈
图表
代码
端口使用机制
端口类型 作用 默认值
注册端口 查找服务 1099
通信端口 方法调用 随机动态端口
方法调用序列化流程
图表
代码
四、分布式对象生命周期管理
对象激活模型
java
// 激活服务端对象
ActivationGroupDesc groupDesc = new ActivationGroupDesc(null, null);
ActivationGroupID groupID = ActivationGroup.getSystem().registerGroup(groupDesc);
ActivationDesc desc = new ActivationDesc(
groupID,
"com.example.RemoteServiceImpl",
null,
null
);
RemoteService service = (RemoteService) Activatable.register(desc);
2. 垃圾回收机制
分布式垃圾收集 (DGC)
客户端定期发送 "lease" 续约请求
服务端跟踪远程引用计数
超时未续约的对象被自动回收
五、RMI 与分布式系统演进
防火墙穿透:动态端口导致配置复杂
序列化漏洞:安全风险(反序列化攻击)
性能瓶颈:相比二进制协议效率较低
💡 关键认知:RMI 实现了 "网络即对象" 的范式,通过代理机制将网络通信抽象为本地方法调用,这正是分布式对象的核心思想。尽管现代系统多采用 REST/gRPC 等新技术,理解 RMI 仍是掌握分布式编程的基石。