BIO(阻塞型IO),读写socket时,要返回read/write必须先等请求消息来了/客户端收到消息,子线程才能进行下一个请求。
NIO(非阻塞型IO、事件驱动),使用BIO通信时,在高并发的环境下,BIO的线程数量会比较多,占用系统资源较多,等待处理的时间会比较长。这时使用NIO的话,它可以用一个线程把accept、读写操作和请求处理的逻辑全部完成。如果没有任务安排,它会将线程休眠直到下一个事件来了再被唤醒继续工作,这样的一个线程被称作NIO线程。
Netty特性
Netty的核心特性是 支持零拷贝的 bytebuf 缓冲对象 、 通用通信 api 和 可扩展的事件模型 ;它支持多种传输服务并且支持HTTP 、 FTP 、二进制、文本、 WebSocket 等一系列常见协议,也支持自定义协议。Netty的优势 并发高: BIO 与 NIO 传输快:零拷贝( ByteBuf ) 封装好: API 简单,可扩展性强 其他:支持多种协议、用户基数大(使用广泛)、版本迭代快(社区活跃度高)。。。 Reactor线程模型
Netty的模型是基于 Reactor 线程模型,是典型的事件驱动模型。在网络编程中,事件指的是 read 、 write、 bind 、 connect 、 close 等动作。 Reactor 线程模型有很多种, Netty 常用的是 Reactor 主从模型, 也可以基于Reactor 单线程模型和 Reactor 多线程模型进行灵活的配置。
Reactor单线程模型:一个Accept线程和一个NIO线程,NIO线程负责完成请求接收、IO读写、编解码、逻辑处理等工作
Reactor多线程模型: 多线程模型:相比于单线程模型,将非 IO 操作交由线程池处理。
Reactor主从模型:使用多个acceptor的NIO线程池,用于接受客户端的连接。其中mainReactor用于接收客户端请求并转发给subReactor。SubReactor(通常个数与cpu个数相等)负责通道的读写请求,非IO 请求(具体逻辑处理)的任务则会直接写入队列,等待 worker threads 进行处理。