netty源码阅读--服务启动

背景

netty是一个非常成熟的NIO框架,众多apache的顶级项目底层通信框架都是用的是netty,本系列博客主要是记录自己复习netty源码的过程,重在理解netty的关键如:如何启动,如何接受网络数据、netty的内存管理机制以及编解码器等,废话不多说,直接跟着netty源码中的MQTT的官方示例来看netty的启动过程
在这里插入图片描述

启动时序图

下面这张时序图,是该example引导启动的整个过程中关键的步骤
在这里插入图片描述

启动过程

bootstrap关联channel的类型

引导的初始化和netty线程池的初始化这里就不再赘述,建议大家自己去debug一下,我们直接从引导关联channel开始说起
在这里插入图片描述
在这里插入图片描述

服务端绑定端口相应源码解析

相关代码:

ChannelFuture f = b.bind(1883).sync();

在这里插入图片描述
在这里插入图片描述
最核心的就是AbstractBootstrap的initAndRegister方法,其中init和register为最核心的两个步骤

init步骤:

AbstractBootstrap中完成Channel的创建
在这里插入图片描述
调用ServerBootStrap的init方法,完成Serverbootstrap中的
在这里插入图片描述
addLast方法具体执行逻辑,是调用的DefaultChannelPipeline类的addLast方法:
在这里插入图片描述
在这里插入图片描述

register步骤

当init(channel)执行完成之后,继续执行register方法,用于把初始化的channel注册到boss eventloop

在这里插入图片描述
Group().register(channel)直接执行到MultithreadEventLoopGroup.java中的register方法
在这里插入图片描述
register最终访问到SingleThreadEventLoop.java中的register:
在这里插入图片描述
在这里插入图片描述
AbstractChannel.AbstractUnsafe类的register方法
在这里插入图片描述
第8步骤中,是服务端启动时执行的方法,eventLoop.execute方法,通过NioEventLoop中的任务队列被调度执行,此时是boss线程池
在这里插入图片描述
此时内部task只有一个,即第8步的register0()方法,因此下一步执行register0方法——注意,此时boss线程池中线程启动完成,当task执行之后,正式监听并处理客户端网络接入

AbstractUnsafe类的register0方法

在这里插入图片描述
第10步中的doRigister方法,执行到AbstactNioChannel.AbstractNioUnsafe类中的doRegister方法:
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

於之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值