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 如果客戶端能夠調用到服務端對象的方法,那麼這些方法一定位於對象的接口中。