Netty学习总结(1)——Netty入门介绍

1.Netty是什么/span>

Netty是一个基于JAVA NIO类库的异步通信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。

2.使用Netty能够做什么/span>

  • 开发异步、非阻塞的TCP网络应用程序;

  • 开发异步、非阻塞的UDP网络应用程序;

  • 开发异步文件传输应用程序;

  • 开发异步HTTP服务端和客户端应用程序;

  • 提供对多种编解码框架的集成,包括谷歌的ProtobufJboss marshallingJava序列化、压缩编解码、XML解码、字符串编解码等,这些编解码框架可以被用户直接使用;

  • 提供形式多样的编解码基础类库,可以非常方便的实现私有协议栈编解码框架的二次定制和开发;

  • 基于职责链模式的Pipeline-Handler机制,用户可以非常方便的对网络事件进行拦截和定制;

  • 所有的IO操作都是异步的,用户可以通过Future-Listener机制主动Get结果或者由IO线程操作完成之后主动Notify结果,用户的业务线程不需要同步等待;

  • IP黑白名单控制;

  • 打印消息码流;

  • 流量控制和整形;

  • 性能统计;

  • 基于链路空闲事件检测的心跳检测

3.Netty在哪些行业得到了应用/span>

  • 互联网行业:随着网站规模的不断扩大,系统并发访问量也越来越高,传统基于TomcatWeb容器的垂直架构已经无法满足需求,需要拆分应用进行服务化,以提高开发和维护效率。从组网情况看,垂直的架构拆分之后,系统采用分布式部署,各个节点之间需要远程服务调用,高性能的RPC框架必不可少,Netty作为异步高性能的通信框架,往往作为基础通信组件被这些RPC框架使用。

典型的应用有:阿里分布式服务框架DubboRPC框架使用Dubbo协议进行节点间通信,Dubbo协议默认使用Netty作为基础通信组件,用于实现各进程节点之间的内部通信。它的架构图如下:

其中,服务提供者和服务消费者之间,服务提供者、服务消费者和性能统计节点之间使用Netty进行异步/同步通信。除了Dubbo之外,淘宝的消息中间件RocketMQ的消息生产者和消息消费者之间,也采用Netty进行高性能、异步通信。

除了阿里系和淘宝系之外,很多其它的大型互联网公司或者电商内部也已经大量使用Netty构建高性能、分布式的网络服务器。

  • 游戏行业:无论是手游服务端、还是大型的网络游戏,Java语言得到了越来越广泛的应用。Netty作为高性能的基础通信组件,它本身提供了TCP/UDPHTTP协议栈,非常方便定制和开发私有协议栈。账号登陆服务器、地图服务器之间可以方便的通过Netty进行高性能的通信,架构示意图如下:

  • 大数据领域:经典的Hadoop的高性能通信和序列化组件AvroRPC框架,默认采用Netty进行跨节点通信,它的Netty Service基于Netty框架二次封装实现。

大数据计算往往采用多个计算节点和一个/N个汇总节点进行分布式部署,各节点之间存在海量的数据交换。由于Netty的综合性能是目前各个成熟NIO框架中最高的,因此,往往会被选中用作大数据各节点间的通信。

  • 企业软件:企业和IT集成需要ESBNetty对多协议支持、私有协议定制的简洁性和高性能是ESB RPC框架的首选通信组件。事实上,很多企业总线厂商会选择Netty作为基础通信组件,用于企业的IT集成。

  • 通信行业:Netty的异步高性能、高可靠性和高成熟度的优点,使它在通信行业得到了大量的应用。

4.使用传统的Socket开发挺简单的,我为什么要切换到NIO进行编程呢/span>

首先我们看下传统基于同步阻塞IO(BIO)的线程模型图:

由上图我们可以看出,传统的同步阻塞IO通信存在如下几个问题:l线程模型存在致命缺陷:一连接一线程的模型导致服务端无法承受大量客户端的并发连接;

  • 性能差:频繁的线程上下文切换导致CPU利用效率不高;

  • 可靠性差:由于所有的IO操作都是同步的,所以业务线程只要进行IO操作,也会存在被同步阻塞的风险,这会导致系统的可靠性差,依赖外部组件的处理能力和网络的情况。

采用非阻塞IONIO)之后,同步阻塞IO的三个缺陷都将迎刃而解:

  • Nio采用Reactor模式,一个Reactor线程聚合一个多路复用器Selector,它可以同时注册、监听和轮询成百上千个Channel,一个IO线程可以同时并发处理N个客户端连接,线程模型优化为1NN < 进程可用的最大句柄数)或者 M : N (M通常为CPU核数+ 1N < 进程可用的最大句柄数)

  • 由于IO线程总数有限,不会存在频繁的IO线程之间上下文切换和竞争,CPU利用率高;

  • 所有的IO操作都是异步的,即使业务线程直接进行IO操作,也不会被同步阻塞,系统不再依赖外部的网络环境和外部应用程序的处理性能。

由于切换到NIO编程之后可以为系统带来巨大的可靠性、性能提升,所以,目前采用NIO进行通信已经逐渐成为主流。

5.为什么不直接基于JDKNIO类库编程呢/span>

来源:科技D人生

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年6月16日
下一篇 2016年6月16日

相关推荐