发布时间:2022-10-07 18:30
本系列Netty源码解析文章基于 4.1.56.Final 版本
大家第一眼看到这幅流程图,是不是脑瓜子嗡嗡的呢?
大家先不要惊慌,问题不大,本文笔者的目的就是要让大家清晰的理解这幅流程图,从而深刻的理解Netty Reactor的启动全流程,包括其中涉及到的各种代码设计实现细节。
在上篇文章 《聊聊Netty那些事儿之Reactor在Netty中的实现(创建篇)》 中我们详细介绍了Netty服务端核心引擎组件 主从Reactor组模型 NioEventLoopGroup
以及 Reactor模型 NioEventLoop
的创建过程。最终我们得到了netty Reactor模型的运行骨架如下:
现在Netty服务端程序的骨架是搭建好了,本文我们就基于这个骨架来深入剖析下Netty服务端的启动过程。
我们继续回到上篇文章提到的Netty服务端代码模板中,在创建完主从Reactor线程组: bossGroup
, workerGroup
后,接下来就开始配置Netty服务端的启动辅助类 ServerBootstrap
了。
public final class EchoServer { static final int PORT = Integer.parseInt(System.getProperty("port", "8007")); public static void main(String[] args) throws Exception { // Configure the server. //创建主从Reactor线程组 EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); final EchoServerHandler serverHandler = new EchoServerHandler(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup)//配置主从Reactor .channel(NioServerSocketChannel.class)//配置主Reactor中的channel类型 .option(ChannelOption.SO_BACKLOG, 100)//设置主Reactor中channel的option选项 .handler(new LoggingHandler(LogLevel.INFO))//设置主Reactor中Channel->pipline->handler .childHandler(new ChannelInitializer() {//设置从Reactor中注册channel的pipeline @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); //p.addLast(new LoggingHandler(LogLevel.INFO)); p.addLast(serverHandler); } }); // Start the server. 绑定端口启动服务,开始监听accept事件 ChannelFuture f = b.bind(PORT).sync(); // Wait until the server socket is closed. f.channel().closeFuture().sync(); } finally { // Shut down all event loops to terminate all threads. bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } }
在上篇文章中我们对代码模板中涉及到 ServerBootstrap
的一些配置方法做了简单的介绍,大家如果忘记的话,可以在返回去回顾一下。
ServerBootstrap类
其实没有什么特别的逻辑,主要是对Netty启动过程中需要用到的一些核心信息进行配置管理,比如:
Netty的核心引擎组件 主从Reactor线程组: bossGroup,workerGroup
。通过 ServerBootstrap#group方法
配置。
Netty服务端使用到的Channel类型: NioServerSocketChannel
,通过 ServerBootstrap#channel方法
配置。
以及配置 NioServerSocketChannel
时用到的 SocketOption
。 SocketOption
用于设置底层JDK NIO Socket的一些选项。通过 ServerBootstrap#option方法
进行配置。