分布式通信架構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 服務端收到請求,先反序列化,在進行業務邏輯處理,把處理結果序列化傳回。