最近重新对Netty产生了深入了解学习的兴趣。一方面因为很多关联项目内都应用了Netty,加深对Netty的了解无疑会增加对那些项目的掌握度。另一方面,也想尝试应用Netty来实现一个简单的异步化网关。简单翻阅了Zuul2、Reactive-Netty等项目的代码实现,在网络这一层的处理看上去也没多么复杂,代码也就那样。不过刚好可以结合着这些项目代码来学习实现相关功能,加深对Netty的认知。

首先来看下Netty应用的整体结构。不仅从Zuul2等项目中,在Netty自身提供的例子中也很容易就可以发现。Netty应用的结构是相当类似的,

  • 选择EventLoopGroup实现
  • 通过ChannelInitializer添加ChannelHandler到ChannelPipeline
  • 通过Bootstrap串联起各模块
  • 自主控制的部分主要在于各种参数,以及ChannelHandler的选择与自定义

用简单的例子来分析,例如,

try {
    ServerBootstrap bootstrap = new ServerBootstrap();
    bootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup())
        .channel(NioServerSocketChannel.class)
        .localAddress(new InetSocketAddress(port))
        .childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            public void initChannel(SocketChannel ch) throws Exception {
                ch.pipeline().addLast(new DiscardServerHandler());
            }
        });
    ChannelFuture future = bootstrap.bind().sync();
    future.channel().closeFuture().sync();
} finally {
    group.shutdownGracefully().sync();
}

上述代码已经包含了Netty应用的各要件。真实场景下的代码,首先是将各种参数选择配置化,可以通过配置文件或配置下发的形式进行控制。ChannelInitializer的实现肯定会独立,现实场景的ChannelHandler往往由多个构成,构成逻辑也会比较复杂。Netty内置了不少Handler实现,业务自身在内置实现之外,往往也要实现不少ChannelHandler。有的可能是用于进行数据流转解析,有的是用于实现具体的业务逻辑。

Netty中的Channel、ChannelPipeline、ChannelHandler、EventLoop、EventLoopGroup、Bootstrap等概念定义与目的究竟如何,各自的内部实现与处理流程如何就是后续要一个一个去进行分析的。虽然现在还没有一个很清楚的概念,但若是这些都理清的话,那么单纯使用Netty就不会是什么困难的问题。