Netty网络框架学习笔记-13(Netty核心源码剖析-接受请求_2022.06.20)
作者:互联网
Netty网络框架学习笔记-13(Netty核心源码剖析-接受请求_2022.06.20)
从之前服务器启动的源码中,我们得知,服务器最终注册了一个 Accept 事件等待客户端的连接。也知道,
NioServerSocketChannel
将自己注册到了bossEventLoopGroup
线程池(reactor 线程)上,也就是 EventLoop 。
EventLoop 的粗略逻辑
EventLoop
的作用是一个死循环,而这个循环中做 3 件事情
- 有条件的等待 Nio 事件。
- 处理 Nio 事件。
- 处理消息队列中的任务。
Netty 接受请求过程图解
入口:
NioEventLoop#void run() => processSelectedKeys() => processSelectedKey(SelectionKey k, AbstractNioChannel ch)
进入到 NioEventLoop 源码中后,在
NioEventLoop#processSelectedKey(SelectionKey k, AbstractNioChannel ch)
方法开始调试最终我们要分析到 AbstractNioChannel 的 doBeginRead 方法, 当到这个方法时,针对于这个客户端的连接就完成了,接下来就可以监听读事件了
Netty 接受请求过程总结
- 总体流程
接受连接 => 创建一个新的 NioSocketChannel => 注册到一个 worker EventLoop 上 => 注册 selecot Read 事件。
- 更细流程
-
服务器轮询 Accept (接收) 事件,获取事件后调用 unsafe 的 read 方法,这个 unsafe 是个接口, 其中关注的实现类 :
AbstractNioMessageChannel实现的read()方法
。 方法内部由 2 部分组成 -
doReadMessages(readBuf)
用于创建 NioSocketChannel 对象,该对象包装 JDK 的 Nio Channel 客户端。该方法会像创建 ServerSocketChanel 类似创建相关的 pipeline , unsafe,config
-
随后执行 执行
pipeline.fireChannelRead(readBuf.get(i))
方法,并将自己绑定到一个 chooser 选择器选择的 workerGroup 中的 一个 EventLoop。并且注册一个 0 事件,表示注册成功,但并没有注册读(1)事件 -
worker子线程启动执行
register0(promise)
, 后面因为是首次注册, 会调用pipeline.fireChannelActive()
触发通道的readIfIsAutoRead() 读方法
然后会增加一个读事件的监听。
1
标签:Netty,13,EventLoop,源码,事件,注册,方法 来源: https://www.cnblogs.com/zhihao-plus/p/16394169.html