早期单机时代,一台电脑上运行多个进程,大家各干各的,老死不相往来。假如A进程需要一个画图的功能,B进程也需要一个画图的功能,程序员就必须为两个进程都写一个画图的功能。这不是整人么?于是就出现了IPC(Inter-process communication,单机中运行的进程之间的相互通信)。OK,现在A既然有了画图的功能,B就调用A进程上的画图功能好了,程序员终于可以偷下懒了。
到了网络时代,大家的电脑都连起来了。以前程序只能调用自己电脑上的进程,能不能调用其他机器上的进程呢?于是就程序员就把IPC扩展到网络上,这就是RPC(远程过程调用)了。现在不仅单机上的进程可以相互通信,多机器中的进程也可以相互通信了。
要知道实现RPC很麻烦呀,什么多线程、什么Socket、什么I/O,都是让咱们普通程序员很头疼的事情。于是就有牛人开发出RPC框架(比如,CORBA、RMI、Web Services、RESTful Web Services等等)。
OK,现在可以定义RPC框架的概念了。简单点讲,RPC框架就是可以让程序员来调用远程进程上的代码一套工具。有了RPC框架,咱程序员就轻松很多了,终于可以逃离多线程、Socket、I/O的苦海了。
==================================================================================================
根据字面意思来推断,RPC 的确是为了进程间通信而准备的,但构造成函数调用这一形式,是因为这是在抽象上最合理的。
我们可以推断演进一下
====
1. A B 两个进程之间需要进行数据交换。
2.于是我们想出来在某个内存区域划出一个空间,然后向该空间中写入和读取数据。(共享文件也可以)(常见的socket就是这一共享内存的抽象,只是现在大多指网络通路)
3.A B 通信完成。
====
4.A B需要完成更复杂的交互
5.于是我们指定一个协议,A B 根据该协议对数据的进行编码解码,根据协议内容做出决策。
====
6.发现协议过于复杂(比如 编号1代表调用 a函数,编号2代表b函数)
7.试图优化协议,将函数参数和调用的函数名称作为协议的一部分,函数返回值类似
8.RPC达成
=====
9.表现出来的特性就是,object invok(parameter),就代表了,序列化 parameter 对象到中间格式,利用远程服务器的 invok 函数进行处理 ,同时将返回的数据解码生成 object对象。
======总结=====
RPC 在整个过程中,体现了逐层抽象,将复杂的协议编解码和数据传输封装到了一个函数中。
======缺点=====
单一 RPC 无法实现 push,即推送服务。
理由是,RPC 是client 调用 server获取数据,是一个完整的过程,实现不了server调用client。
解决方案:让client 既可以调用server上的RPC服务,反之client本身也成为一个RPC服务让Server来调用。
=====回到题主的问题====
1. Netty只是网络通信框架,目的是让你用最少的代码构建出足够支撑网络通信的功能。
2.完成RPC 需要两个协议: 对象序列化协议 和 调用控制协议
常见例子举例:
1.zeroC ICE,拥有自己的网络通信框架 + ICE 调用控制协议和对象序列化协议,同时也涵盖了服务组件的抽象部署等功能。
2.thrift,有自己的网络通信框架+thrift 对象序列化协议+thrift 调用控制协议
3.probuff,只是 对象序列化协议
4.XMLRPC ,jsonRPC,常见的语境是利用HTTP协议作为调用控制协议,XML 和 JSON 作为对象序列化之后的格式。
5.其他的大概也差不多了。