天天看點

分布式專題學習筆記——分布式通信架構RMI

分布式通信架構RMI

1.什麼是rpc?

Remote Procedure call protocal

prc協定其實是一個規範,Dubbo,Thrif,RMI,WebService,Hessain

網絡協定和網絡io對于調用者和服務來說是透明的

一個rpc應該包含的要素

RMI的概述:

RMI(remote method invocation)可以認為是java的rpc版本

RMI使用的是JRMP(Java Remote Method Protocal),JRMP是專門為java定制的通信協定,是以是純java的分布式解決方案。

如何實作一個RMI程式

1 建立遠端接口,并且繼承 java.rmi.Remote 接口

public interface IsSayHello extends Remote{
    public String sayHllo(String name) throws RemoteException;
}
           

2 實作遠端接口,并且繼承 UnicastRemoteObject 接口

public class SayHelloImpl extends UnicastRemoteObject implements IsSayHello{

    public SayHelloImpl() throws RemoteException {
    }

    @Override
    public String sayHllo(String name) throws RemoteException {
        return "小明———》"+name;
    }
}
           

3 建立伺服器程式:createRegistry方法注冊遠端對象

public class HelloServer {
    public static void main(String[] args){
        try {
            try {
                IsSayHello sayHello = new SayHelloImpl();
                LocateRegistry.createRegistry(8888);
                Naming.bind("rmi://localhost:8888/sayhello",sayHello);
                System.out.println("server start success");
            } catch (AlreadyBoundException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
           

4 建立用戶端程式

public class HelloClient {
    public static void main(String[] args){
        try {
            IsSayHello hello = (IsSayHello)Naming.lookup("rmi://localhost:8888/sayhello");
            System.out.println(hello.sayHllo("hello 菲菲"));
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
           

如果自已要實作一個RMI

1 編寫伺服器程式,暴露一個監聽,可以用socket

2 編寫用戶端程式,通過ip和端口連接配接指定的伺服器,并且将資料做封裝(序列化)

3  服務端收到請求,先反序列化,在進行業務邏輯處理,把處理結果序列化傳回。

繼續閱讀