netty 总体思路梳理

先借用大佬的一张图:
在这里插入图片描述

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

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

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

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

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

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

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

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

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

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

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

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

默认情况下 BossGroup 和 WorkerGroup 包含 NioEventLoop 的数量=coreNum2,数量也可自定义。
每个 NioEventLoop 包含如下属性例如:selector、taskQueue(任务队列)、executor(执行器)等
NioEventLoopGroup 通过调用 newChild() for循环调用了coreNum
2次 NioEventLoop 的构造函数

Netty 中的taskQueue任务队列有三种使用场景:

1)处理用户程序的自定义普通任务的时候

2)处理用户程序的自定义定时任务的时候

3)非当前 Reactor 线程调用当前 Channel 的各种方法的时候

processSelectedKeys 的目的是遍历 Selector 的内部 SelectionKey 集合(每一个 SelectionKey 关联了发生 IO 事件的 Channel),对每一个 Channel 上的 IO 事件进行处理。

ChannelPipeline

1)每当 ServerSocketChannel 创建一个新的连接,就会创建一个 SocketChannel 对应目标客户端

2)每一个新创建的 SocketChannel 包含一个全新的 ChannelPipeline

3)每一个 ChannelPipeline 内部都含有一个由 ChannelHandlerContext 构成的双向链表

4)ChannelHandlerContext 都包装了一个 ChannelHandler

元素操作类:以 get、add、remove、replace 等开头的

Pipeline 里 Handler 责任链中 IO 事件处理方法触发类:以 fire(处理入站)、write(处理出站) 等开头的

bind()

1)首先调用 AbstractBootstrap 中的 doBind()方法完成 NioServerSocketChannel 实例的初始化和注册。

2)然后调用 NioServerSocketChannel 实例的 bind()方法。

3)NioServerSocketChannel 实例的 bind()方法最终调用 sun.nio.ch.Net 中的 bind()和 listen()完成端口绑定和客户端连接监听。

4)sun.nio.ch.Net 中的 bind()和 listen()底层都是 JVM 进行的系统调用。

5)bind 完成后会进入 NioEventLoop 中的死循环,不断执行以下三个过程

select:轮训注册在其中的 Selector 上的 Channel 的 IO 事件

processSelectedKeys:在对应的 Channel 上处理 IO 事件

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值