远程部署的RMI

RMI

Java的远程程序调用(Remote Method Invocation,RMI)技术

对方法的直接调用,要求两个对象都在同一个堆上

远程过程调用的设计

需要创建出4个东西:客户端、客户端辅助设施、服务端、服务端辅助设施

客户端从客户端辅助设施中获取服务,就好像在本机调用服务一样,但事实上客户端辅助设施只是服务的代理,它将服务器辅助设施打包好传来的服务进行处理,再交给客户端。

  • 调用方法的过程

    1. 客户端对象向辅助设施对象调用doBigThing();

    2. 辅助设施对象将调用信息打包发给服务器的辅助设施对象;

    3. 服务器的辅助设施对象打开调用信息,并以此调用真正的服务。

使用RMI时,必要决定协议,有两种:JRMP 和 IIOP

JRMP是RMI的原生协议,支持Java与Java之间的远程调用;

IIOP是为了CORBA(Common Object Request Broker Architecture)产生的,支持Java与其他类型的远程方法。

创建远程服务的步骤

//step 1 创建远程接口
/*继承java.rmi.Remote;
import java.rmi.*;

public interface MyRemote extends Remote {
    //声明所有方法都会抛出RemoteException
    //远程方法的确定参数和返回类型都是primitive主要数据类型或Serializable
    public String sayHello() throws RemoteException;
    
}

//step 2 实现远程接口
//继承UnicastRemoteObject 获得远程相关功能;UnicastRemoteObject 的构造函数会抛出
//RemoteException 异常,因此继承它的子类,其构造函数也会抛出异常
public class MyRomoteImpl extends UnicastRemoteObject implements MyRomote {
    public String sayHello() {
        return "Server says, 'Hey'";
    }
    public MyRemoteImpl() throws RemoteException {};

    public static void main(String[] args) {
        //向 RMI registry 注册服务
        try {
            MyRemote service=new MyRemoteImpl();
            Naming.rebing("Remote Hello", service);
        } catch(Exception ex) {...}
    }
}
//客户端程序代码
import java.rmi.*;  // Naming类在此

public class MyRemoteClient {
    public static void main(String[] args) {
        new MyRemoteClient().go();
    }

    public void go() {
        try {
            MyRemote service=(MyRemote) Naming.lookup("rmi://127.0.0.1/Remote Hello");
            String s=service.sayHello();
            System.out.println(s);
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

Servlet

servlet是Web服务器上的Java程序,它不是Java的标准函数库的一部分,需要另行添加

相关内容有Enterprise JavaBeans(EJB),Jini

Jini具有:

  • adaptive discovery (自适应探索)

    Jini查询服务要求网络上的服务注册,并发送序列化对象给查询服务

  • self-healing network (自恢复网络)

    当某个Jini服务要求注册,查询服务会返回一份租约,新注册的服务需要定期更新服务否则查询服务会认为该服务离线

你可能感兴趣的:(远程部署的RMI)