Web开发来一发(四)nio和netty

1、NIO简介

NIO是一种网络编程模型。在网络编程中,socket的核心方法socket.accept()、socket.read()、socket.write()都是同步阻塞的,即处理IO的线程是阻塞的,因此需要用多线程来处理并发请求,但即使这样,这些线程的效率还是很低,因此就出现了非阻塞网络编程模型:NIO。NIO 是一种同步非阻塞的 IO 模型(同步是指线程不断轮询 IO 事件是否就绪,非阻塞是指线程在等待 IO 的时候,可以同时做其他任务),相对于传统的BIO而言,NIO有很多优势。

1)NIO面向的是缓冲区,而BIO是直接面向流的。NIO由于有缓冲区,对数据的处理更加灵活,可以在更合适的时间、用更合适的线程资源来处理数据。

2)NIO是非阻塞的,而BIO是阻塞的。这个区别使得NIO处理通信的线程更加灵活,一个单独的线程可以管理多个输入和输出通道(channel)。

3)NIO允许一个单独的线程来监视多个输入通道,可以注册多个通道使用一个选择器,然后使用一个单独的线程来选择通道,这样一个单独的线程很容易来管理多个通道。

2、NIO和BIO的应用场景

NIO是同步非阻塞,适合处理连接数目特别多,但是连接比较短(轻操作)的场景,Jetty,Mina,ZooKeeper等都是基于java nio实现。

BIO是同步阻塞,适用于连接数目比较小并且一次发送大量数据的场景,这种方式对服务器资源要求比较高,并发局限于应用中。

3、Netty

Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。JDK本身也提供了基于NIO的组件,但Netty的使用和维护成本相对来说都低很多。

Netty是Reactor模式的一个实现,在介绍Netty原理之前,先说明一下Reactor模式。Reactor模式基于事件驱动,特别适合处理海量的I/O事件。那么Reactor模式是什么呢?

处理网络请求的服务无非包括以下几点:读取请求、解码、服务处理、编码、返回请求。

1)单线程模型

Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成。acceptor类接收客户端的TCP连接请求消息,链路建立成功之后,通过Dispatch将对应请求派发到指定的Handler上进行消息解码。单线程模型简单,但是单个线程处理IO读写对于高负载、高并发的场景是无法支撑的。

2)多线程模型

Rector多线程模型与单线程模型最大的区别就是有一组NIO线程处理IO操作。一个acceptor线程用于监听服务端,接收客户端的TCP连接请求,而网络IO操作-读、写等由一个NIO线程池负责。

 

在绝大多数场景下,Reactor多线程模型都可以满足性能需求,但在个别特殊场景中,一个NIO线程负责监听和处理所有的客户端连接可能会存在性能问题。为此产生了第三种Reactor线程模型---主从Reactor多线程模型。

3)主从多线程模型

主从模型中,服务端用于接收客户端连接的不再是个1个单独的NIO线程,而是一个独立的NIO线程池。

 

Netty线程模型并非固定不变,通过在启动辅助类中创建不同的EventLoopGroup实例并通过适当的参数配置,就可以支持上述三种Reactor线程模型。

 

参考资料:

https://www.cnblogs.com/junzi2099/p/8119465.html

https://blog.csdn.net/u013857458/article/details/82419293?spm=ata.13261165.0.0.4b164f96I2qzj6

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值