RPC(Remote Procedure Call)—遠程過程調用協議,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。java
RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息的到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行。apache
Hadoop的整個體系結構就是構建在RPC之上的(見org.apache.hadoop.ipc包)服務器
使用RPC: (搭建一個Hadoop僞分佈式虛擬機(Server端), 本地Windows鏈接該虛擬機(Client端))網絡
1. 定義RPC協議接口 LoginProtocol (Hadoop RPC協議一般是一個Java接口), RPC協議接口是Client和Server之間的通訊接口, 它定義了Server對外提供的接口. LoginProtocol接口聲明瞭一個login()方法, 須要注意的是Hadoop中全部自定義的RPC協議接口都有一個爲versionID的字段, 它描述了該協議的版本信息, 這個RPC協議接口爲Client/Server共同持有, Server端, Client端都必須有同一個LoginProtocol.class文件分佈式
public interface LoginProtocol { public static final long versionID = 1L; public String login(String username, String password); }
2. 在Server端, LoginProtocolImpl 實現RPC協議接口( LoginProtocol )ide
public class LoginProtocolImpl implements LoginProtocol { @Override public String login(String username, String password) { return "wellcome " + username; } }
3. 在Server端構造並啓動RPC Server, "192.168.8.101"是Server的ip地址, Server端監聽了"1234"端口oop
public static void main(String[] args) throws HadoopIllegalArgumentException, IOException { // 設置4個必需參數: // setBindAddress("192.168.8.101") : Server端的IP地址 // setPort(1234) : 端口 // setProtocol(LoginProtocol.class) : setRPC協議接口的class對象 // setInstance(new LoginProtocolImpl()) : RPC協議接口的實現類的實例 Server server = new RPC.Builder(new Configuration()).setBindAddress("192.168.8.101").setPort(1234) .setProtocol(LoginProtocol.class).setInstance(new LoginProtocolImpl()).build(); server.start(); } }
4. 在Client端構造RPC客戶端, 使用RPC類靜態方法getProxy()構造客戶端RPC代理對象( proxy ), 調用RPC代理對象( proxy )的login()方法, 發送RPC請求. "192.168.8.101"是Server的ip地址, "1234"是Server端監聽端口ui
public class LoginClient { public static void main(String[] args) throws IOException { // getProxy()參數: // LoginProtocol.class : RPC協議接口的class對象 // 1L : RPC協議接口的版本信息(versionID) // new InetSocketAddress("192.168.8.101", 1234) : Server端的IP地址及端口 // conf : Configuration實例 LoginProtocol proxy = RPC.getProxy(LoginProtocol.class, 1L, new InetSocketAddress("192.168.8.101", 1234), new Configuration()); String result = proxy.login("rpc", "xxx"); System.out.println(result); } }
接下來, 神奇的一幕發生了!spa
本地Windows的Console輸出:代理
wellcome rpc
本地Windows有LoginProtocol接口的實現嗎?
沒有喲!
至此, 利用Hadoop RPC搭建了一個簡單的Client/Server分佈式網絡模型, 之後還會深刻Hadoop RPC內部