关于Netty的书好像就Netty in Action值得一读。最近翻看了下,对Netty的整体结构有了一个概况性了解,实际掌握Netty的话,还需要具体去看下源码以及去实现一些样例,这里还是记录下读完本书后的概括性了解。
Netty是什么
Netty一个高性能网络I/O框架。Java不是提供了NIO库,可以直接使用标准库的相关接口来实现高性能I/O,怎么还需要一个专门的库来做这样的事情呢?
阅读完之后,自己认可的结论是,Netty有下面几个优点或者说特性吧,
- 以一致的接口封装了标准库中的IO/NIO接口
- 封装的接口相较标准库中的更易理解使用
- 实现了高性能的传输处理类,比如
io.netty.channel.epoll
,使用jni实现,比默认的nio性能更好 - 提供了多种连接处理实现类,减少了从零实现这些功能的负担
为什么需要了解Netty呢?Netty实际已经成为了Java网络传输中的一个通用库,分布式网络环境中需要高效的数据传输实现,因此很多上层的框架都应用了Netty,所以有必要学习。一方面便于后续再学习一些上层框架,另一方面如果自己需要实现类似的功能,Netty会是一个必要的工具。
Netty的结构
Netty中的关键构成为,
io.netty.channel.Channel
io.netty.channel.ChannelHandler
io.netty.channel.ChannelFuture
io.netty.channel.EventLoop
io.netty.channel.EventLoopGroup
io.netty.bootstrap.ServerBootstrap
Bootstrap
,EventLoop
, Channel
是Netty的核心。Netty的对IO/NIO的抽象统一也在于这些类的实现。Netty的高性能通过EventLoop
事件循环机制来保证。
使用Netty编码的思路大体为,程序之间的连接建立为Channel
,Channel
需要有对应的数据处理实现ChannelHandler
,Netty提供的异步获取接口为ChannelFuture
。这些逻辑都运行在EventLoop
中。通过Bootstrap
启动这些服务。
具体每一个结构的实现要点,之后具体再看源码来分析。
Netty样例
直接记录书中最一开始的服务端样例,
final EchoServerHandler serverHandler = new EchoServerHandler();
EventLoopGroup group = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(group)
.channel(NioServerSocketChannel.class)
.localAddress(new InetSocketAddress(port))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(serverHandler);
}
}
);
ChannelFuture future = bootstrap.bind().sync();
future.channel().closeFuture().sync();
} finally {
group.shutdownGracefully().sync();
}
上面的片段虽然简单,但也展现了提供一个Netty服务所涉及到的框架性结构。不论Netty是否高性能,单纯接口设计上就挺值得学习。Netty对连接处理的每一步都进行了良好的抽象设计,提供了一致的简洁接口。类似的设计思路,在一些上层系统中也可以借鉴。
书评
Manning出版社的in Action系列通常读完一个感觉,好像什么都说了,但好像也和没说差不多。Netty in Action翻完对整体可以有概况性了解,知道各个构件是为了什么而存在。但是对于其原理实现,书中并没有过多提及。对于Netty来说,应该也足够。这本书只是一个开始,源码阅读与代码实践是后续学习少不了的。