背景
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方法: