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) // 指定NIO通道
.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 等事件
  • 主从都可以使用多线程