Netty 详细讲解
目录一、BIO / NIO / AIO 简单对比Java NIO 三大组件二、Netty 核心架构与线程模型重中之重主从 Reactor 模型NioEventLoop三、Channel、Pipeline、ChannelHandler核心三件套1. Channel2. ChannelPipeline 流水线3. ChannelHandler 处理器ByteBufNetty 封装的缓冲区替代 JDK ByteBuffer四、编解码器解决粘包半包五、Netty 重要概念1. ChannelFuture2. ChannelOption / ChildOption3. IdleStateHandler 空闲检测业务心跳4. 零拷贝 Zero‑Copy六、Netty 执行完整流程服务端接收消息全过程七、常见坑面试高频八、Netty 的 Reactor 面试高频问题九、简单完整示例服务端十、Netty 适合什么场景Netty 是基于 Java NIO 的高性能、异步事件驱动的网络通信框架封装了 Java 原生 NIO 的复杂 API用于快速开发高并发的 TCP/UDP 网络服务端、客户端。主流中间件底层网络全部用 NettyRocketMQ、Dubbo、Elasticsearch、Zookeeper、Spring Cloud Gateway、Redis Java 客户端。Java 网络演进BIO → NIO(Java原生) → Netty(封装NIO)一、BIO / NIO / AIO 简单对比模型IO 类型线程模型缺点BIO阻塞 IO1 连接 1 线程高并发下线程爆炸上下文切换重NIO(Java)非阻塞同步单线程 Selector 轮询原生 API 繁琐BUG 多 (空轮询 bug)AIO异步非阻塞操作系统回调Windows 好Linux 内核支持差实际很少用Netty 底层在 Linux 上使用 NIOEpollWindows 上会自动切换 AIO。生产环境几乎都是 NIO 模式。Java NIO 三大组件Buffer 缓冲区数据读写容器ByteBufferChannel 通道双向读写SocketChannel、ServerSocketChannelSelector 选择器多路复用器一个线程监听大量 Channel 事件连接、读、写实现少量线程处理上万连接。原生 NIO 痛点ByteBuffer API 难用需要 flip、rewind、clear容易内存溢出Selector 空轮询 BUG (JDK bug)CPU 100%没有编解码器、断连处理、心跳、半包粘包全部自己手写线程模型、异常处理需要自己实现 Netty 就是把这些坑全部封装好。二、Netty 核心架构与线程模型重中之重Netty 核心线程模型Reactor 反应器模式Netty 实现了三种 Reactor单线程 Reactor不生产用一个线程干接受连接 处理 IO多线程 Reactor一个 accept 线程N 个 IO 线程处理读写主从 ReactorNetty 默认【生产常用】主从 Reactor 模型Boss Group主 Reactor负责接收 TCP 连接只做 accept不处理业务读写。一般 1 个线程足够。Worker Group从 Reactor处理已建立连接的所有 IO 事件read、write、编解码、触发 handlerN 个线程。NioEventLoopGroup 就是线程组NioEventLoop 就是单个线程。java// 服务端经典初始化代码 // boss线程组接收连接worker线程组处理socket读写 NioEventLoopGroup bossGroup new NioEventLoopGroup(1); NioEventLoopGroup workerGroup new NioEventLoopGroup(); ServerBootstrap bootstrap new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) // 指定NIO通道实现 .option(ChannelOption.SO_BACKLOG,128) // tcp半连接队列 .childOption(ChannelOption.SO_KEEPALIVE,true) // tcp心跳 .childHandler(new ChannelInitializerNioSocketChannel() { Override protected void initChannel(NioSocketChannel ch) { // 流水线添加处理器 ch.pipeline().addLast(new MyHandler()); } }); ChannelFuture future bootstrap.bind(8888).sync(); future.channel().closeFuture().sync();NioEventLoop一个NioEventLoop对应一个 Java 线程 一个 Selector一个 Worker NioEventLoop 可以绑定多个 SocketChannel多路复用监听 IO 事件一个 SocketChannel 永远只会绑定到同一个 NioEventLoop 线程所以同一个 channel 的 handler 执行是单线程不需要同步锁非常关键的特性任务队列每个 NioEventLoop 有任务队列支持普通任务、定时任务。注意不要在 Netty IO 线程执行耗时业务数据库查询、http 调用会阻塞整个线程所有绑定这个线程的连接全部卡死 耗时业务丢到自定义业务线程池执行。三、Channel、Pipeline、ChannelHandler核心三件套1. Channel代表一条 Socket 连接封装底层 Java NIO SocketChannel。 常用方法writeAndFlush()写消息并刷到内核缓冲区close()关闭连接channel().isActive()判断连接是否存活2. ChannelPipeline 流水线每个 Channel 内部持有一个ChannelPipeline是Handler 的双向链表。 IO 事件会沿着 pipeline 依次流转。inbound 入站事件外部 → 服务端连接建立、读数据从 head→tail 执行 outbound 出站事件服务端 → 外部写数据、关闭从 tail→head 执行HeadContext -- Handler1 -- Handler2 -- TailContext3. ChannelHandler 处理器分为两类ChannelInboundHandler 入站处理器处理接收过来的数据channelRead()读取报文ChannelOutboundHandler 出站处理器处理向外发送的数据write()常用适配器简化开发ChannelInboundHandlerAdapterChannelOutboundHandlerAdapterSimpleChannelInboundHandler自动释放 ByteBuf泛型直接拿到解码后的对象业务 handler 最常用ByteBufNetty 封装的缓冲区替代 JDK ByteBufferNetty 自己实现的缓冲区解决原生 ByteBuffer 的痛点读写指针分离readerIndex、writerIndex不用 flip 切换支持池化内存PooledByteBuf默认开启复用直接内存减少 GC支持复合缓冲区 CompositeByteBuf组合多个缓冲区不拷贝堆内存 (HeapByteBuf) / 直接内存 (DirectByteBuf零拷贝不走 JVM 堆)⚠️内存释放Netty 引用计数retain()/release()DirectByteBuf 不释放会直接内存泄漏 SimpleChannelInboundHandler 会自动 release普通 InboundHandler 拿到 ByteBuf处理完必须手动 release。四、编解码器解决粘包半包TCP 是流协议没有消息边界会出现粘包、半包多条报文粘在一起或者一条报文被拆成多次到达。Netty 内置开箱即用解码器FixedLengthFrameDecoder固定长度帧DelimiterBasedFrameDecoder分隔符分割报文比如换行符LengthFieldBasedFrameDecoder【最常用】长度域解码器协议头部存消息长度支持自定义偏移RPC、MQ 大量使用。解码器属于 InboundHandler编码器属于 OutboundHandler。 编码业务对象 → ByteBuf解码ByteBuf → 业务对象。示例Protobuf、JSON 都可以配合 LengthFieldBasedFrameDecoder 做私有二进制协议。五、Netty 重要概念1. ChannelFutureNetty 所有 IO 操作全是异步bind、connect、writeAndFlush 全部返回 ChannelFuture不会阻塞。.sync()阻塞等待操作完成.addListener()异步回调推荐不阻塞线程java// 异步回调写法 channel.writeAndFlush(msg).addListener(future - { if(future.isSuccess()){ System.out.println(发送成功); }else{ future.cause().printStackTrace(); } });2. ChannelOption / ChildOptionOption作用于服务端 ServerSocketChannel接受连接的那个 socketChildOption作用于每一条客户端 SocketChannel常用参数SO_BACKLOGTCP 半连接队列大小SO_KEEPALIVETCP 层面的空闲探测不推荐业务心跳粒度粗TCP_NODELAY关闭 Nagle 算法小报文立刻发送低延迟系统开启3. IdleStateHandler 空闲检测业务心跳TCP keepalive 是内核层业务感知差。Netty 提供空闲处理器放在 pipeline检测读空闲、写空闲触发事件我们发送心跳包超时关闭僵死连接。java// 读空闲5秒写空闲8秒读写空闲10秒触发IdleStateEvent ch.pipeline().addLast(new IdleStateHandler(5,8,10));4. 零拷贝 Zero‑CopyNetty 的零拷贝不是操作系统 mmap 那种分几层FileRegion文件传输直接把文件从磁盘发送到网卡不拷贝到 JVM 内存CompositeByteBuf逻辑合并多个缓冲区不做内存复制Direct Buffer使用操作系统直接内存JVM 堆和 socket 之间少一次拷贝六、Netty 执行完整流程服务端接收消息全过程BossGroup NioEventLoop 的 Selector 监听 OP_ACCEPT 事件有客户端连接进来accept 得到 SocketChannel将 SocketChannel 注册到 WorkerGroup 其中一个 NioEventLoop 的 Selector 上监听 OP_READ 事件客户端发送数据Worker 线程 Selector 触发 OP_READ读到字节到 ByteBuf进入 pipeline从 head 开始执行各个 InboundHandler首先经过解码器LengthFieldBasedFrameDecoder拆包把 ByteBuf 转成业务 POJO 对象执行业务 Handler channelRead () 方法如果业务要返回响应调用 writeAndFlush事件反向走 OutboundHandler编码器编码最终发送到 socket 缓冲区write () 只是写入缓冲区不会真正发送必须调用 flush 才会刷出writeAndFlush 合并两个操作。七、常见坑面试高频禁止在 IO 线程执行耗时操作数据库、RPC、复杂计算会阻塞 NioEventLoop 线程同线程所有连接卡死。解决方案把任务提交到自定义业务线程池。DirectByteBuf 内存泄漏直接内存不在堆GC 不会自动回收必须 release开启-Dio.netty.leakDetection.levelPARANOID检测内存泄漏。粘包半包不要裸用 ByteBuf 接收业务报文必须加解码器。不要混用同步 sync ()IO 线程内调用 sync () 造成死锁IO 线程中绝对不能调用 future.sync ()要用 addListener 异步回调。NioEventLoop 绑定 Channel 后channel 所有 handler 都在这个线程执行所以同一个 channel 内变量不需要加 synchronized跨多个 channel 共享变量仍然需要锁。TCP 断开不一定触发 channelRead一定要捕获channelInactive连接断开事件清理会话。八、Netty 的 Reactor 面试高频问题QBossGroup 线程数为什么一般设置 1 ServerSocketChannel 只有一个只负责 accept 接受连接单线程足够多线程反而会竞争 accept 锁没有收益。QWorkerGroup 默认线程数CPU核心数*2Netty 默认构造器就是这个值。QNetty 怎么解决 JDK NIO Selector 空轮询 bug 检测 Selector.select () 返回 0 但没有 IO 事件达到阈值就重建新 Selector把所有 channel 迁移过去。QwriteAndFlush 发送消息是立刻发送给客户端吗 不是写到 Netty 的发送缓冲区队列由 NioEventLoop 在合适时机调用底层 socket write 系统调用刷入操作系统内核 socket 缓冲区内核缓冲区再发给网络。九、简单完整示例服务端javapublic class NettyServerDemo { public static void main(String[] args) throws InterruptedException { NioEventLoopGroup boss new NioEventLoopGroup(1); NioEventLoopGroup worker new NioEventLoopGroup(); try { ServerBootstrap b new ServerBootstrap(); b.group(boss, worker) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializerNioSocketChannel() { Override protected void initChannel(NioSocketChannel ch) { ChannelPipeline p ch.pipeline(); // 简单按换行符分割报文 p.addLast(new DelimiterBasedFrameDecoder(1024, Delimiters.lineDelimiter())); p.addLast(new StringDecoder()); p.addLast(new StringEncoder()); // 业务handler p.addLast(new SimpleChannelInboundHandlerString() { Override protected void channelRead0(ChannelHandlerContext ctx, String msg) { System.out.println(收到客户端消息 msg); ctx.writeAndFlush(服务端回执 msg \r\n); } Override public void channelInactive(ChannelHandlerContext ctx) { System.out.println(客户端断开连接); } }); } }); ChannelFuture f b.bind(9000).sync(); f.channel().closeFuture().sync(); } finally { boss.shutdownGracefully(); worker.shutdownGracefully(); } } }十、Netty 适合什么场景✅ 长连接服务、RPC 框架、消息中间件、网关、IM 聊天、私有二进制协议 ❌ 简单短连接 http 接口直接用 SpringBoot web 即可没必要手写 Netty如果你需要我可以继续手写 Netty 客户端完整代码LengthFieldBasedFrameDecoder 详细图解协议头长度域模拟半包粘包演示Netty 高频面试题整理Netty 源码核心流程梳理NioEventLoop.run 循环

