一.启动概述

理解整体Netty罕用的外围组件后,并且比照了传统IO模式。在比照过程中,找到了传统IO对应Netty中是如何实现的。最初咱们理解到在netty中罕用的那些组件。


本文在理解下这些外围组件的前提下,进一步理解组件如何在整个服务器启动过程如何被创立,如何组件之间配合来应用。首先也是先理解下大略服务端的启动过程,并且在理解过程中咱们带着本人的问题去在学习过程中探寻答案。

1.1 启动概述

1.2 启动问题

  1. netty服务端启动是如何设置非阻塞模式的?
  2. 服务端启动后事件是如何注册到selector上?

二.启动详述

2.1 channel 创立

还是一样首先在channel创立过程大略有哪些过程

  • bind
  • initAndRegister
  • 默认构造函数创立channel

具体调用关系

时序图中从1,2,3步都好了解。

2.1.1 创立channelFactory

从类的反射失去channel这里是一个关键点须要阐明:


图中间接应用channelFactory来实现了channel的实例化.那么就按图索骥这个channelFactory是什么时候赋值的。

图中咱们一步步找到channelFactory的门路。咱们再看第三步是谁调用了
channel(Class<? extends C> channelClass) 创立了channelFactory。最初发现咱们在bootstrap设置channel属性的时候设置了channelFactory。

走到这里咱们才真正进入晓得在bootstrap设置NioServerSocketChannel。并利用NioServerSocketChannel创立。

上述步骤咱们小结一下。通过设置bootstrap的Channel属性来设置服务端NioServerSocketChannel生成了channelFactory。channelFactory 来被动调用传入的class来结构channel。

2.2.2 NioServerSocketChannel默认构造函数创立Channel

从上图中咱们晓得该结构工厂是调用类的构造函数来进行初始化,通过代码中咱们晓得结构类为NioServerSocketChannel。那么就看下NioServerSocketChannel结构过程。

先上来还是看下整体步骤:


通过默认的newSocket办法创立了jdk底层的channel,而后通过Channel的配置了channel的id,对应channel底层的读写unsafe组件,channel对应的逻辑解决pipeline,
最初通过configureBlocking设置channel为非阻塞模式【答复了咱们第一个问题】。
第三步:通过channelConfig设置一些tcp层面的设置

至此channel创立实现

2.2 channel 初始化

通过下面2.1 整个channel曾经创立实现。第二大步在创立channel的根底上,给channel做一些属性配置。


上图设置用的属性 对应到代码中 为如下的代码


这里均为一些本人的属性和配置的设置,至此channel的创立和初始化实现。这里的配置用以客户端新建连贯时进行设置。

2.3 selector 注册

还是先整体看下 整个 selector 流程,是如何将channel注册到selector上。

ps:以上代码流程须要一层层通过断点形式进行跟踪。

第一步:AbstractBootStrap register 入口

以上的步骤实现channel的创立和初始化,通过initAndRegister外部办法来实现selector挂载.

第二步:调用

io.netty.channel.MultithreadEventLoopGroup#register(io.netty.channel.Channel)

register办法中通过next办法获取下一个能够调用EventLoop来调用它的register办法

第三步:调用

io.netty.channel.SingleThreadEventLoop#register(io.netty.channel.Channel)

调动channel.unsafe.register 办法获取channel底层操作,并调用unsafe的register办法

第四步:通过调用abstract Nio Channel 将channel注册到eventLoop的selector中【第二个问题的答案】,并将以后channel作为attache与socket channel关联。

实现对应的selector 和 channel 绑定之后如果有相应的事件回调会进行事件回调操作,这里需要的话须要继承ChannelInboundHandlerAdapter中对应的办法channelRegistered, channelActive。

至此nio channel 通过java 底层的socketchannel绑定 到指定的selector ,实现selector与niochannel 的注册过程。

2.4 端口绑定

根本步骤

第一步:底层端口channel绑定

第二步:最终调用AbstractNioChannel doBeginRead办法。

激活channel 并向selector 注册 read 事件。

三 .总结

整体理解到netty服务端的启动过程。

  1. 通过NioServerSocketChannel的channelFactory创立channelFactory办法
  2. channelFactory 通过反射调用nioServerSocketChannel构造函数。创立channel对象
  3. channel通过NioServerSocketChannelConfig将自定义的option,attr,handler设置实现。
  4. abstract Nio Channel调用register办法实现selector和channel的绑定
  5. 最终调用java channel 进行端口绑定并向selector 注册read事件

整体netty服务端启动实现。

作者:京东科技 陈方林

起源:京东云开发者社区 转载请注明起源