RPC(Remote Procedure Call)- 远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
网络编程->RPC的“基石”。众所周知,网络编程有三种方式:BIO、NIO、AIO。
编程模型
模型: 对事务共性的抽象
编程模型: 对编程共性的抽象
BIO网络模型
BIO 就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺
点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈
缺点
在 Java 中,线程的实现是比较重量级的,所以线程的启动或者销毁是很消耗服务器的资源的,即使使用线程池来实现,使用上述传统的 Socket 方式,当连接数极具上升也会带来性能瓶颈,原因是线程的上线文切换开销会在高并发的时候体现的很明显,并且以上操作方式还是同步阻塞式的编程,性能问题在高并发的时候就会体现的尤为明显。
阻塞式I/O模型
弹性伸缩能力差
高并发环境,容易出现问题,多线程耗资源,性能瓶颈
NIO网络模型
NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。
NIO 是利用了单线程轮询事件的机制,通过高效地定位就绪的 Channel,来决定做什么,仅仅 select 阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来的问题,应用的扩展能力有了非常大的提高。
NIO网络模型改进
非阻塞式I/O模型 – 服务器端提供一个单线程的selector,统一管理客户端接入的连接,并监听所有连接的事件。
弹性伸缩能力强
单线程节省资源: 线程的频繁创建、销毁,线程上下文切换
NIO网络编程缺陷
麻烦: NIO类库和API繁杂
心累: 可靠性能力补齐,工作量和难度都非常大
有坑: Selector空轮询,导致CPU100%
AIO网络模型
AIO 是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。 即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。 主要在java.nio.channels包下增加了下面四个异步通道:
AsynchronousSocketChannel, AsynchronousServerSocketChannel, AsynchronousFileChannel,
AsynchronousDatagramChannel
其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数。