Netty源码-Server启动流程

Netty基本介绍,参考 Netty与网络编程

1、主线程:

Netty源码包的mnetty-example模块随便打开一个实现样例,比如包io.netty.example.echo下的EchoServer,我们从这里的源码开始看

Server启动流程: 创建Selector -》创建ServerSocketChannel -》 初始化ServerSocketChannel -》分配NioEventLoop(请求处理线程)

1.1 在new NioEventLoop(1)打断点,并启动服务

我们先看bossGroup

在这里插入图片描述

1.2 创建Selector

 NioEventLoopGroup构造方法中通过SelectorProvider.provide方法调用JDK的SelectorProvider类创建Selector,具体见

Netty源码解析-Channel线程分配和多路复用

在这里插入图片描述

在这里插入图片描述

1.3 创建和初始化ServerSocketChannel

 通过ServerBootstrap.bind()进入到AbstractBootstrap.initAndRegister方法
 该方法完成三个任务: 
	- 1)创建一个ServerSocketChannel
    - 2)初始化ServerSocketChannel
    - 3)Register:给ServerSocketChannel从BossGroup中选择一个NioEventLoop

在这里插入图片描述

1.4 反射工厂创建ServerSocketChannel

通过反射工厂动态创建,具体见Netty源码解析-源码及IO模式

在这里插入图片描述

1.5 初始化ServerSocketChannel

在这里插入图片描述

1.6 给ServerSocketChannel从bossGroup中选择一个NioEventLoop注册

首先next()方法选择一个NioEventLoop,然后register方法注册到Channel,如下图:

在这里插入图片描述

1.6.1 next()选择eventLoop

next方法即使通过一种方式选择一个NioEventLoop注册给Channel,深入next()->EventExecutorChooserFactory.EventExecutorChooser.next() 这个接口有两个实现类,具体机制见Netty源码解析-Channel线程分配和多路复用

1.6.2 register()注册

进入register->SingleThreadEventLoop.register->AbstractChannel.AbstractUnsafe.register

在这里插入图片描述

查看断点执行情况,当前是main线程(左下角),第一个分支不会进入,进入第二个分支,会使用eventLoop来执行,在register0中打断点

在这里插入图片描述

进入register0方法,我们发现左下角线程变成了,不再是main线程,因为进入了bossGroup 的线程,真正执行register的是doRegister()方法, 下面的safeSetSuccess是异步通知成功

在这里插入图片描述

2、BossGroup(MainReactor)线程后续流程

2.1 将ServerSocketChannel注册到选择的NioEventLoop的Selector

进入doRegister,下面就会进入JDK代码,这里做的事情就是将ServerSocketChannel注册到选择的 NioEventLoop的Selector

在这里插入图片描述

2.2 绑定地址启动

ServerBootstrap属性设置以后,要绑定地址了。
绑定入口在ServerBootstrap.bind()->doBind(), 回到AbstractBootsrapt.doBind(), 真正执行绑定操作的是doBind0

在这里插入图片描述

最终会进入AbstactChannel.bind()->NioServerSocketChannel.doBind(),这里面根据java版本调用的JDK的方法

在这里插入图片描述

2.3 注册接受连接事件(OP_ACCEPT)到Selector上

2.3.1 绑定完成后激活

在这里插入图片描述

2.3.2 pipeline.fireChannelActive是责任链模式

最终会进入DefaultChannelPipeline.HeadContext#channelActive()

在这里插入图片描述

2.3.3 进入readIfIsAutoRead(),来到AbstractChannel#read

又是pipeline.read(),属于类DefaultChannelPipeline,我们进入该类的DefaultChannelPipeline.HeadContext#read()方法

在这里插入图片描述

在这里插入图片描述

2.3.4 继续进入,最终来到这里AbstractNioChannel#doBeginRead

在这里插入图片描述

3.总结

Server启动流程:
先是主线程流程: 创建Selector-> 创建ServerSocketChannel -》 初始化ServerSocketChannel -》分配NioEventLoop-》注册到Channel
接着进入BossGroup线程流程:绑定地址 -》 注册接受链接事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值