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. 应用场景
-
RPC 框架:Dubbo、gRPC 的底层通信。
-
实时通信:WebSocket 服务器(如聊天室)。
-
游戏服务器:高性能网络同步。
-
物联网(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