示例:演示RPC实现远程代码调用。
第一步:本示例不需要启动程序start-dfs.sh、start-yarn.sh。
第二步:在Linux端创建一个Java项目,导包(只需要导入commons下的jar包就可以了),然后在其中依次创建如下代码:
- 接口:
public interface UserService {
public static final long versionID = 1L;
public boolean login(String username, String password);
}
- 接口实现类:
public class UserServiceImpl implements UserService {
@Override
public boolean login(String username, String password) {
if ("abc".equals(username) && "123".equals(password)) {
System.out.println("登录成功");
return true;
} else {
System.out.println("登录失败");
return false;
}
}
}
- Server
public class RPCServer {
public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
Configuration conf = new Configuration();
RPC.Builder builder = new RPC.Builder(conf);
builder.setInstance(new UserServiceImpl())
.setBindAddress("hc")
.setPort(6868)
.setProtocol(UserService.class);
Server server = builder.build(); // 创建Server端的socket
server.start();
}
}
第二步:在Windows端创建一个Java项目,导包(只需要导入commons下的jar包就可以了),然后在其中依次创建如下代码:
- 接口:
public interface UserService {
public static final long versionID = 1L;
public boolean login(String username, String password);
}
注意:要求两个UserService接口所在的包的名字相同,否则客户端连接服务器端时会报错。
- client
public class RPCClient {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
InetSocketAddress socketAddr = new InetSocketAddress("hc", 6868);
UserService userService = RPC.getProxy(UserService.class, 1L,
socketAddr, conf);
boolean res = userService.login("abc", "123");
System.out.println(res);
}
}
运行程序:先运行RPCServer,发现程序启动启动起来后一直在运行,等着客商请求;再运行RPCClient,在其终端输出字符"true",同时发现在Linux的终端中输出了"登录成功"的字样。