(2)了解rmi,实现java的rmi

1.什么是 RPC

RPC(Remote Procedure Call,远程过程调用),一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远端系统资源;对于客户端来说, 传输层使用什么协议,序列化、反序列化都是透明的

2.了解 Java RMI

RMI 全称是 remote method invocation – 远程方法调用,一种用于远程过程调用的应用程序编程接口,是纯 java 的网络分布式应用系统的核心解决方案之一。
RMI 目前使用 Java 远程消息交换协议 JRMP(Java RemoteMessageing Protocol) 进行通信,由于 JRMP 是专为 Java对象制定的,是分布式应用系统的百分之百纯 java 解决方案,用 Java RMI 开发的应用系统可以部署在任何支持 JRE的平台上,缺点是,由于 JRMP是专门为 java对象指定的,因此 RMI 对于非 JAVA 语言开发的应用系统的支持不足,不能与非 JAVA 语言书写的对象进行通信

3.Java RMI 代码实践

先看下接口部分,接口部分继承remote接口

/**
 * @Project: jdk
 * @description:  接口需要继承remote的实现接口
 * @author: sunkang
 * @create: 2018-11-17 17:20
 * @ModificationHistory who      when       What
 **/
public interface IHelloService extends Remote {
    String sayHello(String msg) throws RemoteException;

}

然后看具体的实现,具体的实现也要继承UnicastRemoteObject远程对象

/**
 * @Project: jdk
 * @description:  具体的实现需要继承UnicastRemoteObject远程对象
 * @author: sunkang
 * @create: 2018-11-17 17:22
 * @ModificationHistory who      when       What
 **/
public class HelloServiceImpl extends UnicastRemoteObject implements IHelloService {
    protected HelloServiceImpl() throws RemoteException {
        super();
    }

    @Override
    public String sayHello(String msg) throws RemoteException {
        return "hello,"+ msg;
    }
}

服务端开始发布服务,发布服务到注册中心中


/**
 * @Project: jdk
 * @description: rmi的服务端
 * @author: sunkang
 * @create: 2018-11-17 17:24
 * @ModificationHistory who      when       What
 **/
public class Server {

    public static void main(String[] args) {

        try {
             //这里会创建代理对象,并会启动ServerSocket进行监听
            IHelloService helloService = new HelloServiceImpl();
            //启动注册中心,也会创建代理对象,并会启动ServerSocket进行监听
            LocateRegistry.createRegistry(1099);
            //在注册中心绑定服务名与对应的服务
            Naming.rebind("rmi://127.0.0.1/Hello",helloService); //注冊中心
            System.out.println("服务启动成功");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

rmi的客户端,从注册 中心获取注册的对象

/**
 * @Project: jdk
 * @description: rmi的客户端
 * @author: sunkang
 * @create: 2018-11-17 17:27
 * @ModificationHistory who      when       What
 **/
public class Client {
    public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
        //往注册中心查找服务的的stub对象(HelloServiceImpl_stub)
        IHelloService helloService = (IHelloService)Naming.lookup("rmi://127.0.0.1/Hello");
        //进行调用
        System.out.println(helloService.sayHello("sunkang"));
    }
}

服务启动后,java的默认的注册端口是1099,然后在启动客户端请求,服务端的代码和客户端的代码可以分别部署,可以运行到不同机器的jvm中
最后的输出结果为:

服务端输出: 服务启动成功
客户端输出:hello,sunkang

你可能感兴趣的:((2)了解rmi,实现java的rmi)