Netty网络编程框架学习笔记。涉及核心组件与架构设计、主从reactor模式。仅覆盖自己设计nettyserver时查询的知识。
netty架构
netty采用分层设计,从上层API到底层实现逐步抽象,核心组件分为四层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| ┌─────────────────────────────────────────────────────┐ │ 引导层 (Bootstrap) │ │ ┌───────────────────────┐ ┌─────────────────────┐ │ │ │ ServerBootstrap │ │ Bootstrap │ │ │ │ (服务端启动引导类) │ │ (客户端启动引导类) │ │ │ └───────────────────────┘ └─────────────────────┘ │ ├────────────────────────────────────────────────────┤ │ 事件处理层 (Event Handling) │ │ ┌───────────────────────┐ ┌─────────────────────┐ │ │ │ ChannelPipeline │ │ ChannelHandler │ │ │ │ (处理器链) │ │ (事件处理器) │ │ │ └───────────────────────┘ └─────────────────────┘ │ │ ┌───────────────────────┐ ┌─────────────────────┐ │ │ │ ChannelHandlerContext│ │ChannelInboundHandler│ │ │ │ (处理器上下文) │ │ (入站处理器) │ │ │ └───────────────────────┘ └─────────────────────┘ │ │ ┌───────────────────────┐ ┌─────────────────────┐ │ │ │ ChannelOutboundHandler│ │ ChannelPromise │ │ │ │ (出站处理器) │ │ (异步操作结果) │ │ │ └───────────────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────┤ │ 网络通信层 (Networking) │ │ ┌───────────────────────┐ ┌─────────────────────┐ │ │ │ Channel │ │ EventLoopGroup │ │ │ │ (通信通道抽象) │ │ (事件循环组) │ │ │ └───────────────────────┘ └─────────────────────┘ │ │ ┌───────────────────────┐ ┌─────────────────────┐ │ │ │ EventLoop │ │ ChannelFuture │ │ │ │ (单线程事件循环) │ │ (异步操作未来结果) │ │ │ └───────────────────────┘ └─────────────────────┘ │ │ ┌───────────────────────┐ ┌─────────────────────┐ │ │ │ ByteBuf │ │ ChannelOption │ │ │ │ (高效字节缓冲区) │ │ (通道配置选项) │ │ │ └───────────────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────┤ │ 工具层 (Utilities) │ │ ┌───────────────────────┐ ┌─────────────────────┐ │ │ │ ReferenceCounted │ │ ResourceLeakDetector│ │ │ │ (引用计数接口) │ │ (资源泄漏检测器) │ │ │ └───────────────────────┘ └─────────────────────┘ │ │ ┌───────────────────────┐ ┌─────────────────────┐ │ │ │ NettyRuntime │ │InternalThreadLocalMap│ │ │ │ (运行时环境) │ │ (内部线程局部变量) │ │ │ └───────────────────────┘ └─────────────────────┘ │ └─────────────────────────────────────────────────────┘
|
引导层
负责服务端/客户端的启动配置,整合底层组件
核心组件
- ServerBootstrap:服务端启动引导类,配置并启动服务端
- Bootstrap:客户端启动引导类,配置并启动客户端
关键方法
- group(EventLoopGroup boss, worker):配置主从线程组
- channel(Class<? extends Channel> channelClass):指定通道实现类
- childHandler(ChannelHandler handler):设置子通道的处理器链
- bind(int port):绑定端口启动服务
示例
1 2 3 4 5 6
| erverBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new MyServerInitializer());
b.bind(8080).sync();
|
事件处理层
- 负责处理网络事件和数据流转,基于责任链模式。
- 责任链模式:将请求的发送者和处理者解耦,建立一条处理器链,让请求依次再链上传递,知道某个处理器处理它
核心组件
- ChannelPipeline:处理器链容器,管理多个 ChannelHandler
- ChannelHandler:事件处理器接口,分为:
- ChannelInboundHandler:处理入站数据(如读取客户端消息)
- ChannelOutboundHandler:处理出站数据(如向客户端发送消息)
- ChannelHandlerContext:处理器上下文,用于在链中传递事件。在自定义处理器中用于传递处理的事件
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class MyServer extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel socketChannel) { ChannelPipeline pipeline = socketChannel.pipeline(); pipeline.addLast(new WebSocketHeartBeatHandler); } }
public class WebSocketHeartbeatHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> { @Override protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame frame) throws Exception { String content = frame.text();
} }
|
网络通信层
负责底层网络通信实现
核心组件
- EventLoopGroup:线程池组,管理多个 EventLoop
- NioEventLoopGroup:基于 Java NIO 的实现
- EpollEventLoopGroup:基于 Linux Epoll 的高性能实现
- EventLoop:单线程事件循环,负责处理一个或多个 Channel 的 IO 操作
- Channel:网络通信通道的抽象,支持:
- NioServerSocketChannel:服务端 NIO 通道
- NioSocketChannel:客户端 NIO 通道
- ByteBuf:高效的字节缓冲区,替代 Java 原生的 ByteBuffer
主从Reactor模式
netty采用的主从Reactor多线程模型时高性能网络编程的核心设计,将连接管理和数据处理分离,实现高并发能力
- 主Reactor:负责接收客户端连接
- 比如Boss Group
- 仅负责 接收客户端的连接请求,不处理任何 IO 读写事件
- 每个 Boss EventLoop 对应一个 Selector,用于监听 ServerSocketChannel 的 ACCEPT 事件
- 接收到连接后,将客户端的 SocketChannel 分配给 Worker Group 处理
- 从Reactor:负责处理已建立连接的读写操作
- 比如Worker Group
- 负责处理 已建立连接的 SocketChannel 的 IO 读写事件(如读数据、写数据、编解码等)
- 每个 Worker EventLoop 对应一个 Selector,用于监听 SocketChannel 的 READ/WRITE 等事件
- 主从都可以使用多线程