当前位置: 首页 > news >正文

Netty——启动流程

文章目录

  • 1. 介绍
  • 2. 启动流程
    • 2.1 创建并初始化 Channel
    • 2.2 注册 Channel 到 EventLoop
    • 2.3 绑定端口并启动监听
    • 2.4 处理新连接(主从 Reactor 模型)
  • 3. 启动流程图
  • 4. 总结


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 模型处理事件。

相关文章:

  • Next.js build 完成后卡住
  • JavaScript 事件处理机制详解
  • 归档重做日志archived log (明显) 比redo log重做日志文件小
  • 模型压缩(量化、剪枝、蒸馏、低秩分解)
  • Go 语言中,关于客户端初始化的最佳实践
  • day6_FlinkSQL实战
  • [代码随想录] KMP 算法 28. 找出字符串中第一个匹配项的下标 459. 重复的子字符串
  • 力扣算法ing(42/100)
  • 向量数据库学习笔记(2) —— pgvector 用法 与 最佳实践
  • 如何将 performance_schema 中的 TIMER 字段转换为日期时间
  • 【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建,并实现远程联机,详细教程
  • 基于springboot+vue的农产品电商平台
  • 【软考-架构】10.2、需求分析-获取-定义-验证-管理
  • 基于LAC拨号的L2TP VPN实验
  • stock-pandas,一个易用的talib的替代开源库。
  • Cyber Weekly #49
  • 用LLama factory时报类似Process 2504721 got signal: 1的解决方法
  • 基于javaweb的SpringBoot水果生鲜商城系统设计与实现(源码+文档+部署讲解)
  • 645.错误的集合
  • 扩散模型总结
  • 华侨城A:一季度营收53.63亿元,净利润亏损14.19亿元
  • 杭州一季度GDP为5715亿元,同比增长5.2%
  • “90后”樊鑫履新乌兰察布市察右中旗副旗长人选
  • 王羲之《丧乱帖》在日本流传了1300年,将在大阪展23天
  • 上海潮汕联谊会举行换届大会,陈湖文当选会长
  • “一对一讨论诸多事宜”,泽连斯基披露此次特泽会更多细节