【说明】本文原载于码农 IO(manong.io)官方微信 developerWorks,转载、引用请注明出处及做者。编程
1.Netty 是什么?服务器
Netty 是一个基于 JAVA NIO 类库的异步通讯框架,它的架构特色是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。微信
2.使用 Netty 可以作什么?网络
-
开发异步、非阻塞的 TCP 网络应用程序;架构
-
开发异步、非阻塞的 UDP 网络应用程序;并发
-
开发异步文件传输应用程序;框架
-
开发异步 HTTP 服务端和客户端应用程序;异步
-
提供对多种编解码框架的集成,包括谷歌的 Protobuf、Jbossmarshalling、Java 序列化、压缩编解码、XML 解码、字符串编解码等,这些编解码框架能够被用户直接使用;分布式
-
提供形式多样的编解码基础类库,能够很是方便的实现私有协议栈编解码框架的二次定制和开发;oop
-
基于职责链模式的 Pipeline-Handler 机制,用户能够很是方便的对网络事件进行拦截和定制;
-
全部的 IO 操做都是异步的,用户能够经过 Future-Listener 机制主动 Get 结果或者由 IO 线程操做完成以后主动 Notify 结果,用户的业务线程不须要同步等待;
-
IP 黑白名单控制;
-
打印消息码流;
-
流量控制和整形;
-
性能统计;
-
基于链路空闲事件检测的心跳检测
……
3.Netty 在哪些行业获得了应用?
-
互联网行业:随着网站规模的不断扩大,系统并发访问量也愈来愈高,传统基于 Tomcat 等 Web 容器的垂直架构已经没法知足需求,须要拆分应用进行服务化,以提升开发和维护效率。从组网状况看,垂直的架构拆分以后,系统采用分布式部署,各个节点之间须要远程服务调用,高性能的 RPC 框架必不可少,Netty 做为异步高性能的通讯框架,每每做为基础通讯组件被这些 RPC 框架使用。
典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通讯,Dubbo 协议默认使用 Netty 做为基础通讯组件,用于实现各进程节点之间的内部通讯。它的架构图以下:
图1-1 Dubbo 节点间调用关系图
其中,服务提供者和服务消费者之间,服务提供者、服务消费者和性能统计节点之间使用 Netty 进行异步/同步通讯。
除了 Dubbo 以外,淘宝的消息中间件 RocketMQ 的消息生产者和消息消费者之间,也采用 Netty 进行高性能、异步通讯。
除了阿里系和淘宝系以外,不少其它的大型互联网公司或者电商内部也已经大量使用 Netty 构建高性能、分布式的网络服务器。
-
游戏行业:不管是手游服务端、仍是大型的网络游戏,Java 语言获得了愈来愈普遍的应用。Netty 做为高性能的基础通讯组件,它自己提供了 TCP/UDP 和 HTTP 协议栈,很是方便定制和开发私有协议栈。帐号登录服务器、地图服务器之间能够方便的经过 Netty 进行高性能的通讯,架构示意图以下:
图1-2 Netty 在游戏服务器架构中的应用
-
大数据领域:经典的 Hadoop 的高性能通讯和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨节点通讯,它的 Netty Service 基于 Netty 框架二次封装实现。
大数据计算每每采用多个计算节点和一个/N个汇总节点进行分布式部署,各节点之间存在海量的数据交换。因为 Netty 的综合性能是目前各个成熟 NIO 框架中最高的,所以,每每会被选中用做大数据各节点间的通讯。
-
企业软件:企业和 IT 集成须要 ESB,Netty 对多协议支持、私有协议定制的简洁性和高性能是 ESB RPC 框架的首选通讯组件。事实上,不少企业总线厂商会选择 Netty 做为基础通讯组件,用于企业的 IT 集成。
-
通讯行业:Netty 的异步高性能、高可靠性和高成熟度的优势,使它在通讯行业获得了大量的应用。
4.使用传统的 Socket 开发挺简单的,我为何要切换到 NIO 进行编程呢?
首先咱们看下传统基于同步阻塞 IO(BIO)的线程模型图:
图1-3 同步阻塞 IO(BIO)线程模型图
由上图咱们能够看出,传统的同步阻塞 IO 通讯存在以下几个问题:
-
线程模型存在致命缺陷:一链接一线程的模型致使服务端没法承受大量客户端的并发链接;
-
性能差:频繁的线程上下文切换致使 CPU 利用效率不高;
-
可靠性差:因为全部的 IO 操做都是同步的,因此业务线程只要进行 IO 操做,也会存在被同步阻塞的风险,这会致使系统的可靠性差,依赖外部组件的处理能力和网络的状况。
采用非阻塞 IO(NIO)以后,同步阻塞 IO 的三个缺陷都将迎刃而解:
-
Nio 采用 Reactor 模式,一个 Reactor 线程聚合一个多路复用器 Selector,它能够同时注册、监听和轮询成百上千个 Channel,一个 IO 线程能够同时并发处理N个客户端链接,线程模型优化为1:N(N < 进程可用的最大句柄数)或者 M : N (M一般为 CPU 核数 + 1, N < 进程可用的最大句柄数);
-
因为 IO 线程总数有限,不会存在频繁的 IO 线程之间上下文切换和竞争,CPU 利用率高;
-
全部的 IO 操做都是异步的,即便业务线程直接进行 IO 操做,也不会被同步阻塞,系统再也不依赖外部的网络环境和外部应用程序的处理性能。
因为切换到 NIO 编程以后能够为系统带来巨大的可靠性、性能提高,因此,目前采用 NIO 进行通讯已经逐渐成为主流。
5.为何不直接基于 JDK 的 NIO 类库编程呢?
咱们经过 JDK NIO 服务端和客户端的工做时序图来回答下这个问题:
图1-4 JDK NIO 服务端建立和通讯序列图
即使抛开代码和 NIO 类库复杂性不谈,一个高性能、高可靠性的 NIO 服务端开发和维护成本都是很是高的,开发者须要具备丰富的 NIO 编程经验和网络维护经验,不少时候甚至须要经过抓包来定位问题。也许开发出一套 NIO 程序须要 1 个月,可是它的稳定极可能须要 1 年甚至更长的时间,这也就是为何我不建议直接使用 JDK NIO 类库进行通讯开发的一个重要缘由。
下面再一块儿看下 JDK NIO 客户端的通讯时序图:它一样很是复杂。
图1-5 JDK NIO 客户端建立和通讯序列图
6.为何要选择 Netty 框架?
Netty 是业界最流行的 NIO 框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是数一数二的,它已经获得成百上千的商用项目验证,例如 Hadoop 的 RPC 框架 Avro 使用 Netty 做为通讯框架。不少其它业界主流的 RPC 和分布式服务框架,也使用 Netty 来构建高性能的异步通讯能力。
Netty 的优势总结以下:
-
API 使用简单,开发门槛低;
-
功能强大,预置了多种编解码功能,支持多种主流协议;
-
定制能力强,能够经过 ChannelHandler 对通讯框架进行灵活的扩展;
-
性能高,经过与其它业界主流的 NIO 框架对比,Netty 的综合性能最优;
-
社区活跃,版本迭代周期短,发现的 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.Netty 和 Mina 我究竟该选择哪一个?
根据个人经验,不管选择哪一个,都是个正确的选择。二者各有千秋,Netty 在内存管理方面更胜一筹,综合性能也更优。可是,API 变动的管理和兼容性作的不是太好。相比于 Netty,Mina 的前向兼容性、内聚的可维护性功能更多,例如 JMX 的集成、性能统计、状态机等。
建议用户能够根据本身对二者的熟悉程度和实际项目需求,作出最佳选择。若是你锁定了二者,自己就意味着你作出了正确选择,不须要再纠结于选择哪一个而和领导、同事吵得面红耳赤。
9.Netty 使用简单吗?
Netty 的基础开发和应用很是简单,开发一个 Echo 服务端只须要 28 行代码,开发对应的 Echo 客户端只须要 26 行代码!
可是,若是你要利用它进行私有协议栈开发、HTTP 服务端和客户端开发等,仍然须要深刻的学习 Netty 的一些高级类库和功能,了解 Netty 的设计原理。只有这样,才能恰到好处的使用 Netty,为项目和公司带来更大的价值。
10.有没有 Netty 相关的书籍供学习和参考?
2014 年5-6 月,中国第一本学习 Netty 的教材《Netty 权威指南》将由电子工业出版社博文视点出版。
全书共 23 个章节,从 JAVA IO 的历史演进讲起,包括 NIO 基础入门、Netty 基础入门、Netty 编解码框架的使用和开发、UDP 开发、异步文件传输、基于 Netty 的异步 HTTP 协议栈开发和应用、半包解码器的定制和使用、私有协议栈的设计和开发、行业应用、架构剖析、核心类库的功能讲解和源码分析等。
不管你是初学者,仍是 NIO 高手,都能从本书中汲取养分,为掌握乃至精通 Netty 提供快捷通道。
11.我是大学毕业生,正在学习 Java,据说掌握 Netty 等 NIO 框架找工做会相对容易一些,是真的吗?
从个人经验和 Netty 行业应用来看,前景无限好!下面咱们经过谷歌搜索简单看下如今市场对 Netty 和 Mina 的需求。
下面是个人一小部分搜索结果:
因为搜索结果太多,我就不一一枚举。市场上对 Netty 和 Mina 的需求很是旺盛,并且相对高端,因此薪水会更高些。例如,深圳某国企开出的薪水在 20W 以上,上不封顶,这足以说明 Netty 的“高大上”。
就我的而言,我无心冒犯或者贬低其它技术,可是,相比于 WEB 前台开发/精通 Spring 框架等,精通和熟悉 Netty 的人毕竟是很是少的。一个缘由是异步网络编程的复杂性,另外一个缘由是中国的 NIO 编程正处于方兴未艾阶段,市场需求在逐渐增大,开始出现井喷。可是精通 NIO 编程和具备相关经验的人太少,致使供需不平衡,这也是最近 Netty 愈来愈火的一个重要缘由,市场需求决定技术导向。