关于RPC首先了解什么是RPC,为什么要RPC,RPC指的是远程过程调用,也就是说两台服务器A,B,一个应用程序部署在A上服务器端,如果要调用B服务器上的应用程序提供的函数/方法,由于不在同一个内存空间,不能直接调用。您需要表达调用的语义并通过网络传递调用数据。例如,一个方法可以这样定义:EmployeegetEmployeeByName(StringfullName)那么:首先解决通信问题,主要是在客户端和服务器之间建立一个TCP连接,传输远程过程调用的所有交换数据在这方面。连接可以是按需连接,调用完成后断开,也可以是长连接,多个远程过程调用共享同一个连接。二、解决寻址的问题,也就是说A服务器上的应用程序如何告诉底层的RPC框架,如何连接到B服务器(比如主机或者IP地址)以及具体的端口,什么是方法的名字,这样就完成了调用。例如,基于Web服务协议栈的RPC需要提供端点URI,或者从UDDI服务中搜索。如果是RMI调用,还需要一个RMIRegistry来注册服务的地址。第三,当服务器A上的应用程序发起远程过程调用时,方法的参数需要通过底层网络协议如TCP传递给服务器B。由于网络协议是基于二进制的,所以必须将内存中参数的值序列化为二进制形式,即序列化(Serialize)或编组(marshal),将序列化后的二进制通过寻址和传输发送给B服务器。第四,服务器B收到请求后,需要反序列化参数(序列化的逆操作),恢复内存中的表达式,然后在本地找到对应的方法(寻址的一部分)调用,然后得到返回值。第五,返回值必须返回给服务器A上的应用程序,而且必须序列化发送。服务器A收到后,反序列化,还原为内存中的表达式,交给服务器A上的应用(图片来源:https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html)为什么是RPC?只是不能通过本地调用需求在一个进程中甚至在计算机中完成,比如不同系统之间的通信,甚至不同组织之间的通信。由于计算能力需要横向扩展,应用需要部署在多台机器组成的集群上。RPC协议有很多,比如最早的CORBA、JavaRMI、WebService的RPC风格、Hessian、Thrift,甚至还有RestAPI。关于Netty,Netty框架并不局限于RPC,更多的是作为一种网络协议的实现框架,比如HTTP。由于RPC需要高效的网络通信,所以可能会选择以Netty为基础。除了网络通信,RPC还需要更高效的序列化框架和寻址方式。如果是带有会话(状态)的RPC调用,还需要会话和状态保存的功能。一般来说,Netty提供了一个事件驱动的、责任链(或管道)网络协议实现。网络协议由很多层和很多部分组成,比如传输层协议,编码解码,压缩解压,身份认证,加解密,请求处理逻辑,如何更好的复用和扩展,业界通用的方法是责任链,一个请求-响应网络交互通常包括两条链,一条链(Upstream)来自传输层,经过身份认证、解密、日志记录、流量控制、***到业务层,而一条链(DownStream)是业务层返回后,经过一系列的步骤,比如加密,返回到传输层。(来源:ChannelPipeline(TheNettyProjectAPIReference(3.2.6.Final)))这样每一层都有一个处理接口,可以进行不同的操作,比如身份认证、加解密、日志记录、流量控制、不同的处理实现可以像积木一样插在一起,实现一个网络协议(快速开发)。每一层都有自己的实现,上层不需要关注面向网络的操作(可维护)。Netty已经提供了很多实现。(图片来源:http://docs.jboss.org/netty/3.1/guide/html/architecture.html)当然Netty也有很多好处,比如支持非阻塞IO(NIO),比如当在链上传递最小化缓冲区副本(高性能)。
