Netty——启动流程


1. 介绍

Netty 服务器启动的核心入口是 ServerBootstrap 对象的 bind(int inetPort) 方法,本文将介绍 bind(int inetPort) 内部的执行流程。

2. 启动流程

2.1 创建并初始化 Channel

  • 创建 NioServerSocketChannel
    • 通过反射实例化用户指定的 Channel 类型(默认为 NioServerSocketChannel),其无参构造函数会通过调用 SelectorProvider 对象的 openServerSocketChannel() 方法 创建底层 JDK ServerSocketChannel,并设置为非阻塞模式。
    • 同时初始化 ChannelConfig(如 NioServerSocketChannelConfig)和 ChannelPipeline含头尾节点)。
  • 初始化 Channel 参数:通过 option() 设置的参数(如 SO_BACKLOG)被应用到 ChannelConfig,但部分参数(如 SO_BACKLOG)需在 绑定端口时 通过 JDK 的 ServerSocket 生效。

2.2 注册 Channel 到 EventLoop

  • 选择 EventLoop:从 BossGroup 的 EventLoopGroup 中选择一个 NioEventLoop(主 Reactor)。
  • 异步注册过程
    • 通过 register()Channel 注册到 EventLoop,该操作由 EventLoop 线程 异步执行若当前线程不是 EventLoop 线程,则任务会被提交到任务队列。
    • 注册成功后,Channel 进入“已注册未激活”状态(尚未绑定端口)。
  • 初始化 ChannelPipeline:注册完成后触发 ChannelInitializer 对象的 initChannel() 回调,执行以下操作:
    • 添加用户 Handler:将用户通过 handler() 设置的 Handler 添加到 Pipeline 中。
    • 添加 ServerBootstrapAcceptor:作为最后一个处理器,负责将新连接的 SocketChannel 分配给 WorkerGroup,并传递 childHandler()childOptions() 等配置。

2.3 绑定端口并启动监听

  • 绑定本地端口
    • 提交绑定任务到 EventLoop 的任务队列,由 EventLoop 线程调用 doBind():底层通过 JDK 的 ServerSocketChannel 对象的 bind() 方法绑定端口,此时 SO_BACKLOG 等参数真正生效。
    • 绑定成功后触发 ChannelActive 事件:通过 beginRead() 设置 interestOpsAbstractNioChannel 自动注册 OP_ACCEPT 事件。
  • 异步通知:绑定结果通过 ChannelFuture 通知,用户可通过 sync() 阻塞等待 或 addListener() 回调处理。

2.4 处理新连接(主从 Reactor 模型)

  • 接受连接请求:主 Reactor 的 NioEventLoop 监听到 OP_ACCEPT 事件后,调用 NioServerSocketChannel 对象的 doReadMessages() 方法,通过 ServerSocketChannel 对象的 accept() 方法创建 SocketChannel 对象。
  • 分配从 ReactorServerBootstrapAcceptor 将新建的 SocketChannel 提交到 WorkerGroup 的某个 EventLoop(从 Reactor),可能跨线程执行(通过 EventLoop.execute())。
  • 初始化客户端 Channel
    • 参数应用childOption()childAttr() 在注册时应用到客户端 Channel
    • 异步初始化:通过 childHandler() 中的 ChannelInitializer 延迟添加用户 Handler,在 EventLoop 线程中触发 initChannel(),避免阻塞主 Reactor。
    • 事件注册:客户端 Channel 默认关注 OP_READ 事件(可通过 childHandler() 修改)。

3. 启动流程图

启动流程图

4. 总结

Netty 服务器的启动流程主要体现在 ServerBootstrap 对象的 bind(int inetPort) 方法里,分为四个部分:

  • 创建并初始化 Channel
  • 注册 ChannelEventLoop
  • 绑定端口并启动监听。
  • 使用主从 Reactor 模型处理事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值