面试知识点
Netty与NIO
Netty 是一个基于 Java NIO 构建的高性能、异步事件驱动的网络应用框架。它简化了基于 TCP/UDP 的网络编程,提供了对复杂 I/O 操作(如 HTTP、WebSocket 等协议)的抽象,并内置了高效的线程模型和内存管理机制。
NIO的基本概念和用法
NIO(Non-blocking I/O)是 Java 1.4 引入的新 I/O 模型。在 NIO 中,线程在进行 I/O 操作时不会被阻塞,可以继续执行其他任务。NIO 通过通道(Channel)和缓冲区(Buffer)来进行数据的读写操作,使用选择器(Selector)来实现 I/O 多路复用。
NIO的工作原理
NIO 使用 Selector 来监控多个 Channel 的 I/O 事件,当某个 Channel 上有事件发生时(如可读、可写),Selector 会通知相应的线程进行处理。这样,一个线程可以同时处理多个 Channel 的 I/O 操作,提高了系统的并发处理能力。
// NIO服务器端示例
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress("localhost", 9527));
serverSocketChannel.configureBlocking(false);
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> iter = selectedKeys.iterator();
while (iter.hasNext()) {
SelectionKey selectionKey = iter.next();
if (selectionKey.isAcceptable()) {
register(selector, serverSocketChannel);
}
if (selectionKey.isReadable()) {
serverResponse(byteBuffer, selectionKey);
}
iter.remove();
}
Thread.sleep(1000);
}
Netty 在 NIO 的基础上进行了很多改进,主要体现在以下几个方面:
- 性能优化:Netty 充分利用了 Java 的 Zero-Copy 机制,并且从多种角度降低内存分配和回收的开销。例如,使用池化的 Direct Buffer 等技术,在提高 I/O 性能的同时,减少了对象的创建和销毁。
- 易用性:Netty 提供了更高层次的抽象,封装了底层细节(如线程池、连接池、内存管理)。开发者只需关注业务逻辑,通过 ChannelHandler 处理事件(如连接建立、数据读写)即可。
- 功能扩展:Netty 内置了丰富的编解码器(如 HTTP、WebSocket),支持通过 ChannelFuture 实现异步回调。
Netty的工作原理
Netty 基于 NIO 构建,采用了事件驱动和异步编程模型。它使用 EventLoopGroup 来管理线程,EventLoop 负责处理 Channel 上的 I/O 事件。ChannelPipeline 用于管理 ChannelHandler,ChannelHandler 负责处理具体的业务逻辑。
// Netty服务器端示例
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new FirstServerHandler());
}
})
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);
// 绑定端口并开始接收连接
ChannelFuture f = b.bind(port).sync();
// 等待server socket关闭
f.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
Netty 在 NIO 的基础上进行了封装,通过内存池化和零拷贝优化了 NIO 的性能,提供了更多的高级特性,如心跳检测、断线重连。如果想要快速构建稳定、高性能的网络应用,Netty 是更优选择
分库分表
库内分表,分库分表
ShardingShpere
逻辑表、真实表、绑定表、广播表
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »