RPC的概念
- RPC,全称是Remote Procdure Call,中文名为“远程过程调用”
RPC,即远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。——百度百科
- Hadoop的进程间交互都是采用的RPC协议,例如Namenode与Datanode之间
RPC的三个知识点
- Java代理设计模式的动态代理
- Java代码的反射原理
- Java的Socket通信
Hadoop中RPC的使用示例(远程登录调用)
需要导入的jar包
- common下的hadoop-common-2.6.5.jar(或者其他版本)
- common下lib文件夹的common相关依赖包
服务端Server
- LoginServiceInterface
/**
* 登录接口
*
* 客服端与服务端versionID必须相同
* 客服端与服务端该接口的包名必须相同
*
* @author ALion
* @version 2017/10/9 1:38
*/
public interface LoginServiceInterface {
public static final long versionID = 1L;
public String login(String account, String pwd);
}
- LoginServiceImpl
/**
* 具体实现类
*
* @author ALion
* @version 2017/10/9 1:37
*/
public class LoginServiceImpl implements LoginServiceInterface {
@Override
public String login(String account, String pwd) {
return account + " logged in " + ("123456".equals(pwd) ? "Successfully!" : "Failed!");
}
}
- ServerStarter
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
/**
* 服务启动类
*
* @author ALion
* @version 2017/10/9 1:40
*/
public class ServerStarter {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
RPC.Server server = new RPC.Builder(conf)
.setInstance(new LoginServiceImpl())
.setProtocol(LoginServiceInterface.class)
.setBindAddress("192.168.112.100")
.setPort(10000)
.build();
server.start();
}
}
客户端Client
- LoginServiceInterface
/**
* 登录接口
*
* 客服端与服务端versionID必须相同
* 客服端与服务端该接口的包名必须相同
*
* @author ALion
* @version 2017/10/9 1:43
*/
public interface LoginServiceInterface {
public static final long versionID = 1L;
public String login(String account, String pwd);
}
- UserLoginController
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
import java.net.InetSocketAddress;
/**
* 登录控制类
*
* @author ALion
* @version 2017/10/9 1:44
*/
public class UserLoginController {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
LoginServiceInterface proxy = RPC.getProxy(
LoginServiceInterface.class,
1L,
new InetSocketAddress("192.168.112.100", 10000),
conf
);
String result = proxy.login("laowang", "123456");
System.out.println(result);
}
}
使用说明
- 开启Server,运行ServerStarter的Main入口函数
- Client发送请求,运行UserLoginController的Main入口函数
- 打印结果