相关新闻

Apex第30赛季启动报错全解决:Easy Anti-Cheat弹窗、运行库缺失、ACE冲突一次搞定

Apex第30赛季启动报错全解决:Easy Anti-Cheat弹窗、运行库缺失、ACE冲突一次搞定

前言最近《Apex Legends》第30赛季已经正式更新,按理说新赛季应该带来更好的游戏体验,但我在社区逛了一圈发现,还是有大量玩家反映启动游戏时弹出Easy Anti-Cheat报错、运行库缺失提示以及各类不明弹窗,导致游戏根本无法启动。本文…

2026/8/13 14:33:22 阅读更多 →
编程基础:分支与循环结构详解与应用实践

编程基础:分支与循环结构详解与应用实践

1. 编程基础中的分支与循环结构解析 在编程的世界里,分支和循环就像是我们日常决策与重复工作的数字化映射。作为程序控制流的两大基石,它们构成了几乎所有复杂算法的骨架。记得我第一次学习编程时,老师用"十字路口的红绿灯"比喻分…

2026/8/12 11:15:46 阅读更多 →
AI Agent:不是只会聊天的百科,而是能动手办事的AI助手,程序员必学的核心能力!

AI Agent:不是只会聊天的百科,而是能动手办事的AI助手,程序员必学的核心能力!

