Netty之服务端启动流程

Netty是一个NIO框架,它将IO通道的建立、可读、可写等状态变化,抽象成事件,以责任链的方式进行传递,可以在处理链上插入自定义的Handler,对感兴趣的事件进行监听和处理

 

首先来一段Netty Server的sample:

Netty之服务端启动流程

 

 

ServerBootstrap是一个启动辅助类;

group(bossGroup, workerGroup) 我们需要两种类型的人干活,一个是老板,一个是工人,老板负责从外面接活,接到的活分配给工人干,放到这里,bossGroup的作用就是不断地accept到新的连接,将新的连接丢给workerGroup来处理;

.channel(NioServerSocketChannel.class) 表示服务端启动的是nio相关的channel,可以理解为一条channel就是一个连接;

.handler(new EchoServerHandler()),消息处理器

.childHandler(new ChannelInitializer<SocketChannel>)...表示一条新的连接进来之后,该怎么处理,也就是上面所说的,老板如何给工人配活。

 

我们带着两个问题来展开本章节的内容:

  1. Channel如何被创建的?

  2. Selector如何被创建的?

  3. 如何绑定端口?


ChannelFuture f = b.bind(PORT).sync(),我们主要深入了解bind方法。

 

AbstractBootstrap#bind->AbstractBootstrap#doBind-->AbstractBootstrap#ReflectiveChannelFactory#initAndRegister中,通过反射创建NioServerSocketChannel.class

Netty之服务端启动流程

 

 Netty之服务端启动流程

 

 

用户调用方法 Bootstrap.bind(port) 第一步就是通过反射的方式new一个NioServerSocketChannel对象,并且在new的过程中创建了一系列的核心组件(Channel,ChannelConfig,ChannelId,Unsafe,Pipeline,ChannelHander),真正的启动我们还需要继续跟。

 

接着看ServerBootstrap#init(Channel channel),这里比较主要的就是把Handler加入到了Pipeline

Netty之服务端启动流程

 

 接着看AbstractBootstrap#ChannelFuture regFuture = config().group().register(channel)把channel注册到EventLoopGroup中去,最终会调用register0

Netty之服务端启动流程

 

 

2中的pipeline.invokeHandlerAddedIfNeeded()大概是把自定义的Handler添加到Pipeline中

 

最后返回到AbstractBootstrap#doBind0进行绑定端口

Netty之服务端启动流程

 

上一篇:PHP Closure 类的bind简介和使用


下一篇:react 点击事件传参