首先了解什么叫RPC,为何要RPC,RPC是指远程过程调用?
也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,因为不在一个内存空间,不能直接调用,须要经过网络来表达调用的语义和传达调用的数据。html
好比说,一个方法多是这样定义的:
Employee getEmployeeByName(String fullName)
那么:
首先,要解决通信的问题,主要是经过在客户端和服务器之间创建TCP链接,远程过程调用的全部交换的数据都在这个链接里传输。链接能够是按需链接,调用结束后就断掉,也能够是长链接,多个远程过程调用共享同一个链接。json
第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何链接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。好比基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。若是是RMI调用的话,还须要一个RMI Registry来注册服务的地址。服务器
第三,当A服务器上的应用发起远程过程调用时,方法的参数须要经过底层的网络协议如TCP传递到B服务器,因为网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),经过寻址和传输将序列化的二进制发送给B服务器。网络
第四,B服务器收到请求后,须要对参数进行反序列化(序列化的逆操做),恢复为内存中的表达方式,而后找到对应的方法(寻址的一部分)进行本地调用,而后获得返回值。框架
第五,返回值还要发送回服务器A上的应用,也要通过序列化的方式发送,服务器A接到后,再反序列化,恢复为内存中的表达方式,交给A服务器上的应用。ide
地址:https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html ;函数
为何RPC呢?
就是没法在一个进程内,甚至一个计算机内经过本地调用的方式完成的需求,好比好比不一样的系统间的通信,甚至不一样的组织间的通信。因为计算能力须要横向扩展,须要在多台机器组成的集群上部署应用;性能
RPC的协议有不少,好比最先的CORBA,Java RMI,Web Service的RPC风格,Hessian,Thrift,甚至Rest API。ui
关于Netty
Netty框架不局限于RPC,更多的是做为一种网络协议的实现框架,好比HTTP,因为RPC须要高效的网络通讯,就可能选择以Netty做为基础。除了网络通讯,RPC还须要有比较高效的序列化框架,以及一种寻址方式。若是是带会话(状态)的RPC调用,还须要有会话和状态保持的功能。编码
大致上来讲,Netty就是提供一种事件驱动的,责任链式(也能够说是流水线)的网络协议实现方式。网络协议包含不少层次,不少部分组成,如传输层协议,编码解码,压缩解压,身份认证,加密解密,请求的处理逻辑,怎么可以更好的复用,扩展,业界通用的方法就是责任链,
一个请求应答网络交互一般包含两条链,一条链(Upstream)是从传输层,通过一系列步骤,如身份认证,解密,日志,流控,最后到达业务层,一条链(DownStream)是业务层返回后,又通过一系列步骤,如加密等,又回到传输层。
这样每一层都有一个处理接口,均可以进行不一样的操做,好比身份认证,加解密,日志,流控,将不一样的处理实现像拼积木那样插接起来就能够实现一个网络协议了(快速开发)。每一层都有本身的实现,上层不须要关注面向网络的操做(可维护)。Netty已经提供了不少实现。
固然Netty还有许多好处,好比对非阻塞IO(NIO)的支持,好比在链上传递时最大程度的减小buffer的copy(高性能)。
地址:http://docs.jboss.org/netty/3.1/guide/html/architecture.html ;
1. Netty只是网络通讯框架,目的是让你用最少的代码构建出足够支撑网络通讯的功能。2.完成RPC 须要两个协议: 对象序列化协议 和 调用控制协议常见例子举例:1.zeroC ICE,拥有本身的网络通讯框架 + ICE 调用控制协议和对象序列化协议,同时也涵盖了服务组件的抽象部署等功能。2.thrift,有本身的网络通讯框架+thrift 对象序列化协议+thrift 调用控制协议3.probuff,只是 对象序列化协议4.XMLRPC ,jsonRPC,常见的语境是利用HTTP协议做为调用控制协议,XML 和 JSON 做为对象序列化以后的格式。5.其余的大概也差很少了。