NIO框架
文章目录
NIO
以前编写网络调用程序的时候
客户端创建一个 Socket,通过这个 Socket 连接到服务端。
服务端根据这个 Socket 创建一个 Thread,用来发出请求。
如果客户端请求数越多,服务端创建的处理线程也会越多。
为了解决上述的问题,推出了 NIO 的概念,也就是(Non-blocking I/O)。其中,Selector 机制就是 NIO 的核心。
1)当每次客户端请求时,会创建一个 Socket Channel,并将其注册到 Selector 上(多路复用器)。
2)然后,Selector 关注服务端 IO 读写事件,此时客户端并不用等待 IO 事件完成,可以继续做接下来的工作。
3)一旦,服务端完成了 IO 读写操作,Selector 会接到通知,同时告诉客户端 IO 操作已经完成。
4)接到通知的客户端,就可以通过 SocketChannel 获取需要的数据了。
Netty
概念
Netty 是一个异步的、基于事件驱动的网络应用框架。
Netty 核心组件
Channel
当客户端和服务端连接的时候会建立一个 Channel。
这个 Channel 我们可以理解为 Socket 连接,它负责基本的 IO 操作,例如:bind(),connect(),read(),write() 等等。
EventLoop 和 EventLoopGroup
消息的“出站”/“入站”就会产生事件(Event)。
每个 Channel 都会被分配到一个 EventLoop。一个 EventLoop 可以服务于多个 Channel。
每个 EventLoop 会占用一个 Thread,同时这个 Thread 会处理 EventLoop 上面发生的所有 IO 操作和事件(Netty 4.0)。
EventLoopGroup 是用来生成 EventLoop 的,它要做的就是创建一个新的 Channel,并且给它分配一个 EventLoop。
在异步传输的情况下,一个 EventLoop 是可以处理多个 Channel 中产生的事件的,它主要的工作就是事件的发现以及通知。
相对于以前一个 Channel 就占用一个 Thread 的情况。Netty 的方式就要合理多了。
客户端发送消息到服务端,EventLoop 发现以后会告诉服务端:“你去获取消息”,同时客户端进行其他的工作。
当 EventLoop 检测到服务端返回的消息,也会通知客户端:“消息返回了,你去取吧“。客户端再去获取消息。整个过程 EventLoop 就是监视器+传声筒。
ChannelHandler,ChannelPipeline 和 ChannelHandlerContext
ChannelHandler 就是事件的处理者。可以在 ChannelHandler 中添加一些业务代码,例如数据转换,逻辑运算等等。
ChannelPipeline 是管理ChannelHandler的先后顺序。
ChannelHandlerContext 的主要功能是管理 ChannelHandler 和 ChannelPipeline 的交互。每当有 ChannelHandler 添加到 ChannelPipeline 时,同时会创建 ChannelHandlerContext 。
Netty 核心组件关系图
总结
在 Netty 的核心组件中,Channel 提供 Socket 的连接通道,EventLoop 会对应 Channel 监听其产生的事件,并且通知执行者。EventloopGroup 的容器,负责生成和管理 EventLoop。
ChannelPipeline 作为 ChannelHandler 的容器会绑定到 Channel 上,然后由 ChannelHandler 提供具体事件处理。另外,ChannelHandlerContext 为 ChannelHandler 和 ChannelPipeline 提供信息共享。
ByteBuf 作为 Netty 的数据容器,通过字节数组的方式存储数据,并且通过读索引和写索引来引导读写操作。
上述的核心组件都是通过 Bootstrap 来配置并且引导启动的