Remote Procedure Call(简称RPC):远程过程调用协议

1. 通过网络从远程计算机程序上请求服务

2. 不需要了解底层网络技术的协议(假定某些传输协议的存在,如TCP或UDP)

3. 采用客户机/服务机模式

请求程序就是一个客户机,服务提供程序就是一个服务器

例子:hadoop RPC机制的一个简单实现

1.导jar包,/share/hadoop/common 的相关的jar包 以及/share/hadoop/hdfs 相关的jar包

2.编程实现

1). 定义一个协议接口 如 Isay 接口

 public interface Isay {

    public static final long versionID=1234L;//前后一致

    public String say(String username);
}

2). 创建通信的服务端 (服务程序实现协议接口)

public class SayRpcServer implements Isay{

    //实现Isay接口
@Override
public String say(String username) {
// TODO Auto-generated method stub
System.out.println("server received data->["+username+"]");
return "Hello! ["+username+"]";
} public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
Configuration conf = new Configuration();
//创建builder对象
Builder builder = new RPC.Builder(conf);
//为builder设置服务对象,服务端地址,端口,定义代理协议
builder.setInstance(new SayRpcServer()).setBindAddress("Master").setPort(8001).setProtocol(Isay.class);
//创建 server
Server server = builder.build();
//启动 server
server.start();
System.out.println("server started");
} }

3).创建一个通信客户端

public class SayRpcClient {
private static Scanner sc; public static void main(String[] args) throws IOException { InetSocketAddress inetSocketAddress=new InetSocketAddress("Master", 8001);
Configuration conf=new Configuration();
//初始化 RPC 代理
Isay proxySay=RPC.getProxy(Isay.class, 1234L, inetSocketAddress, conf); System.out.println("请输入用户名(quit退出)");
//从控制台读入数据
sc=new Scanner(System.in);
while(sc.hasNext()) {
String userName=sc.next();
if("quit".equals(userName)) {//设定退出条件
System.out.println("RPC client exited");
return ;
}
String s=proxySay.say(userName);//远程调用
System.out.println(s);
System.out.println("请再输入姓名(quit退出)");
}
}
}

4)输出结果

1.启动服务端

server started

2.启动客户端

请输入用户名(quit退出)
Jack
Hello! [Jack]
请再输入姓名(quit退出)
Mark
Hello! [Mark]
请再输入姓名(quit退出)
quit
RPC client exited

同时server的输出结果

server started
server received data->[Jack]
server received data->[Mark]

最新文章

  1. webService学习之路(三):springMVC集成CXF后调用已知的wsdl接口
  2. 开源遥感平台opticks插件开发指南
  3. 分布式一致性原理—CAP
  4. Spring集成Quartz定时任务框架介绍和Cron表达式详解
  5. ASP.Net MVC @Html类
  6. Android进阶(十八)AndroidAPP开发问题汇总(二)
  7. 搭建Linux虚拟服务器
  8. 「洛谷3870」「TJOI2009」开关【线段树】
  9. web.xml配置文件的简单说明
  10. freemarker知识点
  11. 在win10企业版x64下使用curl命令
  12. php-fpm占用cpu和内存过高100% 解决办法
  13. sourceTree git的一些命令
  14. linux下md5sum用法 (查看文件或字符串的md5值)
  15. 【DDD】领域驱动设计实践 —— 业务建模战术
  16. 多目标进化算法(MOEA)概述
  17. Linux下的微秒级别的定时器
  18. 在原型设计上,UI和UX设计师有哪三个区别?
  19. 2017-2018-1 20155230 mypwd实现
  20. Android MMC/EMMC/MTD Partition Layout

热门文章

  1. AtCoder Beginner Contest 220部分题(G,H)题解
  2. Linux 文本三剑客之 sed
  3. 我罗斯方块最终篇(Player类、Game类)
  4. ExtJS 去除水印
  5. 大爽Python入门教程 0-1 安装python
  6. Java String 转成 二位数组
  7. Excel 读取写入数据库
  8. Maven中所用的Dependency查找方法
  9. C语言通过指针数组和二维数组读取文件
  10. GoLang设计模式16 - 模板方法模式