IO、NIO与Netty
IO、NIO与Netty
前言:
此文主要用于记录Netty学习之后的总结与笔记,较为浅显
Demo源码地址
1.BIO、NIO、AIO
Java中有三种网络模型:BIO、NIO和AIO
1.1 BIO同步阻塞IO
BIO就是Java IO包中的一系列流 import java.io.*;
BIO作为网络编程的Server端的流时,其特点是:
- 一个线程只能管理一个连接;
- BIO是直接面向流;
- 流在调用
read()
方法时,线程是阻塞的; - 线程利用率低
1.2 NIO同步非阻塞IO
NIO是Java NIO包中的一系列流 import java.nio.*;
特点:
- 一个线程可以管理多个连接;
- NIO不直接面向流,而是面向缓存区,读取时的效率更高;
- 当流没有数据时,当前线程是可以继续执行不阻塞线程的;
- 对线程的利用率提升了
NIO中比较重要的概念与组件:Selector
、Channel
、Buffer
Selector
Selector
作为NIO最外层的管理者,将服务端比作一个酒馆,其作用就好比一个酒馆中的掌柜的,客人到来就好比客户端的连接,掌柜的就负责给客人分配服务的店小二。
Channel
店小二(Channel
)就负责听取客人(Client)的要求,客人将要求写在小本本上(Buffer
)。
Buffer
店小二负责将小本本(Beffer
)提交到后厨,后厨看到小本本上的内容,开始制作美食佳酿。好了到这里我们后端就知道了客人想要什么东西了。
NIO对比BIO的优势就在,NIO只需要一个掌柜的(一个线程中的Selector
)就可以管理多个连接,而BIO需要开启多个线程(掌柜的)才行,这里一看就发现BIO对于资源是很浪费的。
NIO也有其缺点:
编程复杂,需要考虑各种复杂情况、异常处理、线程的运用,于是乎,有了Netty
。
1.3 AIO异步IO(不作介绍)
2.Netty
Netty是什么
Netty是基于Java开发的一个高性能、高吞吐的网络编程框架,其中包括了对NIO的封装,使用了多线程,选用了高效的线程模型。
线程模型
Reactor单线程
Reactor多线程
Reactor主从
Netty架构
Netty的线程模型就是采用上面的Reactor主从
模式。主BossNioEventLoopGroup
与子WorkerNioEventLoopGroup
。
Boss负责建立与客户端之间连接的通道(Channel
),Worker则负责监听客户端通道中的消息,然后通过Handler
进行处理。
Netty的组件
NioEventLoopGroup
NioEventLoopGroup
维护了多个NioEventLoop
,一个NioEventLoop
代表一个线程。
NioEventLoop
维护了Selector
和TaskQueue
。
NioServerSocketChannel
NIO Socket网络连接服务端通道
ChannelHandler
ChannelHandler
负责处理客户端到来的数据,可以由用户实现SimpleChannelInboundHandler
类,重写channelRead0(ChannelHandlerContext ctx, String msg)
方法,也可以使用默认的处理器例如:StringDecoder
、HttpServerCodec
、IdleStateHandler
。
ChannelPipeline
上述处理器,需要ChannelInitializer
进行一个初始化,初始化的过程中,就使用到了ChannelPipeline
。ChannelPipeline
与ChannelHandlerContext
之间互相依赖,使用了责任链模式
。