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

netty知识点

 

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌

博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅uniapp微信小程序🍅面试题软考题免费使用,还可以使用微信支付,扫码加群。由于维护成本问题得不到解决,可能将停止线上维护。

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

Java项目案例《100套》
https://blog.csdn.net/qq_57756904/category_12173599.html
uniapp小程序《100套》

https://blog.csdn.net/qq_57756904/category_12173599.html

有需求代码永远写不完,而方法才是破解之道,抖音有实战视频课程,某马某千等培训都是2万左右,甚至广东有本科院校单单一年就得3万4年就12万学费,而且还没有包括吃饭的钱。所以很划算了。另外博客左侧有源码阅读专栏,对于求职有很大帮助,当然对于工作也是有指导意义等。在大城市求职,你面试来回一趟多多少少都在12块左右,而且一般不会一次性就通过,还得面试几家。而如果你对源码以及微服务等有深度认识,这无疑给你的面试添砖加瓦更上一层楼。

最后再送一句:最好是学会了,而不是学废了!!

2

Netty 是一个高性能、异步事件驱动的网络应用框架,主要用于快速开发可维护的高性能服务器和客户端。以下是 Netty 的核心知识点,涵盖基础概念、关键组件、使用场景和优化技巧:


1. Netty 核心概念

1.1 Reactor 模式
  • 单线程模型:所有 I/O 操作由一个线程处理(适用于低并发场景)。

  • 多线程模型:一个 Acceptor 线程接收连接,多个 Worker 线程处理 I/O(Netty 默认)。

  • 主从多线程模型:主 Reactor 负责连接,子 Reactor 负责读写(高并发场景)。

1.2 异步非阻塞
  • 基于 NIO:通过 Selector 实现多路复用,避免线程阻塞。

  • Future/Promise:提供 ChannelFuture 监听异步操作结果。


2. Netty 核心组件

2.1 Channel
  • 作用:网络连接的抽象,支持 NIO、OIO(阻塞式)、Local(本地)、Embedded(测试)。

  • 常用实现

    • NioSocketChannel(客户端 TCP)。

    • NioServerSocketChannel(服务端 TCP)。

2.2 EventLoop & EventLoopGroup
  • EventLoop:事件循环,处理 Channel 的 I/O 操作和任务。

  • EventLoopGroup:管理多个 EventLoop(如 NioEventLoopGroup)。

    // 服务端通常配置两个Group:BossGroup(接收连接)和 WorkerGroup(处理I/O)
    EventLoopGroup bossGroup = new NioEventLoopGroup(1);
    EventLoopGroup workerGroup = new NioEventLoopGroup();

2.3 ChannelHandler
  • 处理 I/O 事件:如数据读取、连接建立、异常捕获。

  • 核心接口

    • ChannelInboundHandler:处理入站事件(如 channelRead())。

    • ChannelOutboundHandler:处理出站事件(如 write())。

  • 常用适配器

    • ChannelInboundHandlerAdapter(简化入站处理)。

    • SimpleChannelInboundHandler(自动释放消息内存)。

2.4 ChannelPipeline
  • 责任链模式:多个 ChannelHandler 组成处理链。

  • 入站/出站流程

    • 入站(Inbound):从 Socket 读取数据 → 依次经过 InboundHandler

    • 出站(Outbound):写入 Socket → 逆向经过 OutboundHandler

2.5 ByteBuf
  • 高性能数据容器:替代 NIO 的 ByteBuffer

  • 特性

    • 池化(PooledByteBufAllocator)减少 GC。

    • 支持直接内存(堆外内存)和堆内存。

    • 引用计数自动释放(retain()/release())。


3. 开发流程示例

3.1 服务端代码
public class NettyServer {public static void main(String[] args) {EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new MyServerHandler());}});ChannelFuture future = bootstrap.bind(8080).sync();future.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}// 自定义Handler
class MyServerHandler extends SimpleChannelInboundHandler<String> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {System.out.println("收到消息: " + msg);ctx.writeAndFlush("Server回复: " + msg);}
}
3.2 客户端代码
public class NettyClient {public static void main(String[] args) {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new MyClientHandler());}});ChannelFuture future = bootstrap.connect("127.0.0.1", 8080).sync();future.channel().closeFuture().sync();} finally {group.shutdownGracefully();}}
}class MyClientHandler extends SimpleChannelInboundHandler<String> {@Overridepublic void channelActive(ChannelHandlerContext ctx) {ctx.writeAndFlush("Hello Server!");}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {System.out.println("收到回复: " + msg);}
}

