RMI, 远程方法调用

RMI = Remote Method Invocation, 远程方法调用机制: 允许一个JVM对象调用另一个JVM对象方法
这种机制特别适合分布式应用, 比如JMeter的分布式压测

1. 架构图

  • RMI registry, 命名空间, 供server注册
  • RMI server, 具体的实现, 被调用的对象
  • RMI client, 从registry的命名空间中查找注册的方法, 实现远程调用

image.png

2. 样例

角色之前的关系如下, 代码逻辑大体一致
image.png

2.1. 定义远程调用接口

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * 定义Adder接口, 继承Remote对象
 */
public interface Adder extends Remote {

    int add(int x, int y) throws RemoteException;
}

2.2. Server实现

启动server端程序, 可以发现监听端口1099, 8801 (二者进程号一致)

image.png

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

/**
 * 1. 实现Adder接口
 * 2. 向registry注册
 */
public class AdderServer implements Adder {

    @Override
    public int add(int x, int y) throws RemoteException {
        return x + y;
    }

    public static void main(String[] args) {
        try {
            Adder adder = new AdderServer();
            // Server服务监听8801端口, 等待client请求
            Remote adderStub = UnicastRemoteObject.exportObject(adder, 8801);

            // registry监听端口1099, 注册server方法
            Registry registry = LocateRegistry.createRegistry(1099);
            registry.rebind("Adder", adderStub);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

2.3. Client实现

  • 通过ip + port连接registry服务
  • 在registry上查找server注册的方法
  • 然后直接调用
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {

    public static void main(String[] args) {
        try {
            Registry registry = LocateRegistry.getRegistry("localhost", 1099);
            Adder adder = (Adder) registry.lookup("Adder");

            int result = adder.add(13, 14);
            System.out.println(result);
        } catch (RemoteException | NotBoundException e) {
            e.printStackTrace();
        }
    }
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值