1.RPC 概念
RPC:远程过程调用
(1)它允许一台计算机调用另一台计算机的子程序,不用关心底层网络通信细节,通常使用在分布式网络通信中。
(2)Hadoop 进程之间交互都是通过 RPC 来进行的,如 Namenode 与 Datanode 直接通信,jobtacker 与 Tasktracker 之间。
2.RPC 的特点
(1)透明性:远程调用其他机器的程序
(2)高性能:Server 并发处理来自多个 Client 的请求
(3)可控性:Java 中已经提供一个 RPC 框架,但是 Hadoop RPC 实现自定义的 RPC 框架
3.定义一个RPC通信接口。
/**
* Created by hubo on 2017/11/30
* 定义一个 RPC 通信接口
*/
public interface LoginServiceProtocal {
final long versionID = 1L; //版本号,不同版本号的 client 和 server 之间不能通信
String login(String username, String password);
}
默认情况下,不同版本号的RPC Client和Server之间不能相互通信,因此客户端和服务端通过版本号标识。VERSION 就是版本号。
4.实现 RPC 协议
RPC 协议通常是一个 Java 接口,用户实现接口方法:
/**
* Created by hubo on 2017/11/30
*/
public class LoginService implements LoginServiceProtocal{
@Override
public String login(String username,String password){
return "成功调用";
}
}
5.构造 RPC server 并启动服务
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.Server;
import java.io.IOException;
/**
* Created by hubo on 2017/11/30
*/
public class ServicePublisher {
public static int PORT = 5432;
public static String IPAddress = "127.0.0.1";
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
RPC.Builder builder = new RPC.Builder(conf);
builder.setBindAddress(IPAddress)
.setPort(PORT)
.setProtocol(LoginServiceProtocal.class)
.setInstance(new LoginService());
Server server = builder.build(); //创建 sorck 服务器
server.start();
}
}
主要是创建的 RPC.Builder
6.构造 RPC Client 并发出请求
import HadoopRPC.LoginServiceProtocal;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
import java.net.InetSocketAddress;
/**
* Created by hubo on 2017/11/30
*/
public class ClientDemo {
public static int PORT = 5432;
public static String IPAddress = "127.0.0.1";
public static void main(String[] args) throws IOException {
LoginServiceProtocal loginService =
RPC.getProxy
(LoginServiceProtocal.class,
1L,
new InetSocketAddress(IPAddress,PORT),
new Configuration());
String result = loginService.login("angloaksd","1314521");
System.out.println(result);
}
}
7.查看运行结果
(1)启动服务端,开始监听客户端请求
可以查看多出一个进程15411就是服务端启动成功
(2)启动客户端查看是否调用