Netty 服务端启动流程
2021-05-12 11:15:48 0 举报
Netty 框架的服务端启动流程
作者其他创作
大纲/内容
53. javaChannel().bind() 代码将 JDK 的 ServerSocketChannel 对象绑定到指定端口,至此绑定流程结束
调用祖父类构造方法
channel()
TailContext
NioEventLoopGroup
run()
49. next.invokeBind()
6. 服务端绑定监听端口
10. 调用子类 init() 实现
DefaultChannelPipeline 对象初始化的过程中会生成 HeadContext 和 TailContext 对象,并将其前后指针互相指向对方,形成一条双向链表
43. ctx.fireChannelRegistered()
1. new ServerBootstrap()
11. 1 new ChannelInitializer()
39. AbstractChannelHandlerContext.invokeChannelRegistered(head)
26. processSelectedKeys()
代码javaChannel().register() 将 NioServerSocketChannel 构造方法中生成的ServerSocketChannel 对象注册到 Selector 上
ChannelInitializer
AbstractNioMessageChannel
44. invokeChannelRegistered(findContextInbound());
next().register(channel)
TailContext 实现 ChannelInboundHandler 接口,其 inbound 属性为 true
37. new ServerBootstrapAcceptor()
24. run()
11. 2 p.addLast()
35. initChannel()
33. callHandlerAdded0()
调用父类初始化方法,指定事件循环线程数量为DEFAULT_EVENT_LOOP_THREADS
8. initAndRegister()
27. runAllTasks()
AbstractChannel
新建 Channel 初始化器对象,用于配置 SubReactor 的出入站处理器
步骤 34 回调处理器重写的 handlerAdded() 方法,步骤 35 回调到 步骤 11 为 MainReactor 配置处理器时新建 ChannelInitializer 的 initChannel() 方法
2.1 new ThreadPerTaskExecutor()
50. unsafe.bind()
HeadContext 实现 ChannelInboundHandler 和ChannelOutboundHandler接口,其 outbound 属性为 true
new HeadContext()
38. pipeline.fireChannelRegistered()
run() 方法中 for 空循环,事件循环线程正式启动。循环中select() 方法通过 Selector 轮询 IO 就绪事件,之后根据 ioRatio 配置分配processSelectedKeys()处理 IO 事件 和 runAllTasks() 处理其他任务的时间
MultithreadEventLoopGroup
48. tail.bind()
2. new NioEventLoopGroup()
SingleThreadEventExecutor
32. task.execute()
new PendingHandlerAddedTask()
2.2 children[i] = newChild() 子类实现
new DefaultChannelPipeline(this)
将 Channel 初始化器对象添加到 NioServerSocketChannel 的 Pipeline 中
NioEventLoop
14. addLast0()
36. ch.eventLoop().execute()
MultithreadEventExecutorGroup
3. 配置主从 Reactor 线程池
HeadContext
30. pipeline.invokeHandlerAddedIfNeeded()
18. eventLoop.execute()
AbstractBootstrap
NioMessageUnsafe
register()
ServerBootstrapAcceptor 为 MainReactor 的主要处理器,负责建立连接并将其注册到 SubRactor 上,其成员变量包括了 childGroup 引用持有的 SubReactor 实例及用户为 SubReactor 配置的处理器等必须要属性
通过工厂类创建 步骤4 服务端指定的 NioServerSocketChannel 对象
9. channelFactory.newChannel()
12. addLast()
4. 配置服务端 Channel 类型
20. startThread()
ReflectiveChannelFactory
52. pipeline.fireChannelActive()
NioServerSocketChannel
34. ctx.handler().handlerAdded(ctx)
父类 register()
42. invokeHandlerAddedIfNeeded()
new TailContext()
由ThreadPerTaskExecutor新建线程并启动,执行 SingleThreadEventExecutor.this.run() 方法
新建属于当前事件循环线程组的事件循环对象,并将该对象的 parent 指向线程组
47. pipeline.bind()
new NioEventLoop()
将创建的 NioServerSocketChannel 对象注册到 MainReactor线程池的一个事件循环线程上
11. newChannelPipeline()
44. findContextInbound()从流处理双向链表头部往后开始查找处理入站事件的处理器,回调其重写的 channelRegistered() 方法,至此注册流程结束
new ChannelInitializer()
父类实现
super()
反射调用构造方法
21. doStartThread()
52. isActive() 底层判断 Socket 已经绑定,则通知入站事件流处理器回调其 ChannedActive() 方法。需注意,处理器处理后调用 fireChannelActive() 才会将事件传递到下一个处理器,其他到 read/write 事件处理原理与此相同
Channel 实例化过程中会为其创建 Unsafe 和 Pipeline 成员对象
10. newUnsafe()
40. invokeChannelRegistered()
25. select()
调用 父类构造方法,并指定感兴趣的事件为 SelectionKey.OP_ACCEPT
ThreadPerTaskExecutor
51. doBind()
18. 服务端启动时事件循环线程还没有启动,将 AbstractUnsafe#regist0() 方法包装成异步任务扔到选定的事件循环中执行
SingleThreadEventLoop
15. callHandlerCallbackLater()
group()
AbstractChannelHandlerContext
29.Channel#doRegister()子类实现
此处省略主从 Reactor 线程池 Option 选项配置流程
super
new DefaultChannelHandlerContext()
19. addTask() 将注册任务入队
46. channel.bind()
DefaultChannelPipeline
31. callHandlerAddedForAllHandlers()
16. config().group().register(channel)
调用父类 bind() 方法
23. threadFactory.newThread(command).start()
45. dobind0()
13. newContext()
步骤 13 将用户为 MainReactor 配置的 ChannelInitializer 包装成 DefaultChannelHandlerContext 对象,步骤 14 将其加入到流处理的双向链表中,步骤 15 因为此时 Channel 还没有注册,故将生成一个由成员变量 pendingHandlerCallbackHead 持有的 PendingHandlerAddedTask 等待事件循环启动后执行
AbstractUnsafe
new ReflectiveChannelFactory()
将 新建 ServerBootstrapAcceptor 并将其添加到流处理链的任务包装成异步任务执行
AbstractNioChannel
ServerBootstrapAcceptor
ServerBootstrap
49. findContextOutbound()从流处理双向链表尾部开始往前查找处理出站事件的处理器,回调其 invokeBind() 方法
childHandler()
new NioMessageUnsafe()
新建 Channel 初始化器对象,用于配置 MainReactor 的出入站处理器
children 为 EventLoop 对象数组,保留当前线程组的事件循环线程
5. 配置服务端 SubReactor 线程池处理器
22. executor.execute()
PendingHandlerAddedTask
7. doBind()
DefaultChannelHandlerContext
28. AbstractUnsafe#regist0() 方法包装在异步任务中执行
41. channelRegistered()
0 条评论
下一页