Netty服务端启动流程

目录

服务启动Demo

启动流程概述

创建服务端Channel

初始化服务端Channel

注册Selector

绑定本地端口,开始对端口进行监听


服务启动Demo

Netty服务端启动Demo

启动流程概述

服务端启动主要可分为创建服务端Channel、初始化Channel、注册Selector、绑定本地端口并开始端口监听四个步骤。

创建服务端Channel

Netty将JDK底层的Channel包装成自己的Channel,同时创建一些基本组件绑定在Channel上。

创建Channel的入口在ServerBootstrap类的bind方法,通过反射创建NioServerSocketChannel.class的实例(在ServerBootstrap中通过“ .channel(NioServerSocketChannel.class) ”配置的)。

在NioServerSocketChannel实例化的过程中,它的构造函数会完成以下内容:

  1. 通过JDK创建底层的NIO Channel。
  2. TCP参数配置。
  3. 设置Channel为非阻塞模式。
  4. 创建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处理。

发布了149 篇原创文章 · 获赞 100 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/u011212394/article/details/103842965