RPC框架-RMI、RPC和CORBA的區別


關鍵詞:RMI RPC CORBA
簡 介:本篇文章重點闡述RMI,附帶介紹RPC和CORBA

Java遠程方法調用(Java RMI)是一組實現了遠程方法調用(rmi)的API。
  • java RMI是遠程程調用(RPC)的面向對象版等價概念,它還支持序列化的java類的直接轉換以及分布式的垃圾回收(DGC)。
  • 換句話說,java RMI是面向對象的遠程調用,屬於PRC的一種特例。

  • RMI的最初實現依賴於java虛擬機的類展現機制,故其只支持從一個JVM到另一個JVM的調用。底層協議只支持java實現就是java遠程方法協議(JRMP)

  • 為了支持運行在一個非JVM上下文的代碼,開發人員后來開發了一個CORBA版本(javax.rmi.CORBA)

一個典型的Java RMI實現模型使用了stub和skeleton對象。java 1.2移除了skeleton
  java1.2移除了skeleton對象

  下面是一個java  RMI的例子:

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.*; 
public class RmiServer extends UnicastRemoteObject implements RmiServerIntf {
    public static final String MESSAGE = "Hello World";

    public RmiServer() throws RemoteException {
        super(0);    // required to avoid the 'rmic' step, see below
    }

    public String getMessage() {
        return MESSAGE;
    }

    public static void main(String args[]) throws Exception {
        System.out.println("RMI server started");

        try { //special exception handler for registry creation
            LocateRegistry.createRegistry(1099); //一個JVM可以創建一個記錄器
            System.out.println("java RMI registry created.");
        } catch (RemoteException e) {
            //do nothing, error means registry already exists
            System.out.println("java RMI registry already exists.");
        }
           
        //Instantiate RmiServer

        RmiServer obj = new RmiServer();

        // Bind this object instance to the name "RmiServer"
        Naming.rebind("//localhost/RmiServer", obj);//通過Naming源碼可知,rebind方法將RmiServer類型的對象記錄到了本地記錄器
        System.out.println("PeerServer bound in registry");
    }
}
View Code
import java.rmi.Remote;
import java.rmi.RemoteException;

/**
*這個接口需要提供給客戶端,也就是提供服務getMessasge()
*/
public interface RmiServerIntf extends Remote {
    public String getMessage() throws RemoteException;
}
View Code
import java.rmi.Naming;

/**
*這個就是客戶端
*/
public class RmiClient { 
    public static void main(String args[]) throws Exception {
        //客戶端運用了服務器暴露的接口,也叫stub(存根)
        RmiServerIntf obj = (RmiServerIntf)Naming.lookup("//localhost/RmiServer");
        System.out.println(obj.getMessage()); 
    }
}
View Code

***stub,存根,這個詞有點像會計學里的術語,想想坐公交、飛機,售票員總會留個底,你持有票據的另一半,這樣雙方就不會引起誤會扯皮了。服務器提供的這個存根也是同理,就相當於一層協議,好讓客戶端請求服務器提供的服務。當然了,除了核心機制,計算機和現實的售票存在較大差異。

上面的例子,我是運行在了一台機器上,大家可以試試多台機器的遠程調用,或者多個JVM之間進行調用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM