最近有人让大叔来几篇文章讲讲Netty. 想了几下之后, 还是觉得应该先来单独聊聊NIO和Reactor这两个东西.

NIO

关于NIO(non-blocking IO), 大叔首先推荐一篇文章, 这个仁兄的这个故事讲解的蛮到位的.一个故事讲清楚 NIO.

简单总结下, NIO就是在BIO的基础上, 使用多个线程(组)分工干活, 并且使用异步请求的方式将系统的潜力尽可能地挖掘出来.
用作者的总结就是: 分而治之,将任务拆分开来,由专门的人负责专门的任务.

提到Java的NIO, 就要提到下面三个东西:

  • Buffer
  • Channel
  • Selector

Buffer

NIO直接操作的就是Buffer, 数据要么通过Buffer取出, 要么通过Buffer写入. 它就是一个可读可写的内存区域.

Channel

数据通过Buffer从Channel中读, 或者通过Buffer写入到Channel中. 它是数据传输的通道, 是干道.

Selector

Selector允许单线程处理多个 Channel。就好像一个服务员同时照看好几个窗口, 一个哪个窗口有事情(事件)触发, 就会立即进行相应处理.
为了实现Selector管理多个SocketChannel,必须将多个具体的SocketChannel对象注册到Selector对象,并声明需要监听的事件(要不然Selector不认识事件肿么办?).

Reactor

Reactor采用主从多线程模型, 采用多个Reactor,每个Reactor都在自己单独的线程里执行。如果是多核,则可以同时响应多个客户端的请求,一旦链路建立成功就将链路注册到负责I/O读写的SubReactor线程池上。