详细图解 Netty Reactor 启动全流程 | 万字长文 | 多图预警

发布时间:2022-10-07 18:30

本系列Netty源码解析文章基于 4.1.56.Final 版本

详细图解 Netty Reactor 启动全流程 | 万字长文 | 多图预警_第1张图片

大家第一眼看到这幅流程图,是不是脑瓜子嗡嗡的呢?

详细图解 Netty Reactor 启动全流程 | 万字长文 | 多图预警_第2张图片

大家先不要惊慌,问题不大,本文笔者的目的就是要让大家清晰的理解这幅流程图,从而深刻的理解Netty Reactor的启动全流程,包括其中涉及到的各种代码设计实现细节。

详细图解 Netty Reactor 启动全流程 | 万字长文 | 多图预警_第3张图片

在上篇文章 《聊聊Netty那些事儿之Reactor在Netty中的实现(创建篇)》 中我们详细介绍了Netty服务端核心引擎组件 主从Reactor组模型 NioEventLoopGroup 以及 Reactor模型 NioEventLoop 的创建过程。最终我们得到了netty Reactor模型的运行骨架如下:

详细图解 Netty Reactor 启动全流程 | 万字长文 | 多图预警_第4张图片

现在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 启动全流程 | 万字长文 | 多图预警_第5张图片

  • Netty的核心引擎组件 主从Reactor线程组: bossGroup,workerGroup 。通过 ServerBootstrap#group方法 配置。

  • Netty服务端使用到的Channel类型: NioServerSocketChannel ,通过 ServerBootstrap#channel方法 配置。

    以及配置 NioServerSocketChannel 时用到的 SocketOption 。 SocketOption 用于设置底层JDK NIO Socket的一些选项。通过 ServerBootstrap#option方法 进行配置。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号