Netty 的服务启动流程2

224 阅读3分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

专栏里我已经给大家介绍了Netty的启动流程,但是没写完,没写完的原因就是:那天实在太晚了,还有很多东西要写,因此这篇文章就把它补上,我是很喜欢有挑战的一名程序员,因为我知道,只有战胜这些挑战,才能打造出自己的个人品牌,否则别想。

本篇文章依然从服务启动开始解析,解析之前没写完的后半部分。

ServerSocketChannel的初始化

这个ServerSocketChannel被创建出来之后呢,紧接着会初始化,我们看看初始化的操作,代码如下:

image.png

这四个属性都是初始化我们的ServerSocketChannel的 image.png

我们接着走,然后我们看到ChannelInitializer类有一个方法叫initChannel,那这个方法是做什么的?看到了英文注释,就是说这个方法是把我们的这个想加的这个handler增加到这个pipeline里去,加完之后,就把自己移除掉,我们想添加的就是这个ServerBootstrapAcceptor对象,这个handler是负责对客户端接收链接的初始化操作。

image.png

channel的注册

然后,进入到注册阶段

image.png

继续跟进

image.png

然后走到这个方法,继续跟进。 image.png

然后就走到了这个方法,这个判断是判断我们的这个当前线程是不是Nio的线程,很明显不是,当前线程是main线程。

image.png

然后,它这里面是把我们的这个注册,封装成一个task,丢到里面去执行。 image.png

那我们就得跟进这个execute,它很聪明啊,先把这个任务丢到这个NioEventLoopGroup里面的队列里,紧接着会启动一个线程。

image.png

当然,这个线程不一定会启动,它会先判断它的状态,这里是1,1就代表没启动。

image.png

如果是没启动,就改成2,然后这个线程就启动了,启动之后,执行队列里面的任务,我们就跳过去。 image.png

然后点这个方法进去,你会看到真正干活的方法。 image.png

这里就是真正干活的方法了,就涉及到JDK的Nio编程了。 image.png

这里就是调用Nio编程,把我们的这个channel注册到NioEventLoop绑定的那个Selector上。 image.png

绑定之后,就把我们的这个初始化Handler,给移除掉了。

image.png

绑定端口

然后,我们进入了这个方法。

image.png

然后,我们看到了还是一个execute,然后我们进方法里面看一下。 image.png

我们可以看到这个pipeline有很多的这个Handler,我们只找我们需要关注的。 image.png

我们找到这个方法,进去看一下。 image.png

这个active还是false,所以走doBind。 image.png

在这就bind了,之后呢,我们继续跟进。 image.png

走到这里就是active了,所以我们继续跟进,看看它都干了什么。 image.png

然后我们走到了这个方法,我们跟进read方法。 image.png

然后进入这个read方法。 image.png

unsafe.beginRead(),这个方法是做啥的呢,我们继续跟进。 image.png

这里是开启一个监听器,如果之前没有监听,则进行监听,然后就结束了,我们的链接准备也就做好了。 image.png