关于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

BootstrapEventLoopChannel是Netty的核心。Netty的对IO/NIO的抽象统一也在于这些类的实现。Netty的高性能通过EventLoop事件循环机制来保证。

使用Netty编码的思路大体为,程序之间的连接建立为ChannelChannel需要有对应的数据处理实现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来说,应该也足够。这本书只是一个开始,源码阅读与代码实践是后续学习少不了的。