
一、前言
随着高并发、低延迟的业务场景增多,传统的 Java BIO(阻塞 IO)模式难以满足性能需求。Java NIO(非阻塞 IO)和 Netty 框架提供了一种高效的网络通信解决方案。本文将带你从 Java NIO 的原理出发,深入剖析 Netty 的高性能设计与实战应用。
二、传统 BIO 的局限
ServerSocket server = new ServerSocket(8080);
Socket client = server.accept(); // 阻塞等待连接
BIO 的问题:
- 每个连接一个线程,线程资源浪费大
- 阻塞式读取,占用线程时间长
- 难以支撑高并发请求
三、Java NIO 的核心组成
Java NIO 引入三大核心组件:
组件 | 说明 |
---|---|
Channel | 数据通道,代替 Socket |
Buffer | 缓冲区,数据读写容器 |
Selector | 多路复用器,监听多个 Channel |
工作机制图(推荐配图):
客户端 ──→ Channel ──→ Selector
↑
注册事件:read、write、connect
一个线程监听多个 Channel,从而实现单线程处理多连接。
四、NIO 示例代码
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(8080));
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
for (SelectionKey key : keys) {
if (key.isAcceptable()) {
SocketChannel client = serverChannel.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
client.read(buffer);
buffer.flip();
client.write(buffer);
}
}
keys.clear();
}
五、Netty 简介
Netty 是基于 NIO 封装的高性能网络通信框架,特点包括:
- 线程模型优化(Reactor 模式)
- 高效内存管理(ByteBuf)
- 支持协议编解码
- 轻松构建 TCP/HTTP/WebSocket 等服务
六、Netty 架构图(建议配图)
客户端请求 ─→ BossGroup(监听端口) ─→ WorkerGroup(处理IO)
↓
ChannelPipeline(处理链)
└→ 编解码器 / 业务逻辑Handler
七、Netty 实战:构建 Echo 服务器
1. 服务端
public class EchoServer {
public static void main(String[] args) throws Exception {
EventLoopGroup boss = new NioEventLoopGroup();
EventLoopGroup worker = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(boss, worker)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new EchoServerHandler());
}
});
ChannelFuture future = bootstrap.bind(8080).sync();
future.channel().closeFuture().sync();
} finally {
boss.shutdownGracefully();
worker.shutdownGracefully();
}
}
}
2. Handler 处理类
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ctx.write(msg); // 直接返回消息
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
ctx.flush(); // 刷出
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
八、Netty 的优势
特性 | 说明 |
---|---|
零拷贝 | 使用 ByteBuf 避免内存复制 |
Reactor 模式 | 多线程并发处理 IO |
编解码支持 | 支持 Protobuf 、HTTP 、WebSocket 等协议 |
灵活扩展 | ChannelPipeline 类似责任链 |
九、性能对比:BIO vs NIO vs Netty(推荐图表)
并发连接数 | BIO 平均响应(ms) | NIO 平均响应(ms) | Netty 平均响应(ms) |
---|---|---|---|
1000 | 150 | 90 | 40 |
10000 | 崩溃 | 400 | 90 |
十、总结
- Java NIO 解决了 BIO 无法支持高并发的瓶颈
- Netty 在此基础上提供了封装良好、易于扩展的框架
- 实战中 Netty 常用于 IM、RPC、网关、IoT、游戏服务器等场景