4. 关键特性与优化

4.1 零拷贝(Zero-Copy)
  • FileRegion:通过 FileRegion 传输文件,避免内存拷贝。

  • CompositeByteBuf:合并多个 Buffer,减少数据复制。

4.2 心跳机制
  • IdleStateHandler:检测连接空闲,触发心跳事件。

    pipeline.addLast(new IdleStateHandler(30, 0, 0, TimeUnit.SECONDS));
    pipeline.addLast(new HeartbeatHandler()); // 自定义心跳处理

4.3 编解码器
  • 常用编解码

    • StringEncoder/StringDecoder:字符串编解码。

    • ProtobufEncoder/ProtobufDecoder:Google Protocol Buffers。

  • 自定义协议:继承 ByteToMessageDecoder 和 MessageToByteEncoder

4.4 粘包/拆包处理
  • 解决方案

    • 固定长度:FixedLengthFrameDecoder

    • 分隔符:DelimiterBasedFrameDecoder

    • 自定义长度:LengthFieldBasedFrameDecoder(如消息头包含长度字段)。


5. 应用场景

  1. RPC 框架:Dubbo、gRPC 的底层通信。

  2. 实时通信:WebSocket 服务器(如聊天室)。

  3. 游戏服务器:高性能网络同步。

  4. 物联网(IoT):海量设备连接管理。


6. 常见问题

6.1 内存泄漏
  • 原因:未正确释放 ByteBuf(未调用 release())。

  • 检测:启用 -Dio.netty.leakDetection.level=PARANOID

6.2 线程模型误区
  • 避免阻塞 EventLoop:耗时操作应提交到业务线程池。

6.3 高并发调优
  • 参数调整

    • SO_BACKLOG:连接队列大小。

    • SO_REUSEADDR:端口复用。

    • ChannelOption.ALLOCATOR:使用池化内存分配器。


7. 学习资源

  • 官方文档:Netty.docs: Netty.docs: Home

  • 书籍:《Netty 权威指南》、《Netty in Action》

  • 源码分析:从 ChannelPipeline 和 EventLoop 入手。


掌握 Netty 的核心组件和线程模型是开发高性能网络应用的关键。实际项目中,建议结合具体场景选择合适的编解码、心跳和粘包处理策略。

3

相关文章:

  • 51、Spring Boot 详细讲义(八) Spring Boot 与 NoSQL
  • C++栈与堆内存详解:Visual Studio实战指南
  • MyBatisPlus-QueryWrapper的exists方法拼接SQL中的EXISTS子句
  • Nginx | Apache 配置 WebSocket 多层代理基本知识(附疑难杂症)
  • 基于LightRAG进行本地RAG部署(包括单卡多卡本地模型部署、调用阿里云或DeepSeekAPI的部署方法、RAG使用方法)
  • 分布式存储数据恢复—hbase和hive数据库文件被删除如何恢复数据?
  • Layout 路由
  • Trea初体验:使用Trea从零到一创建一个项目,用来演示glog库的使用,一行代码没改完成了整个项目的搭建运行
  • 2843. 统计对称整数的数目
  • 【Pandas】pandas DataFrame xs
  • 全自动驾驶(FSD,Full Self-Driving)自动驾驶热点技术的成熟之处就是能判断道路修复修路,能自动利用类似“人眼”的摄像头进行驾驶!值得学习!
  • MYSQL “Too Many Connections“ 错误解决
  • 自动驾驶地图数据传输协议ADASIS v2
  • LCOV 使用文档
  • 制表符是什么?与.txt文件的关系?
  • 【JavaWeb】详细讲解 HTTP 协议
  • opencv函数展示2
  • 【力扣刷题】49字母异位词分组,不用哈希,c语言实现
  • 4.17---实现商铺和缓存与数据库双写一致以及宕机处理
  • 「电商玩法」AI自动创作系统源码:商品图+视频+营销文案一键生成
  • 泽连斯基与美国副总统及国务卿会谈,讨论伊斯坦布尔谈判等问题
  • 水果预包装带来的环境成本谁来分担?
  • 台湾关闭最后的核电,岛内担忧“非核家园”缺电、涨电价困局难解
  • 北方首场高温将进入鼎盛阶段,江南华南多地需警惕降雨叠加致灾
  • 解锁儿时愿望!潘展乐战胜孙杨,全国冠军赛男子400自夺冠
  • 《风林火山》千呼万唤始出来,戛纳首映后口碑崩盘?