RPC,即Remote Procedure Call,远程过程调用,是进程间通信(IPC, Inter Process Communication)技术的一种。由于这项技术在自己所在项目(Windows产品)中使用很多,因此周末学习总结一下。这里研究的主要是微软的RPC技术。

  程序间的RPC通信既可以在同一台计算机,或者同一个本地网络,也可以是互联网两台机器间,因此在分布式计算环境中应用很广。RPC采用客户机/服务器(C/S)模式,客户机负责发送请求,服务器响应请求,返回客户机请求的数据,达到通信的目的。通过在项目代码中的学习,我的理解是客户机和服务器共同维护一个命令列表,程序员开发时新建一条命令,发送请求时命令作为第一个参数,服务器通过命令来调用正确的处理程序,返回客户机需要的信息。

  学习RPC首先要明确几个概念: 

  一. RPC概念学习

  1. Client(客户机)

    一个进程,可以是一个程序或任务,用来请求服务,发送RPC请求(可以是同步,指客户机程序一直hang在那里,等待服务器的响应,也可以是异步方式,即不会等待,继续向下执行代码)到服务器,这里的RPC服务由微软windows的Services提供,我们不需要了解细节。

  2. Server(服务器)

    一个进程,可以是一个程序或任务,用来响应服务,接收RPC请求,并作出响应。

  3. EndPoint(端点)

    可以是一个端口,或者一组端口,由Server的RPC Services监听(Listen),以便实时监听到客户机发出的请求。

  4. Client Stub(不知该如何翻译。。)

    客户端程序中的一个模块,负责调用marshalling engine(提供了Client和Server的公共RPC接口,有NDR20和NDR64两种,win32程序使用NDR20,x64程序使用NDR64,Client和Server选择其中一种使用)和一些其他RPC API。

  5. Server Stub(同上)

    有Client Stub,就会有Server Stub,同样是Server的一个模块,通过本地过程调用( local procedure calls)来处理收到的远程请求。

  

  二. 一个完整的RPC通信过程

   

               图一

  通信从客户端发起请求开始,客户端程序发送请求时调用Client Stub,Client Stub拿到请求的参数并把信息推送到Client Runtime Library,Client Runtime Library负责将参数转换成标准的网络参数(Network Data Representation,简称NDR,即通过marshalling engine(NDR20或者NDR64)转换),并通过程序发送至服务器,服务器程序监听端口,拿到请求后,发出响应,客户机程序得到响应,具体可参加图一。

  

  三. RPC技术架构

    

           图二

  上图是RPC的技术架构图,来源于微软的技术社区,通过上图,可以较清楚的看到RPC过程中涉及的组件和技术。其中Local RPC只适用于客户端程序和服务器程序位于同一台机器时。另外RPC技术发送Local请求时使用ncalrpc协议,发送Remote请求时使用ncacn_ip_tcp或者ncacn_np协议,前者微软更推荐。

  

  四. 总结

  目前自己对于RPC的学习与理解是这样,本来想实现一个小的例子,但是微软提供的Sample目前还没找到(在win7 sdk中有),如果有时间,一定实现一个例子,让学习总结更深刻些。(PS:由于本人懒惰,RPC的学习本应在几天前完成,但一直拖到周末,今后要克服拖延的毛病)。

  由于学习时间较短,文中内容主要参考微软技术文档,若有理解不当之处,请大家指正:-)

  

  五. 参考资料

  1. RPC Technical Reference

    http://technet.microsoft.com/en-us/library/cc787851(v=ws.10).aspx

  2. Microsoft RPC Model

    http://msdn.microsoft.com/en-us/library/aa374172(v=vs.85).aspx

  3. RPC编程

    http://www.ibm.com/developerworks/cn/aix/library/au-rpc_programming/#ibm-pcon

  Best Regards

  Kevin Song

最新文章

  1. VS2012程序打包部署详解
  2. [NHibernate]利用LINQPad查看NHibernate生成SQL语句
  3. eval()与jQuery.parseJSON()的差别以及常见的解析缺少分号的问题
  4. CSS模版收集
  5. NOIP 2014 普及组 T3 螺旋矩阵
  6. JS图片加载失败显示默认图片
  7. Tornado (and Twisted) in the age of asyncio》
  8. mongodb分组,的两种方式,先记一下
  9. ionic cordova plugin simple demo
  10. 李洪强iOS开发之使用 Reachability 检测网络
  11. 非常可乐(bfs)
  12. 【j2ee】div浮动层拖拽
  13. nettyclient异步获取数据
  14. Nhibernate学习教程(2)-- 第一个NHibernate程序
  15. Gulp-静态网页模块化
  16. Understanding Android Security(安卓安全的理解)
  17. django第三天
  18. MySQL千万级数据库查询怎么提高查询效率
  19. P1168 中位数
  20. setfacl语法2

热门文章

  1. 雷林鹏分享:jQuery EasyUI 数据网格 - 添加查询功能
  2. 架构师 AI 技术
  3. Oracle 11g服务OracleDBConsoleorcl启动失败(异常或报错)
  4. java 常用操作(保留小数位数、int转string,string转int)
  5. 原 tomcat的server.xml配置文件中三个端口的作用
  6. mysql 操作数据库创建,增删改查
  7. python django 基本测试
  8. java 各进程功能java,javac,javaw,javaws,javap
  9. [转]how can I change default errormessage for invalid price
  10. fuser解决The requested resource is busy