🍔如果用一句话解释:AI Agent(智能体)就是能主动思考、会使用工具、可独立完成复杂任务的智能员工 . Agent AI大模型(大脑) 工具(手脚) 自主行动(执行力) …

2026/8/13 13:32:40 阅读更多 →

最新新闻

告别浏览器翻译来回切换:一份免费搞定网页划词翻译的终极指南

告别浏览器翻译来回切换:一份免费搞定网页划词翻译的终极指南

告别浏览器翻译来回切换:一份免费搞定网页划词翻译的终极指南 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 你是不是也有过这样的经历:打…

2026/8/14 10:46:42 阅读更多 →
SQL Server表与字段注释查询全攻略:从sys.extended_properties到数据字典生成

SQL Server表与字段注释查询全攻略:从sys.extended_properties到数据字典生成

1. 项目概述:为什么我们需要关注SQL Server的注释信息?在数据库开发和维护的日常工作中,我们经常面对成百上千张表和字段。时间一长,当初设计表时清晰的思路,可能就变成了一堆难以理解的缩写和代号。比如,你…

2026/8/14 10:46:42 阅读更多 →
揭秘西安专业网站建设价格背后的真实逻辑,避开隐形消费坑点,教你用最少预算打造高转化率官网

揭秘西安专业网站建设价格背后的真实逻辑,避开隐形消费坑点,教你用最少预算打造高转化率官网

