网络编程(二):Netty组件、原理

Netty 的设计主要基于主从 Reactor 多线程模式,并做了一定的改进。本节将使用一种渐进式的描述方式展示 Netty 的模样,即先给出 Netty 的简单版本,然后逐渐丰富其细节,直至展示出 Netty 的全貌。

简单版本的 Netty 的模样如下:

网络编程(二):Netty组件、原理_第1张图片

关于这张图,作以下几点说明:

  • 1)BossGroup 线程维护 Selector,ServerSocketChannel 注册到这个 Selector 上,只关注连接建立请求事件(相当于主 Reactor)。

  • 2)当接收到来自客户端的连接建立请求事件的时候,通过 ServerSocketChannel.accept 方法获得对应的 SocketChannel,并封装成 NioSocketChannel 注册到 WorkerGroup 线程中的 Selector,每个 Selector 运行在一个线程中(相当于从 Reactor)。

  • 3)当 WorkerGroup 线程中的 Selector 监听到自己感兴趣的 IO 事件后,就调用 Handler 进行处理。

我们给这简单版的 Netty 添加一些细节:

网络编程(二):Netty组件、原理_第2张图片

关于这张图,作以下几点说明:

  • 1)有两组线程池:BossGroup 和 WorkerGroup,BossGroup 中的线程(可以有多个,图中只画了一个)专门负责和客户端建立连接,WorkerGroup 中的线程专门负责处理连接上的读写。

  • 2)BossGroup 和 WorkerGroup 含有多个不断循环的执行事件处理的线程,每个线程都包含一个 Selector,用于监听注册在其上的 Channel。

  • 3)每个 BossGroup 中的线程循环执行以下三个步骤:

    • 3.1)轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)。

    • 3.2)处理 accept 事件,与客户端建立连接,生成一个 NioSocketChannel,并将其注册到 WorkerGroup 中某个线程上的 Selector 上。

    • 3.3)再去以此循环处理任务队列中的下一个事件。

  • 4)每个 WorkerGroup 中的线程循环执行以下三个步骤:

    • 4.1)轮训注册在其上的 NioSocketChannel 的 read/write 事件(OP_READ/OP_WRITE 事件)。

    • 4.2)在对应的 NioSocketChannel 上处理 read/write 事件。

    • 4.3)再去以此循环处理任务队列中的下一个事件。

我们再来看下终极版的 Netty 的模样,如下图所示(图片来源于网络):

网络编程(二):Netty组件、原理_第3张图片

关于这张图,作以下几点说明:

  • 1)Netty 抽象出两组线程池:BossGroup 和 WorkerGroup,也可以叫做 BossNioEventLoopGroup 和 WorkerNioEventLoopGroup。每个线程池中都有 NioEventLoop 线程。BossGroup 中的线程专门负责和客户端建立连接,WorkerGroup 中的线程专门负责处理连接上的读写。BossGroup 和 WorkerGroup 的类型都是 NioEventLoopGroup。

  • 2)NioEventLoopGroup 相当于一个事件循环组,这个组中含有多个事件循环,每个事件循环就是一个 NioEventLoop。

  • 3)NioEventLoop 表示一个不断循环的执行事件处理的线程,每个 NioEventLoop 都包含一个 Selector,用于监听注册在其上的 Socket 网络连接(Channel)。

  • 4)NioEventLoopGroup 可以含有多个线程,即可以含有多个 NioEventLoop。

  • 5)每个 BossNioEventLoop 中循环执行以下三个步骤:

    • 5.1)select:轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)。

    • 5.2)processSelectedKeys:处理 accept 事件,与客户端建立连接,生成一个 NioSocketChannel,并将其注册到某个 WorkerNioEventLoop 上的 Selector 上。

    • 5.3)runAllTasks:再去以此循环处理任务队列中的其他任务。

  • 6)每个 WorkerNioEventLoop 中循环执行以下三个步骤:

    • 6.1)select:轮训注册在其上的 NioSocketChannel 的 read/write 事件(OP_READ/OP_WRITE 事件)。

    • 6.2)processSelectedKeys:在对应的 NioSocketChannel 上处理 read/write 事件。

    • 6.3)runAllTasks:再去以此循环处理任务队列中的其他任务。

  • 7)在以上两个processSelectedKeys步骤中,会使用 Pipeline(管道),Pipeline 中引用了 Channel,即通过 Pipeline 可以获取到对应的 Channel,Pipeline 中维护了很多的处理器(拦截处理器、过滤处理器、自定义处理器等)。这里暂时不详细展开讲解 Pipeline。

你可能感兴趣的:(网络)