前言:以前对于RPC方面的学习多限于对RMI原理的学习,直到今天在看陈康贤前辈的《大型分布式网站架构-设计与实践》这本书的时候,才发现原来RPC能够基于TCP协议也能够基于HTTP协议(这里所说的TCP协议与HTTP协议更多的是指服务的消费者与远端的提供方的一种链接或消息传送形式),在此就简单记录一下,做为以后研究其它相似框架的基础。java
RPC全称Remote Process Call,即远程过程调用,其在服务的调用方与服务的提供方的调用大体以下图所示(左边为一对一,右边为多对多)。在理解PRC基于这两种协议前,首先要明确RPC的主要目的只是获取由远程机器上的程序所执行的结果。服务器
在Java中,能够利用Socket API实现基于TCP协议的RPC调用,由服务的调用方与服务的提供方创建Socket链接,并由服务的调用方经过Socket将须要调用的接口名称、方法名称和参数序列化后传递给服务的提供方,服务的提供方反序列化后再利用反射调用相关的方法,最后将结果返回给服务的调用方。整个基于TCP协议的PRC调用大体如此,可是在实例应用中则会进行一系列的封装,譬如RMI即是在TCP协议上传递可序列化的java对象。网络
而基于HTTP协议的RPC调用则更像是咱们访问网页同样,只是它的返回结果更加单一简单。其大体流程为:由服务的调用者向服务的提供者发送请求,这种请求的方式多是GET、POST、PUT、DELETE等中的一种(服务的提供者可能会根据不一样的请求方式作出不一样的处理,或者某个方法只容许某种请求方式),而调用的具体方法则根据URL进行方法调用,而方法所需参数则多是对服务调用方传输过去的XML数据或JSON数据解析后的结果,最后返回JOSN或XML的数据结果(这须要根据实际应用定义相关的协议)。因为目前有不少开源的WEB服务器,如Tomcat,JBoss等,因此其实现起来更加容易(就跟作Web项目同样)。架构
而基于TCP协议实现的RPC调用,因为TCP协议处于协议栈的下层,可以更加灵活地对协议字段进行定制,减小网络开销,提升性能,实现更大的吞吐量和并发数。可是须要更多地关注底层复杂的细节,实现的代价更高。同时对于不一样平台(如安卓、IOS等),须要从新开发出不一样的工具包来进行请求发送和响应解析,工做量大,难以快速响应和知足 用户需求。并发
基于HTTP协议实现的RPC则能够使用JSON和XML格式的请求或响应数据,而JSON和XML做为通用的格式标准,开源的解析工具已经至关成熟,在其上进行二次开发会很是便捷和简单。可是因为HTTP协议是上层协议,发送包含同等内容的信息,使用HTTP协议传输所占用的字节数会比使用TCP协议传输所占用的字节数更高。所以,同等网络环境下,经过HTTP协议传输相同内容,效率会比基于TCP协议的数据效率要低,信息传输所占的时间也会更长,固然使用gzip压缩数据,可以缩小这一差距。框架
注:以上仅为我的笔记,未做详细分析,甚至因为我的知识面的不足,会显得特别粗糙,若有错误或不当的地方,还请指正。另外,本文后两段摘抄至陈康贤前辈的《大型分布式网站架构-设计与实践》,如需了解更多详细内容,请阅读原书。分布式