rpc

RPC——遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。
RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息的到達爲止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答覆信息,然後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,獲得進程結果,然後調用執行繼續進行。


hadoop的整個體系結構就是構建在RPC之上的(見org.apache.hadoop.ipc)。


服務端:

package rpc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;

public class MyServer {
	static final String ADDRESS = "localhost";
	static final int PORT = 12345;
	public static void main(String[] args)throws Exception {
		/** 
		 * 構造一個RPC的服務端.
	     * @param instance 這個實例中的方法會被調用
	     * @param bindAddress 綁定的地址是用於監聽連接的
	     * @param port 綁定的端口是用於監聽連接的
	     * @param conf the configuration to use
	     */
		final Server server = RPC.getServer(new MyBiz(), ADDRESS, PORT, new Configuration());
		server.start();
	}

}



客戶端:
package rpc;

import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

public class MyClient {

	public static void main(String[] args) throws Exception{
		/** 
		 * 構造一個客戶端代理對象,該代理對象實現了命名的協議。代理對象會與指定地址的服務端通話
		 */
		MyBizable proxy = (MyBizable)RPC.waitForProxy(
					MyBizable.class,
					MyBizable.VERSION,
					new InetSocketAddress(MyServer.ADDRESS, MyServer.PORT),
					new Configuration());
		final String result = proxy.hello("world");
		System.out.println("客戶端結果:"+result);
		//關閉網絡連接
		RPC.stopProxy(proxy);
	}

}


MyBizable
package rpc;

import org.apache.hadoop.ipc.VersionedProtocol;

public interface MyBizable extends VersionedProtocol{
	long VERSION = 2345245L;
	public abstract String hello(String name);
}


package rpc;

import java.io.IOException;

public class MyBiz implements  MyBizable{
	
	/* (non-Javadoc)
	 * @see rpc.MyBizable#hello(java.lang.String)
	 */
	@Override
	public String hello(String name){
		System.out.println("我被調用了");
		return "hello "+name;
	}

	/* (non-Javadoc)
	 * @see rpc.MyBizable#getProtocolVersion(java.lang.String, long)
	 */
	@Override
	public long getProtocolVersion(String arg0, long arg1) throws IOException {
		return VERSION;
	}
}


1.RPC
    1.1 RPC (remote procedure call)遠程過程調用.
        遠程過程指的是不是同一個進程。
    1.2 RPC至少有兩個過程。調用方(client),被調用方(server)。
    1.3 client主動發起請求,調用指定ip和port的server中的方法,把調用結果返回給client。
    1.4 RPC是hadoop構建的基礎。
2. 通過例子獲得的認識?
    2.1 RPC是一個遠程過程調用。
    2.2 客戶端調用服務端的方法,意味着調用服務端的對象中的方法。
    2.3 如果服務端的對象允許客戶端調用,那麼這個對象必須實現接口。
    2.4 如果客戶端能夠調用到服務端對象的方法,那麼這些方法一定位於對象的接口中。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章