netty的简要介绍
netty作为一个高性能的网络编程框架,底层可以使用bio或者nio实现,但是netty提供的api对应用程序是透明的,无论选择哪种,编程模式基本都是一样的,本文及后续netty相关的文章,都是采用nio的实现作为介绍,因此在学习netty之前,需要先掌握nio的使用及原理,在之前的几篇文章中有对nio网络编程做了较为详细的介绍,有兴趣的可以翻看下,或者网上找资料了解下。
在netty中,有这样一个重要的对象NioEventLoop,每个NioEventLoop有单独的selector和执行线程,除了可以监控socket上的IO事件,本身也是一个executor,作为一个线程池使用,可以向其提交异步任务。
很多人会称之为事件循环对象,何为事件循环,就是NioEventLoop会一直循环处理监控的socket上的IO事件和提交的异步任务。但是会有这样一个问题,NioEventLoop的线程来处理selector的select方法时,若没有事件发生,那么该方法会阻塞,线程暂停,而此时又有很多异步任务提交给NioEventLoop。那么,如何来平衡IO事件的处理与异步任务的处理,就是选择什么策略来平衡这两者的处理时间。
netty中,负责处理accept事件和读写事件的NioEventLoop是分离的,处理accept事件的NioEventLoop对象组称之为boos group,处理read、write事件的NioEventLoop对象组称之为worker group。基础的架构图如下

通过上图可知,boss group的NioEventLoop对象在accept后便将channel交给worker group的NioEventLoop对象去处理,通常情况下boss group只需要一个EventLoop对象来处理连接即可,因为此操作是非常快的。而worker group一般需要有多个NioEventLoop对象来处理读写事件。也就是说,在netty中,一般用一个线程处理一个channel的连接,而多个线程来处理channel上的读写请求,每个线程可处理多个channel。
在了解了netty的整体架构及功能后,还有之前提过的reactor模式后,再去学习netty的重要组件功能及之间的关系便会比较快。