从IO到NIO的过程

1.在JDK1.3之前,只用到普通的IO方式进行数据的传输;

2.在JDK1.3出现之后, 采用阻塞的BIO替代了普通的IO传输方式;

单线程的情况下,如果读或者写操作没有完成,那么它的当前线程是不能进行其它操作 ,其它的连接的读只能出现在当前线程写入完成或者出现异常之后;可以利用多线程来处理多个请求。

在JDK1.4之前就是这么做的。这样的话一个客户端浏览需要一个线程, 太耗费资源了,会不断的加大服务器的负担。

最后,改进利用线程池,进行处理连接问题,当一个连接处理完成之后,它将线程归还给线程池;

当客户端连接数量大多之后,可以通过线程池和队列的方式有效地控制线程的数量;那么核心的操作应该在IO上面,而不是在线程,那么对于连接上的改进,Socket连接时候不创建线程,那对连接进行登记,需要IO操作时再进行创建,用完之后再归还给线程池;

非阻塞方式:在单线程情况下,当IO操作没有完成,当前线程也可以做其他的事情;

JDK 1.4源码也意识到这个问题,改进NIO(non-Blocking IO),双向Channel,支持全双工通信,selector,同时进行读和写,再也不用等到数据全部整理完再进行其他操作。

其实IO的底层都是调用操作系统,FileDiscriptor(文件描述服务) ,Nio的核心,channel,selector,buffer;

同步非阻塞,区别Epoll可以单线程处理很多客户端的请求,本质上就是Unix的select/poll模型----》epoll模型

多线程中使用selector.select使用epoll模型处理多个客户端请求。

而netty框架就是封装了Nio的细节,一个简单易使用的框架;

作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。

Netty无疑是NIO的老大,它的健壮性、功能、性能、可定制性和可扩展性在同类框架都是首屈一指的。它已经得到成百上千的商业/商用项目验证,如Hadoop的RPC框架Avro、RocketMQ以及主流的分布式通信框架Dubbo等等。
为什么这么火,是有原因的。

Netty的优点可以总结如下:

  • API使用简单,开发门槛低;
  • 功能强大,预置了多种编解码功能,支持多种主流协议;
  • 定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展;
  • 性能高,通过与其他业界主流的NIO框架对比,Netty的综合性能最优;
  • 成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼;
  • 社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会加入;
  • 经历了大规模的商业应用考验,质量得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它已经完全能够满足不同行业的商业应用了。

猜你喜欢

转载自blog.csdn.net/zy345293721/article/details/83089571