Netty线程模型概述

  在Netty编程模型入门案例中客户端和服务端通信底层如何实现的呢?先看客户端和服务端的类图:

            

            

  两类图大致一样,区别在于ServerBootstrap与EventLoopGroup是组合关系,而Bootstrap与EventLoopGroup之间没有直接的关系。实际在操作过程中也是ServerBootstrap和Bootstrap进行具体操作,详细线程模型如下图:

            

            Group<1------------------*>EventLoop<1------------------1>Selector

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

  服务端:

    Netty 抽象出两组线程池:BossGroup WorkerGroup,也可以叫做BossNioEventLoopGroup WorkerNioEventLoopGroup。每个线程池中都有NioEventLoop 线程。

            

    BossGroup 中的线程专门负责和客户端建立连接,WorkerGroup 中的线程专门负责处理连接上的读写。BossGroup WorkerGroup 的类型都是NioEventLoopGroup。如group方法说明:

            

    bossgroup作为父线程负责与客户端的连接,当有客户端请求时子线程childgroup负责具体的业务逻辑处理。

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

      1、select:轮训注册在其上的 ServerSocketChannel accept 事件(OP_ACCEPT 事件)

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

      3、runAllTasks:再去以此循环处理任务队列中的其他任务

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

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

      2、processSelectedKeys:在对应的 NioSocketChannel 上处理 read/write 事件

      3、runAllTasks:再去以此循环处理任务队列中的其他任务

     在以上两个processSelectedKeys步骤中,会使用 Pipeline(管道),Pipeline 中引用了Channel,即通过 Pipeline 可以获取到对应的 ChannelPipeline 中维护了很多的处理器(拦截处理器、过滤处理器、自定义处理器等)。

             

            

    可以看出这是一个责任链模式的处理过程,具体可参考下图:

            

    并且InboundHandler是按照Pipleline的加载顺序的顺序执行, OutboundHandler是按照Pipeline的加载顺序逆序执行。Handler的实现类图如下:

            

 

posted on 2024-06-04 14:54  池塘里洗澡的鸭子  阅读(5)  评论(0编辑  收藏  举报