1. 程式人生 > 其它 >Java程式設計師秋招三面螞蟻金服,Rpc與RMI服務

Java程式設計師秋招三面螞蟻金服,Rpc與RMI服務

Java程式設計師秋招三面螞蟻金服,Rpc與RMI服務

}
@Override
public User getUserByName(String name) throws RemoteException{
return new User(name, 654321);
}
}


 這裡我們構造了一個User實體,為了能實現遠端傳輸,所以這裡我們將其進行序列化:

```java
public class User implements Serializable {
    private static final long serialVersionUID = 42L;
    
    private String name;
    private String passWord;

    public String getName(){
        return this.name;
    }
    
    public String getPassWord(){
        return this.passWord;
    }
    
    public void setName(String name){
        this.name = name;
    }
    
    public void setPassWord(String passWord){
        this.passWord = passWord;
    }
    
    public User(String name, String passWord) {
        this.name = name;
        this.passWord = passWord;
    }
}

需要注意的一點是,如果jdk版本低於1.5,需要手動執行rmic命令生成實現類的Stub物件,而1.5開始使用動態代理技術,已經可以自動生成Stub物件了,做完這些就可以啟動服務端了:

UserHandler userHandler = null;
try {
    userHandler = new UserHandlerImpl();
    Naming.rebind("user", userHandler);//將當前的例項與名稱為user繫結,後面客戶端呼叫查詢對應的名稱
    System.out.println(" RMI 服務端啟動成功");
} catch (Exception e) {
    System.err.println(" RMI 服務端啟動失敗");
    e.printStackTrace();
}

構建RMI登錄檔

其實所謂登錄檔就是儲存了RMI服務端啟動與繫結的名稱的程序,由於jdk已經把RMI程式碼整合到了JDK中,RMI的登錄檔其實不需要寫任何程式碼,在JDK的bin目錄下已經存在一個叫rmiregistry.exe的程式,不過我們需要在當前的class類路徑下啟動登錄檔(所以需要注意JAVA_HOME環境變數一定要配置成功) ,來到class類路徑下,輸入命令:

rmiregistry 9999

即可指定rmi的登錄檔在9999埠中執行,如果不指定埠,預設使用1099,當然不想讓RMI的登錄檔在前臺顯示,也可以輸入後臺執行命令:

start rmiregistry

構建RMI客戶端

前面服務端和登錄檔都已經執行起來了,接下來我們需要的就是客戶端發起訪問的請求了,需要注意的是,User例項類和UserHandler介面在客戶端程式碼中也有一份(企業開發過程中會依賴同一份程式碼),所以這裡的客戶端呼叫程式碼如下:

try {
    UserHandler handler = (UserHandler) Naming.lookup("user");//這裡使用的user是服務端啟動的時候繫結的名稱
    String passWord = handler.getUserPassWord();
    String name = handler.getUserName(1);
    System.out.println("name: " + name);
    System.out.println("passWord: " + passWord);
    System.out.println("user: " + handler.getUserByName("pdc"));
} catch (Exception e) {
    e.printStackTrace();
}

這樣就可以獲取到服務端的遠端物件的資訊了,當然這裡有兩點需要注意:

1.這裡的UserHandler實體類和服務端的UserHandler介面所在的包名需要一致,即使用的限定全類名需要一致,否則會報如下的錯誤:

2.我們這裡獲取的User例項屬於引用型別,需要注意的是獲取到的User例項物件也必須和服務端的包名一致,即限定全類名相同,否則,handler.getUserByName("pdc")方法呼叫的結果會報錯,如下所示:

自定義啟動RMI登錄檔

在本篇的結尾,我們來個彩蛋,還記得上面RMI的登錄檔嗎?前面我們是通過JDK的exe程式啟動的,那麼我們能不能自己開發或者自己啟動RMI登錄檔呢?其實是可以的,在java.rmi.registry包中有個Registry介面,並且該介面有個預設的實現類LocateRegistry,其實JDK原始碼中Naming類就是使用的LocateRegistry實現的註冊和呼叫,那麼我們來看看LocateRegistry的方法:

createRegistry(int port)
createRegistry(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf)
getRegistry()
getRegistry(int port)
getRegistry(String host)
getRegistry(String host, int port)
getRegistry(String host, int port, RMIClientSocketFactory csf)

可以看到這裡有兩個建立登錄檔的方法,一個只有埠,開啟的預設是本機的登錄檔,另外一個是可以輸入ip,埠,以及一些連線策略的自定義登錄檔,還有幾個獲取登錄檔的方法,很明顯這裡提供了登錄檔的建立和呼叫的方法,同樣的我們之前的服務端程式碼只要稍微改動一下,如下:

UserHandler userHandler = null;
Registry registry = LocateRegistry.createRegistry(9999);;
try {
    userHandler = new UserHandlerImpl();
    registry.rebind("user", userHandler);//將當前的例項與名稱為user繫結,後面客戶端呼叫查詢對應的名稱
    System.out.println(" RMI 服務端啟動成功");
} catch (Exception e) {
    System.err.println(" RMI 服務端啟動失敗");
    e.printStackTrace();
}

很明顯申明一下注冊表,並且使用登錄檔替換Naming來繫結服務例項即可,客戶端亦是如此,修改後的程式碼如下:

try {
    
    Registry registry=LocateRegistry.getRegistry("127.0.0.1",9999);
    UserHandler handler = (UserHandler) registry.lookup("user");//這裡使用的user是服務端啟動的時候繫結的名稱
    String passWord = handler.getUserPassWord();
    String name = handler.getUserName(1);
    System.out.println("name: " + name);
    System.out.println("passWord: " + passWord);
    System.out.println("user: " + handler.getUserByName("pdc"));
} catch (Exception e) {
    e.printStackTrace();
}

這樣就完成了和之前一樣的服務釋出與呼叫過程了

今日福利(點選下方文字超連結獲取)




如果你的技術提升遇到瓶頸了,或者缺高階Android進階視訊學習提升自己,這有大量大廠面試題為你面試做準備!
點選Android 學習,面試文件,視訊收集大整理獲取

結尾

這不止是一份面試清單,更是一種”被期望的責任“,因為有無數個待面試者,希望從這篇文章中,找出通往期望公司的”鑰匙“,所以上面每道選題都是結合我自身的經驗於千萬個面試題中經過艱辛的兩週,一個題一個題篩選出來再次對好答案和格式做出來的,面試的答案也是再三斟酌,深怕誤人子弟是小,影響他人仕途才是大過,也希望您能把這篇文章分享給更多的朋友,讓他幫助更多的人,幫助他人,快樂自己,最後,感謝您的閱讀。

資料領取方式:戳這裡免費獲取

由於細節內容實在太多啦,在這裡我花了兩週的時間把這些答案整理成一份文件了,在這裡只把部分知識點截圖出來粗略的介紹,每個小節點裡面都有更細化的內容!