Netty框架怎么样「Netty框架的使用教程」

netty框架是什么

Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。

Netty 应用非常普遍,目前在 Java 领域里,Netty 基本上成为网络程序的标配了。Netty 框架功能丰富,也非常复杂,今天我们主要分析 Netty 框架中的线程模型,而线程模型直接影响着网络程序的性能

Netty框架怎么样(Netty框架的使用教程)

为什么使用Netty

从官网上介绍,Netty是一个网络应用程序框架,开发服务器和客户端。也就是用于网络编程的一个框架。既然是网络编程,Socket就不谈了,为什么不用NIO呢?

1 NIO的缺点

对于这个问题,之前我写了一篇文章《NIO入门》对NIO有比较详细的介绍,NIO的主要问题是:

NIO的类库和API繁杂,学习成本高,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。

需要熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程非常熟悉,才能写出高质量的NIO程序。

臭名昭著的epoll bug。它会导致Selector空轮询,最终导致CPU 100%。直到JDK1.7版本依然没得到根本性的解决。

2 Netty的优点

相对地,Netty的优点有很多:

API使用简单,学习成本低。

功能强大,内置了多种解码编码器,支持多种协议。

性能高,对比其他主流的NIO框架,Netty的性能最优。

社区活跃,发现BUG会及时修复,迭代版本周期短,不断加入新的功能。

Dubbo、Elasticsearch都采用了Netty,质量得到验证。

Netty架构图

Netty框架怎么样「Netty框架的使用教程」
 

上面这张图就是在官网首页的架构图,我们从上到下分析一下。

绿色的部分Core核心模块,包括零拷贝、API库、可扩展的事件模型。

橙色部分Protocol Support协议支持,包括Http协议、webSocket、SSL(安全套接字协议)、谷歌Protobuf协议、zlib/gzip压缩与解压缩、Large File Transfer大文件传输等等。

红色的部分Transport Services传输服务,包括Socket、Datagram、Http Tunnel等等。

以上可看出Netty的功能、协议、传输方式都比较全,比较强大。

用 Netty 实现 Echo 程序服务端

下面的示例代码基于 Netty 实现了 echo 程序服务端:首先创建了一个事件处理器(等同于 Reactor 模式中的事件处理器),然后创建了 bossGroup 和 workerGroup,再之后创建并初始化了 ServerBootstrap,代码还是很简单的,不过有两个地方需要注意一下。

第一个,如果 NettybossGroup 只监听一个端口,那 bossGroup 只需要 1 个 EventLoop就可以了,多了纯属浪费。

第二个,默认情况下,Netty 会创建“2*CPU 核数”个 EventLoop,由于网络连接与EventLoop 有稳定的关系,所以事件处理器在处理网络事件的时候是不能有阻塞操作的,否则很容易导致请求大面积超时。如果实在无法避免使用阻塞操作,那可以通过线程池来异步处理。

/* 事件处理器 */
final EchoServerHandler serverHandler
    = new EchoServerHandler();
/* boss 线程组 */
EventLoopGroup bossGroup
    = new NioEventLoopGroup( 1 );
/* worker 线程组 */
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 )
                   {
                       ch.pipeline().addLast( serverHandler );
                   }
               } );
    /* bind 服务端端口 */
    ChannelFuture f = b.bind( 9090 ).sync();
    f.channel().closeFuture().sync();
} finally {
    /* 终止工作线程组 */
    workerGroup.shutdownGracefully();
    /* 终止 boss 线程组 */
    bossGroup.shutdownGracefully();
}

/* socket 连接处理器 */
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 是一个款优秀的网络编程框架,性能非常好,为了实现高性能的目标,Netty 做了很多优化,例如优化了 ByteBuffer、支持零拷贝等等,和并发编程相关的就是它的线程模型了。Netty 的线程模型设计得很精巧,每个网络连接都关联到了一个线程上,这样做的好处是:对于一个网络连接,读写操作都是单线程执行的,从而避免了并发程序的各种问题。

文章标题:Netty框架怎么样「Netty框架的使用教程」

文章链接:https://www.linkedcc.com/rjbk/24182

版权声明(详见页尾):本文内容及图片由互联网用户自发投稿贡献,该文观点仅代表作者本人。

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

000-000-000

在线咨询: QQ交谈

邮件:admin@linkedcc.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
【特牛号】企业管理软件资讯平台