最近好多老板跑到我这里来问,说想做个网站,但是去了几家咨询公司,报价从几千块到几十万块不等,脑袋都快炸了。有的说“全包只要3980”,有的说“高端定制得二十万起步”,听得人云里雾里。其实,做网站这潭水挺深的,尤其是咱们西安这边,互联网公司多得是,但质量真是鱼龙…

2026/8/14 10:46:42 阅读更多 →
把四年的微信聊天记录从手机里救出来:WeChatMsg免费导出工具亲测

把四年的微信聊天记录从手机里救出来:WeChatMsg免费导出工具亲测

把四年的微信聊天记录从手机里救出来:WeChatMsg免费导出工具亲测 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…

2026/8/14 10:46:42 阅读更多 →
Steam Deck模拟器性能调优:平衡画质与续航的5个专业技巧

Steam Deck模拟器性能调优:平衡画质与续航的5个专业技巧

Steam Deck模拟器性能调优:平衡画质与续航的5个专业技巧 【免费下载链接】steamdeck-emulation 🎮 Guide to play emulated games on Steam Deck 项目地址: https://gitcode.com/gh_mirrors/st/steamdeck-emulation Steam Deck作为一款便携式游戏…

2026/8/14 10:46:42 阅读更多 →
别再错过撤回的消息:RevokeMsgPatcher 2.1 微信/QQ/TIM 防撤回补丁 5 分钟上手

别再错过撤回的消息:RevokeMsgPatcher 2.1 微信/QQ/TIM 防撤回补丁 5 分钟上手

别再错过撤回的消息:RevokeMsgPatcher 2.1 微信/QQ/TIM 防撤回补丁 5 分钟上手 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地…

2026/8/14 10:45:41 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →