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

Netty主要组件和服务器启动源码分析

1. Netty服务端启动代码

public class NettyServer {public static void main(String[] args) throws InterruptedException {EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 只处理 acceptEventLoopGroup workerGroup = new NioEventLoopGroup(); // 处理读写try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) {ch.pipeline().addLast(new SimpleServerHandler());}});ChannelFuture future = bootstrap.bind(8080).sync();future.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}

2. 核心组件结构解析和继承结构图

2.1 NioEventLoopGroup是什么

  NioEventLoopGroup是Netty的线程组抽象,本质是一个线程池,管理多个NioEventLoop。

  • bossGroup:用于接收连接(注册 NioServerSocketChannel)

  • workerGroup:处理读写请求(绑定 NioSocketChannel)

每个 NioEventLoop 是一个线程,绑定多个 channel,负责事件循环。

2.2 NioEventLoopGroup继承结构图

img_8.png

从继承类图上看,NioEventLoopGroup通过继承EventExecutorGroup实现了Iterable 和 ScheduledExecutorService 接口,因此它是一个可迭代的事件执行器组,并支持定时任务和延迟任务调度功能,用于事件循环线程模型中。

2.3 NioEventLoop是什么

  • 实现了 Runnable,每个线程在run()中使用Selector.select() 轮询事件。

  • 内部维护一个任务队列(runAllTasks() 执行)

职责:

  • 监听 selector 的事件(OP_ACCEPT, OP_READ 等)

  • 执行 IO 操作(读、写)

  • 执行任务队列(如异步 execute() 的任务)

2.4 NioEventLoop继承结构图

img_9.png

这个类本质上就是一个线程,它实现各个类主要有以下这些

1.AbstractEventExecutor

  • 是EventExecutor的基础实现

  • 提供默认的 schedule()、next() 等通用方法

  • 支持异步执行和定时任务接口

2. SingleThreadEventExecutor

  • 真正管理线程执行循环的地方。

  • 封装了Thread、BlockingQueue 等核心成员。

  • 实现了任务队列、线程启动、线程终止等控制逻辑。

  • 提供核心的runAllTasks()、execute()、shutdown()等方法。

3.SingleThreadEventLoop

  • 是EventLoop的基础实现,添加了和Channel绑定的逻辑。

  • 每个EventLoop绑定多个 Channel,控制生命周期。

  • 提供register(Channel) 方法。

4.NioEventLoop

  • 最终实现类,专门用于 Java NIO 的事件处理(使用 Selector)

  • 线程循环中调用 selector.select() 检查就绪事件(如 OP_ACCEPT、OP_READ)

  • 处理IO操作,并执行 runAllTasks() 执行任务队列

2.5 NioServerSocketChannel是什么

  NioServerSocketChannel是Netty提供的服务端Channel类型,主要用于在服务器端监听客户端连接请求的通道,本质上是对java.nio.channels.ServerSocketChannel的封装。

2.6 ChannelPipeline是什么

  ChannelPipeline 是 Netty 中的核心组件之一,可以理解为:

  • 一个责任链模式(链式处理器结构),用来管理和调度所有的ChannelHandler,从而对Channel中的数据进行编码、解码、业务处理等操作。

它的核心职责主要是:

  • 管理Handler维护一个双向链表结构的多个ChannelHandlerContext。
  • 分发事件把Netty I/O 事件(读、写、连接等)分发给对应的 ChannelHandler。
  • 支持链式操作addLast, addFirst, remove, replace等动态操作。
  • 分离 I/O 和业务 把编码解码逻辑、业务逻辑分散在不同 Handler 中,解耦合

数据进出流程

入站(Inbound)事件传播: 比如:收到数据,触发 channelRead():调用的顺序是HeadContext → Decoder → BusinessHandler → TailContext,每个Handler都可以调用ctx.fireChannelRead(msg)把事件传播下去。

出站(Outbound)事件传播: 比如:调用 ctx.write() 或 channel.write():调用顺序是TailContext → Encoder → BusinessHandler → HeadContext,写数据一般从尾部逆向传播,直到HeadContext调用底层写操作。

2.7 Unsafe是什么

Channel.Unsafe是Netty提供的底层通道操作接口,封装了 I/O 原语、Selector 注册、读写、关闭等敏感操作。它是Channel的一个内部接口,只有 Netty自己框架内部使用,用户不应该直接调用。

它的主要作用有这些,我画个表格说明:

方法功能说明
register()向 Selector 注册 Channel
bind()绑定端口
connect()客户端连接远程地址
beginRead()注册读事件
write() / flush()执行底层写操作
close()关闭连接

2.8 ByteBuf是什么

所有数据收发都基于ByteBuf,而非传统的Java NIO ByteBuffer,下面给出一个表格说明一下:

类名描述
ByteBufNetty 自定义缓冲区,替代 ByteBuffer
Unpooled创建非池化的 ByteBuf
PooledByteBufAllocator池化内存分配器(性能更优)

2.9 Future Promise是什么

Netty 所有操作都是异步的,比如 bind(), write() 都返回 ChannelFuture,下面给出一个表格说明一下:

类名描述
ChannelFuture异步操作的结果,比如 bind、connect
http://www.lryc.cn/news/586709.html

相关文章:

  • EWSGAN:自动搜索高性能的GAN生成器架构
  • Kotlin 类和对象
  • JS红宝书pdf完整版
  • HarmonyOS组件/模板集成创新活动-开发者工具箱
  • 2025.7.13总结
  • Nature子刊 |HERGAST:揭示超大规模空间转录组数据中的精细空间结构并放大基因表达信号
  • 直流/直流电源模块:无干扰布线,避免电磁干扰的技术方案
  • C++高级编程,类模版成员函数类外实现
  • 第三章-提示词-探秘大语言基础模型:认知、分类与前沿洞察(9/36)
  • 《Linux篇》自动化构建-make/Makefile
  • 咪咕盒子Mgv3200_mgv3201九联UNT403G_UNT413G烽火HG680-GC通刷优盘强刷包及TTL线刷烧录救砖包 当贝纯净版固件
  • 基于SpringBoot3集成Kafka集群
  • CentOS 7 升级系统内核级库 glibc 2.40 完整教程
  • docker运行redis指定配置+jdk17安装在centos7
  • C#单例模式管理全局变量
  • 【Linux 学习指南】网络基础概念(一):从协议到分层,看透计算机通信的底层逻辑
  • 【源力觉醒 创作者计划】文心开源大模型ERNIE-4.5私有化部署保姆级教程与多功能界面窗口部署
  • 文心一言大模型4.5系列开源测评
  • 开源链动2+1模式、AI智能名片与S2B2C商城小程序在私域运营中的协同创新研究
  • 笔记-极客-DDD实战-基于DDD的微服务拆分与设计
  • mysql复合条件匹配的查询优化
  • jeepay开源项目开发中金支付如何像其他支付渠道对接那样简单集成,集成服务商模式,极简集成工具。
  • (dp、贪心)洛谷 P8179 Tyres 题解
  • 012_PDF处理与文档分析
  • hash表的模拟--开放定址法
  • AI 助力:如何批量提取 Word 表格字段并导出至 Excel
  • 学习C++、QT---23(QT中QFileDialog库实现文件选择框打开、保存讲解)
  • 行测速算之假设分配法
  • 在 JetBrains 系列 IDE(如 IntelliJ IDEA、PyCharm 等)中如何新建一个 PlantUML 文件
  • Java集合框架深度解析:LinkedList vs ArrayList 的对决