RPC遠程過程調用協議

RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。

RPC遠程過程調用協議

RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答覆信息,然後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,獲得進程結果,然後調用執行繼續進行。

有多種 RPC模式和執行。最初由 Sun 公司提出。IETF ONC 憲章重新修訂了 Sun 版本,使得 ONC RPC 協議成為 IETF 標準協議。現在使用最普遍的模式和執行是開放式軟件基礎的分佈式計算環境(DCE)。

hadoop整個體系就是建立在RPC通信的之上的,請見(org.apache.hadoop.ipc.RPC)

本例子是通過hadoop工具實現RPC通信原理的實例:

1、下面服務端和客戶端兩個文件以及要實現動態代理的接口:

RPCServer.java

package cn.com.leepeng.hadoop.rpc;
import java.io.IOException;
import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Builder;

import org.apache.hadoop.ipc.RPC.Server;
/**
* Demo RPC服務端
*
* @author LEEPENG
*
*/
public class RPCServer implements Bizable {
/**
* 客戶端調用的方法
*
* @param name
* @return
*/
public String sayHello(String name) {
return "hello:" + name;
}
public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
Configuration configuration = new Configuration();
Builder builder = new RPC.Builder(configuration);
//
builder.setProtocol(Bizable.class);
// 設置個實例,哪個實例對象的方法被調用,sayHello是RPCServer的實例方法被調用,所以傳new RPCServer()
builder.setInstance(new RPCServer());
// 綁定一個地址,根據具體IP設置
builder.setBindAddress("192.168.1.104");
// 綁定一個端口
builder.setPort(9527);
// 創建服務
Server server = builder.build();
// 啟動服務
server.start();
}
}

RPCClient.java

package cn.com.leepeng.hadoop.rpc;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
/**
* RPC客戶端,得到代理對象,調用RPCServer的方法

*
* @author LEEPENG
*
*/
public class RPCClient {
public static void main(String[] args) throws IOException {
// 得到代理對象
Bizable proxy = RPC.getProxy(Bizable.class, Bizable.versionID, new InetSocketAddress("192.168.1.104", 9527),
new Configuration());
String result = proxy.sayHello("RPC....");
System.out.println(result);
RPC.stopProxy(proxy);
}
}
package cn.com.leepeng.hadoop.rpc;
public interface Bizable {
public static final long versionID = 10086;
/**
* 此方法在客戶端被調用,客戶端要得到服務端的代理對象,實現動態代理,客戶端要和服務端同時實現一個接口
*
* @param name
* @return
*/
public String sayHello(String name);
}

這樣,先運行服務端,在運行客戶端,執行後客戶端會調用服務端的方法,因為是兩個main方法,所以是兩個不同的進程,如果不明顯的話,可以用下面的實驗測試。

現在,我將RPCClient客戶端打包成JAR文件放入到Linux服務器上,並在Linux服務器上運行客戶端

發現在Linux上運行客戶端走的是本地服務端的方法,這就是不同進程間的方法調用。

更多資訊歡迎訪問我的博客:https://www.leepeng.com.cn


分享到:


相關文章: