代码@1:创建主从多Reactor线程模型的Boss线程组,通常只需要设置一个线程,用于监听客户端的连接请求(OP_ACCEPT)。
代码@2:创建主从多Reactor线程模型的Work线程组,即IO线程组,默认为CPU核数的两倍。
代码@3:创建Netty服务端启动工具类ServerBootstrap。
代码@4:调用group方法设置主从线程组。
代码@5:设置通道的类型,服务端NIO通道类型 NioServerSocketChannel。
代码@6:通过option方法为通道服务端通道选项。
代码@7:通过chiildOption方法为IO通道设置选项。
代码@8:通过ChannelInitializer添加自定义的ChannelHandler,通常包括编码解码器、业务Handler。
代码@9:调用管道的addLast添加自定义编码解码器。
代码@10:调用bind方法绑定到服务端指定接口,绑定完成后则在指点端口上监听客户端的连接。
服务端的核心流程入口为bind方法,接下来我们将详细分析其实现原理,继续体会NIO编程技巧。
通过跟踪其bind方法,最终将进入到AbstractBootstrap的doBind方法。
其关键实现点:
代码@1:通过调用initAndRegister方法完成底层网络初始化与通道注册工作。
代码@2:如果初始化与注册工作已完成,则直接调用doBind0方法完成绑定操作。
代码@3:如果初始化与注册工作未完成,则通过regFuture(注册凭证)中添加监听器,等注册完成后再执行doBind0方法。
技巧提示:基于Future异步编程,在主线程中通过调用future.isDone方法判断异步方法是否已完成,如果未完成,通过在该凭证上添加监听器(事件回调),操作完成后执行回调逻辑。
从上面的方法来看服务端的绑定流程包含初始化与绑定两个子流程,接下来将分别深入探讨。
2.1 通道初始化
基于NIO编程,需要先创建通道,然后将其注册到事件选择器,这个过程由 AbstractBootstrap 的 initAndRegister 方法实现。
实现的关键点如下:
代码@1:创建NIO服务端通道实现类NioServerSocketChannel的实例。
代码@2:调用 init 方法初始化通道。
代码@3:将通道注册到事件轮询器EventLoopGroup
代码@4::如果通道已注册,但发生了错误则调用通道close方法回收相关资源,如果未注册成功,则强制清除通道占用的资源,特别是文件占用符。
关于通道的注册逻辑已经在手把手教你如何编写一个NIO客户端 中已详细介绍,故接下来重点关注一下服务端通道的注册流程。
2.1.1 服务端通道初始化流程
AbstractBootstrap 的 init 方法是一个抽象方法,具体有其子类实现:
服务端通道的初始化代码由ServerBootstrap的init方法。
Step1:首先将通过ServerBootstrap设置的选项与附加选项初始化到通道中。
Step2:init 方法的关键点:将 handler 方法设置的事件链,同时新增 ServerBootstrapAcceptor 事件处理方法加入到 NioServerSocketChannel 的事件链,但并没有把 childHandler 中添加的事件链添加到NioServerSocketChannel。
读者朋友们,请停下来思考一下,为什么会这样?从现在可以肯定的是 handler 方法定义的事件处理方法将在与 NioServerSocketChannel 相关的事件发生时其作用。
要解开这个谜题,我们有必要来看看 ServerBootstrapAcceptor 是如何工作的。
2.1.2 ServerBootstrapAcceptor 详解
ServerBootstrapAcceptor 类图如下所示:
ServerBootstrapAcceptor方法只实现了inbound事件的channelRead事件。在详细探究它之前先看看属性:
- EventLoopGroup childGroup
事件执行器组,ServerBootstrap设置的从Reactor线程组,即Work线程组。
- ChannelHandler childHandler
ServerBootstrap#childHandler 设置的事件处理器,也就是用户定义的事件处理器。
接下来探究其 channelRead 方法的实现逻辑:
Step1:channelRead竟然传入的是一个Channel,那这个Channel对象是NioSocketChannel吗?
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
gPB-1713256320335)]
[外链图片转存中…(img-ELh6iChZ-1713256320335)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!