[置顶] Netty学习总结(1)——Netty入门介绍

1.Netty是什么?

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

2.使用Netty可以作什么?

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

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

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

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

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

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

  • 基于职责链模式的Pipeline-Handler机制,用户能够很是方便的对网络事件进行拦截和定制;

  • 全部的IO操做都是异步的,用户能够经过Future-Listener机制主动Get结果或者由IO线程操做完成以后主动Notify结果,用户的业务线程不须要同步等待;

  • IP黑白名单控制;

  • 打印消息码流;

  • 流量控制和整形;

  • 性能统计;

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

3.Netty在哪些行业获得了应用?

  • 互联网行业:随着网站规模的不断扩大,系统并发访问量也愈来愈高,传统基于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进行编程呢?

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

由上图咱们能够看出,传统的同步阻塞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类库编程呢?

咱们经过JDK NIO服务端和客户端的工做时序图来回答下这个问题:

即使抛开代码和NIO类库复杂性不谈,一个高性能、高可靠性的NIO服务端开发和维护成本都是很是高的,开发者须要具备丰富的NIO编程经验和网络维护经验,不少时候甚至须要经过抓包来定位问题。也许开发出一套NIO程序须要1个月,可是它的稳定极可能须要1年甚至更长的时间,这也就是为何我不建议直接使用JDK NIO类库进行通讯开发的一个重要缘由。

下面再一块儿看下JDK NIO客户端的通讯时序图:它一样很是复杂:

6.为何要选择Netty框架?

Netty是业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是数一数二的,它已经获得成百上千的商用项目验证,例如HadoopRPC框架Avro使用Netty做为通讯框架。不少其它业界主流的RPC和分布式服务框架,也使用Netty来构建高性能的异步通讯能力。

Netty的优势总结以下:

  • API使用简单,开发门槛低;

  • 功能强大,预置了多种编解码功能,支持多种主流协议;

  • 定制能力强,能够经过ChannelHandler对通讯框架进行灵活的扩展;

  • 性能高,经过与其它业界主流的NIO框架对比,Netty的综合性能最优;

  • 成熟、稳定,Netty修复了已经发现的全部JDK NIO BUG,业务开发人员不须要再为NIOBUG而烦恼;

  • 社区活跃,版本迭代周期短,发现的BUG能够被及时修复,同时,更多的新功能会被加入;

  • 经历了大规模的商业应用考验,质量获得验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业获得成功商用,证实了它彻底知足不一样行业的商用标准。

正是由于这些优势,Netty逐渐成为Java NIO编程的首选框架。

7.据说Netty各版本的API变化比较频繁,我该如何选择版本?

事实上,Netty各版本之间的API变动并无一些人讲的那么可怕,最大的变动就是3.X系列到4.X/5.X的变动,Netty不只仅重构了包路径,对于以前一直想改可是考虑到前向兼容性没改的类库进行了优化和修改。此次变动的主要缘由是Netty脱离了Jboss独立发展,这对于Netty的长远发展是件好事。

在我看来,Netty4.X系列版本的架构和API设计更加合理,同时,它提供了更多新的特性。所以,我我的建议用户能够选择4.X系列版本,以避免将来升级遇到困难和问题。

对于已经使用3.X系列版本的用户,若是现有功能已经知足需求,短时间内暂时不须要升级。若是须要使用更多新特性和功能,建议在充分评估以后进行升级,这可能须要一些工做量。

因为Netty5最新版本仍处于测试阶段,从学习和研究角度能够试用一下,Netty5相比于Netty4是前向兼容的,所以,将来用户升级到Netty5会更加容易。

8.NettyMina 我究竟该选择哪一个?

根据个人经验,不管选择哪一个,都是个正确的选择。二者各有千秋,Netty在内存管理方面更胜一筹,综合性能也更优。可是,API变动的管理和兼容性作的不是太好。相比于NettyMina的前向兼容性、内聚的可维护性功能更多,例如JMX的集成、性能统计、状态机等。

建议用户能够根据本身对二者的熟悉程度和实际项目需求,作出最佳选择。若是你锁定了二者,自己就意味着你作出了正确选择,不须要再纠结于选择哪一个而和领导、同事吵得面红耳赤。

9.Netty使用简单吗?

Netty的基础开发和应用很是简单,开发一个Echo服务端只须要28行代码,开发对应的Echo客户端只须要26行代码!

可是,若是你要利用它进行私有协议栈开发、HTTP服务端和客户端开发等,仍然须要深刻的学习Netty的一些高级类库和功能,了解Netty的设计原理。只有这样,才能恰到好处的使用Netty,为项目和公司带来更大的价值。

10.有没有Netty相关的书籍供学习和参考?

目前市面上有两本Netty书籍,《Netty in Action》和 《Netty权威指南》。

11.我是大学毕业生,正在学习Java NIO,据说掌握NettyNIO框架对将来找工做颇有帮助?

从个人经验和目前Netty的行业应用状况,确实如此。下面咱们简单看下以Netty招聘为关键字的搜索结果:

随着移动互联网和物联网的发展,Netty在非传统行业的应用也日益普遍,例如手机移动推送服务、智能家具、物联网关等。

相关文章
相关标签/搜索