目录
服务启动Demo
启动流程概述
服务端启动主要可分为创建服务端Channel、初始化Channel、注册Selector、绑定本地端口并开始端口监听四个步骤。
创建服务端Channel
Netty将JDK底层的Channel包装成自己的Channel,同时创建一些基本组件绑定在Channel上。
创建Channel的入口在ServerBootstrap类的bind方法,通过反射创建NioServerSocketChannel.class的实例(在ServerBootstrap中通过“ .channel(NioServerSocketChannel.class) ”配置的)。
在NioServerSocketChannel实例化的过程中,它的构造函数会完成以下内容:
- 通过JDK创建底层的NIO Channel。
- TCP参数配置。
- 设置Channel为非阻塞模式。
- 创建ID(Channel唯一标识)、unsafe(用于操作底层API,完成数据的读写)、pipeline(服务端Channel逻辑处理链)。
初始化服务端Channel
为Channel做一些初始化工作,例如保存用户自定义属性,配置pipeline,还会通过配置的属性创建一个连接接入器(ServerBootstrapAcceptor)并添加到pipeline,连接接入器每次accept新的连接后,都会对这些连接做一些必要的配置。
注册Selector
Netty将JDK底层的Channel注册到事件轮询器Selector上,并将Netty的Channel作为一个attachment(附件)绑定在JDK的Channel上。
绑定完成后还会触发两个服务启动事件:invokeHandlerAddedIfNeeded与fireChannelRegistered。这两个事件用户是可以自定义实现的,例如在Demo中配置的服务启动处理器:“ .handler(new ServerHandler())”,会先后执行ServerHandler的handlerAdded方法和channelRegistered方法。
绑定本地端口,开始对端口进行监听
Netty通过调用JDK底层的 javaChannel().bind() 方法进行与本地端口绑定。
绑定完成后通过pipeline触发一个fireChannelActive事件,表示Channel 已经被激活,同时提供接口供用户自定义实现事件,对应的就是Demo中ServerHandler类中的channelActive方法。
最后会触发selector的accept事件,这样当有新连接接入时,selector就会轮询到一个accept事件,然后将连接交给Netty处理。